卷积在图像处理中的应用(转自https://medium.com/@irhumshafkat/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1)
直观理解深度学习的卷积
探索使他们工作的强大视觉层次

近年来强大且多功能的深度学习框架的出现使得可以将卷积层应用到深度学习模型中,这是一项非常简单的任务,通常可以在一行代码中实现。
然而,理解卷积,特别是第一次理解卷积常常会让人感到有些不安,诸如内核,滤波器,通道等都是相互堆叠在一起的。然而,卷积作为一个概念是非常强大和高度可扩展的,在这篇文章中,我们将逐步分解卷积操作的机制,将它与标准的完全连接的网络相关联,并探索它们是如何建立强大的视觉层次结构,使其成为图像的强大特征提取器。
2D卷积:操作
二维卷积是一个相当简单的操作:从一个核心开始,它只是一个小的权重矩阵。该内核在2D输入数据上“滑动”,对当前输入的部分进行元素乘法运算,然后将结果汇总为单个输出像素。

内核为它滑过的每个位置重复此过程,将特征的二维矩阵转换为另一个二维特征矩阵。输出特征实质上是位于输入层上的输出像素的相同位置上的输入特征的加权和(其权重是内核本身的值)。
无论输入特征是否落入这个“大致相同的位置”,直接取决于它是否在产生输出的内核区域。这意味着内核的大小直接决定了在生成新的输出特性时多少个(或几个)输入特征相结合。
这与完全连接的层完全相反。在上面的例子中,我们有5×5 = 25个输入特征,3×3 = 9个输出特征。如果这是一个标准的完全连接图层,那么您将拥有25×9 = 225个参数的权重矩阵,每个输出特征是每个输入特征的加权和。卷积允许我们仅使用9个参数进行这种转换,每个输出特性不是“查看”每个输入特征,而是只是“查看”来自大致相同位置的输入特征。请注意这一点,因为这对我们后面的讨论至关重要。
一些常用的技术
在我们继续之前,绝对值得研究两种卷积层中常见的技术:Padding和Strides。
- 填充:如果您看到上面的动画,请注意,在滑动过程中,边缘基本上会“裁剪掉”,将5×5特征矩阵转换为3×3特征矩阵。边缘上的像素永远不在内核的中心,因为内核没有任何东西可以扩展到边缘之外。这并不理想,因为我们经常希望输出的大小等于输入。

填充做一些非常聪明的事来解决这个问题:用额外的“假”像素(通常值为0,因此经常使用的术语“零填充”)填充边缘。这样,滑动时的内核可以允许原始边缘像素位于其中心,同时延伸到边缘之外的假像素,从而产生与输入相同大小的输出。
- Striding:经常运行卷积图层时,您需要比输入尺寸更小的输出。这在卷积神经网络中是常见的,其中在增加通道数量时空间尺寸的大小减小。实现这一点的一种方法是使用池化层(例如,取每2×2网格的平均值/最大值将每个空间维度减半)。还有一种方法是使用步伐:

迈进的想法是跳过内核的一些幻灯片位置。步骤1意味着选择一个像素,因此基本上每个幻灯片都是标准卷积。步幅2意味着选择幻灯片2像素,跳过过程中的每一张幻灯片,缩小大约2倍,步幅3代表跳过每2张幻灯片,大致缩小3倍,等等。
更为现代化的网络,例如ResNet架构完全放弃了在其内部层中汇集层,在需要减少输出尺寸时采用逐步卷积。
多通道版本
当然,上面的图表仅涉及图像具有单个输入通道的情况。实际上,大多数输入图像都有3个通道,这个数字只会增加你进入网络的深度。一般来说,思考渠道非常容易,因为它是对整个形象的“看法”,强调某些方面而不强调其他方面。

大多数情况下,我们用三个通道处理RGB图像。(信贷:Andre Mouton)

过滤器:内核的集合
所以这就是术语之间的一个关键区别派上用场的地方:而在1通道的情况下,滤波器和内核这两个术语可以互换,在一般情况下,它们实际上很不相同。每个过滤器实际上恰好是一个内核的集合, 与存在是为每一个输入信道到第1级的内核,并且每个内核是唯一的。
卷积图层中的每个滤镜都会产生一个且只有一个输出通道,并且它们是这样做的:
过滤器的每个内核在各自的输入通道上“滑动”,产生每个处理版本。一些内核可能比其他内核具有更强的权重,以便比某些内核更强调某些输入通道(例如,过滤器可能具有比其他内核通道权重更大的红色内核通道,因此,对红色通道功能的差异的反应比其他)。

然后将每个通道处理的版本汇总在一起形成一个通道。过滤器的内核每个产生一个版本的每个通道,并且整个过滤器产生一个整体输出通道。

最后,这里有一个偏向的术语。这里偏置项的工作方式是每个输出滤波器都有一个偏置项。到目前为止,偏置被添加到输出通道以产生最终输出通道。

在单个滤波器的情况下,任何数量的滤波器的情况都是相同的:每个滤波器使用其自己的不同的内核集合和具有上述过程的标量偏差来处理输入,从而产生单个输出通道。然后将它们连接在一起以产生总体输出,其中输出通道的数量是过滤器的数量。然后通常应用非线性,然后将其作为输入传递给另一个卷积层,然后重复此过程。
2D卷积:直觉
卷积仍然是线性变换
即使使用卷积层的机制,仍然很难将其与标准的前馈网络联系起来,但它仍不能解释为什么卷积缩放到,并且对图像数据的工作更好。
假设我们有一个4×4的输入,并且我们想把它转换成一个2×2的网格。如果我们使用的是前馈网络,我们会将4×4输入重塑为一个长度为16的矢量,并将其通过一个具有16个输入和4个输出的密集连接层。可以将一个图层的权重矩阵W可视化:

总而言之,大约有64个参数
尽管卷积核函数起初看起来有点奇怪,但它仍然是一个具有等价变换矩阵的线性变换。如果我们在整形的4×4输入上使用大小为3 的内核K来获得2×2的输出,那么等价变换矩阵可能是:

这里只有9个参数。
(注意:虽然上面的矩阵是一个等价的变换矩阵,但实际操作通常是作为一个非常不同的矩阵乘法实现的)[2])
整体而言,卷积仍然是一种线性变换,但同时它也是一种截然不同的变换。对于一个有64个元素的矩阵,只有9个参数可以重复使用几次。每个输出节点只能看到一定数量的输入(内核中的输入)。与任何其他输入都没有交互,因为它们的权重设置为0。
将卷积运算看作权重矩阵的硬先验很有用。在此情况下,我之前的意思是预定义的网络参数。例如,当您使用预训练模型进行图像分类时,可以使用预训练的网络参数作为您的最终密集连接图层的特征提取器。
从这个意义上说,为什么两者都如此高效(与他们的选择相比)之间存在直接的直觉。与随机初始化相比,传输学习效率高达数量级,因为您只需要优化最终完全连接层的参数,这意味着您可以获得梦幻般的性能,每个类只有几十个图像。
在这里,您不需要优化所有64个参数,因为我们将其中的大部分参数设置为零(并且它们将保持这种方式),其余的我们转换为共享参数,从而仅优化9个实际参数。这个效率很重要,因为当你从MNIST的784个输入移动到真实世界的224×224×3图像时,这就超过了150,000个输入。试图将输入减半到75,000个输入的密集层仍然需要超过100 亿个参数。为了比较,ResNet-50 的整个参数大约有2500万个。
因此,将一些参数固定为0,并绑定参数会提高效率,但与传输学习案例不同的是,我们知道先验是好的,因为它适用于大量通用图像,我们怎么知道这有什么好处呢?
答案在于先验的特征组合导致参数学习。
局部性
在本文早期,我们讨论了这一点:
- 内核仅将来自小局部区域的像素组合为输出。也就是说,输出功能只能“看到”来自小局部区域的输入功能。
- 内核在整个图像中被全局应用以产生输出矩阵。
因此,从网络的分类节点一路回传,内核具有学习权重的有趣任务,以仅从一组本地输入中产生特征。此外,由于内核本身应用于整个映像,内核学习的功能必须足够普遍以来自映像的任何部分。
如果这是其他类型的数据,例如。应用程序的分类数据安装,这将一直是个灾难,只是因为你的号码应用安装和应用型列彼此相邻,并不意味着他们有任何“本地,共享功能”共同使用的应用程序安装日期和使用时间。当然,这四者可能有一个潜在的更高层次的特征(例如,人们最想要的应用程序),但是这使我们没有理由相信前两者的参数与后两者的参数完全相同。这四人可能已经以任何(一致)的顺序,并仍然有效!
然而,像素总是以一致的顺序出现,并且附近的像素影响像素,例如,如果所有附近的像素都是红色的,则像素很可能也是红色的。如果存在偏差,这是一个有趣的异常,可以转换成一个特征,所有这一切都可以通过比较一个像素与其邻居以及其本地的其他像素来检测。
这个想法实际上是许多早期的计算机视觉特征提取方法的基础。例如,对于边缘检测,可以使用Sobel边缘检测滤波器,这是一种具有固定参数的内核,与标准单通道卷积一样工作:

应用垂直边缘检测器内核
对于包含非边的网格(例如背景天空),大多数像素是相同的值,因此内核在该点的总输出为0.对于具有垂直边缘的网格,边缘左侧和右侧的像素,内核计算出该差值为非零值,激活并显示边缘。内核一次只能处理3×3的网格,检测局部范围内的异常,但在整个图像中应用时,足以在图像中的任意位置检测全局范围内的某个特征!
因此,我们与深度学习的关键区别在于问这个问题:可以学习有用的内核吗?对于在原始像素上运行的早期图层,我们可以合理地期望具有相当低级特征的特征检测器,如边缘,线条等。
有一整套深度学习研究集中于使神经网络模型可解释。使用优化的特征可视化是最强大的工具之一[3]。核心思想很简单:优化图像(通常用随机噪声初始化)以尽可能强烈地激活滤镜。这确实具有直观的意义:如果优化后的图像完全充满了边缘,这就是过滤器本身正在寻找并被激活的有力证据。使用这个,我们可以窥探学到的过滤器,结果令人惊叹:

从GoogLeNet [3]的第一个卷积层的3个不同通道的特征可视化。注意,尽管它们检测不同类型的边缘,但它们仍然是低级边缘检测器。

从第二和第三卷积中可视化通道12 [3]
这里需要注意的一件重要事情是,卷积图像仍然是图像。图像左上方的小网格像素的输出仍然位于左上角。因此,您可以在另一个上面运行另一个卷积图层(例如左侧的两个卷积图层)以提取更深层的特征,这些特征是我们可视化的。
然而,无论我们的特征探测器的深度如何,没有任何进一步的改变,它们仍然会在非常小的图像块上运行。无论您的探测器有多深,都无法从3×3网格中探测到面部。这就是接受领域的想法出现的地方。
接受领域
任何CNN架构的基本设计选择是,从网络的开始到结束,输入尺寸越来越小,同时通道数量也越来越多。如前所述,这通常是通过步骤或合并层完成的。局部性决定输出结果来自前一层的输入。接受区域决定了输出到达整个网络的原始输入区域。
分步卷积的思想是我们只处理幻灯片一个固定的距离,并跳过中间的幻灯片。从另一个角度来看,我们只保留输出相距固定的距离,并去除其余部分[1]。

3×3卷积,步幅2
然后,我们将非线性应用于输出,并按照惯例,然后在顶部堆叠另一个新的卷积层。这就是事情变得有趣的地方。即使我们将具有相同局部区域大小的相同大小的核(3×3)应用于逐步卷积的输出,内核也将具有更大的有效感受域:

这是因为交错层的输出仍然代表相同的图像。它不是调整大小,而是调整大小,只是输出中的每个单个像素都是来自原始输入的相同粗略位置的更大区域(其他像素被丢弃)的“代表”。因此,当下一层的内核在输出上运行时,它会对从更大区域收集的像素进行操作。
(注意:如果你熟悉扩张的卷积,注意上述不是扩张的卷积,两者都是增加感受野的方法,但是扩张的卷积是单层的,而这是发生在一个规则的卷积之后卷积,其间具有非线性)

特征可视化来自每个主要卷积块集合的信道,显示出复杂性逐渐增加[3]
接受域的这种扩展允许卷积层将低级特征(线,边)组合成更高级的特征(曲线,纹理),就像我们在混合3a层看到的一样。
接下来是一个池/跨层,网络继续为更高层次的特征(零件,模式)创建探测器,就像我们看到的混合4a一样。
整个网络图像大小的重复减少导致第5块卷积,输入尺寸仅为7×7,而输入尺寸为224×224。此时,每个单个像素代表一个32×32像素的网格,这是巨大的。
与早期的图层相比,激活意味着要检测边缘,在这里,微小的7×7网格上的激活是非常高级的特征之一,例如鸟类。
整个网络从少量滤波器(GoogLeNet中的64个),检测低级特征,到大量滤波器(最终卷积中的1024个),每个滤波器都寻找一个非常特定的高级特征。随后是最终的合并图层,将每个7×7网格折叠为一个像素,每个通道都是一个特征检测器,具有与整个图像相同的接受区域。
与标准的前馈网络所做的相比,这里的输出真是令人惊叹。一个标准的前馈网络将产生抽象的特征向量,从图像中的每个单一像素的组合,需要难以处理的数据量进行训练。
美国有线电视新闻网在开始学习非常低级别的特征探测器的同时,开始学习非常低层次的特征探测器,并且随着其接受范围的扩大,学习将这些低级特征结合到逐步升级的特征中; 不是每个像素的抽象组合,而是一个强大的视觉层次的概念。
通过检测低级特征,并使用它们来检测更高级别的特征,随着它进入其视觉层次结构,它最终能够检测整个视觉概念,例如脸部,鸟类,树木等,这就是使它们如此强大的原因高效的图像数据。
关于对抗性攻击的最后说明
随着视觉层次CNN的构建,假设他们的视觉系统与人类相似是相当合理的。他们对真实世界的图像非常棒,但他们的失败方式也强烈暗示他们的视觉系统并不完全像人类一样。最主要的问题:敌对案例[4],为了欺骗这个模型而特意修改过的例子。

对于一个人来说,这两张图片显然都是熊猫。对这个模型来说,没有那么多。[4]
如果造成模型失败的唯一被篡改的模型就是人类会注意到的模型,那么敌对的例子就不是问题。问题在于,这些模型容易受到仅仅被轻微篡改的样本的攻击,并且显然不会欺骗任何人。这为模型悄无声息地打开了大门,对于从自动驾驶汽车到医疗保健等各种应用而言,这可能非常危险。
针对敌对攻击的稳健性是当前非常活跃的研究领域,是许多论文甚至竞争的主题,解决方案肯定会提高CNN架构的安全性和可靠性。
结论
CNN是允许计算机视觉从简单应用扩展到为复杂产品和服务提供支持的模型,从照片库中的人脸检测到更好的医疗诊断。它们可能是未来计算机视觉领域的关键方法,或者其他一些新的突破可能就在眼前。无论如何,有一件事是肯定的:它们无可估量,是当今许多创新应用程序的核心,而且绝对值得深入理解。
参考
- 深度学习的卷积算法指南
- 用于视觉识别的CS231n卷积神经网络 - 卷积神经网络
- 特征可视化 - 神经网络如何增强他们对图像的理解(注意:这里的特征可视化是用Lucid库生成的,这是本期刊文章中技术的开源实现)
- 敌对机器进攻机器学习
更多资源
卷积在图像处理中的应用(转自https://medium.com/@irhumshafkat/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1)的更多相关文章
- 卷积网络中的通道(Channel)和特征图
转载自:https://www.jianshu.com/p/bf8749e15566 今天介绍卷积网络中一个很重要的概念,通道(Channel),也有叫特征图(feature map)的. 首先,之前 ...
- AI芯片:高性能卷积计算中的数据复用
随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...
- 理解卷积神经网络中的channel
在一般的深度学习框架的 conv2d 中,如 tensorflow.mxnet,channel 都是必填的一个参数 在 tensorflow 中,对于输入样本中 channels 的含义,一般是RGB ...
- CVPR2020:点云分析中三维图形卷积网络中可变形核的学习
CVPR2020:点云分析中三维图形卷积网络中可变形核的学习 Convolution in the Cloud: Learning Deformable Kernels in 3D Graph Con ...
- 卷积神经网络中的channel 和filter
在深度学习的算法学习中,都会提到 channels 这个概念.在一般的深度学习框架的 conv2d 中,如 tensorflow .mxnet,channels 都是必填的一个参数. channels ...
- 深度学习卷积网络中反卷积/转置卷积的理解 transposed conv/deconv
搞明白了卷积网络中所谓deconv到底是个什么东西后,不写下来怕又忘记,根据参考资料,加上我自己的理解,记录在这篇博客里. 先来规范表达 为了方便理解,本文出现的举例情况都是2D矩阵卷积,卷积输入和核 ...
- 卷积神经网络中的Winograd快速卷积算法
目录 写在前面 问题定义 一个例子 F(2, 3) 1D winograd 1D to 2D,F(2, 3) to F(2x2, 3x3) 卷积神经网络中的Winograd 总结 参考 博客:blog ...
- [转帖]在 k8s 中自动为域名配置 https
在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...
- 卷积神经网络中的通道 channel
卷积神经网络中 channels 分为三种: (1):最初输入的图片样本的 channels ,取决于图片类型,比如RGB, channels=3 (2):卷积操作完成后输出的 out_c ...
随机推荐
- thinkphp5 与 endroid 二维码生成
windows compser安装endroid/qrcode,自己安装好composer工具; 1. 项目目录 文件 composer.json require 里添加 "endroid/ ...
- BZOJ 4584 luogu P3643: [Apio2016]赛艇
4584: [Apio2016]赛艇 Time Limit: 70 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在首尔 ...
- 微信小程序 支付功能 服务器端(TP5.1)实现
首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 <?php n ...
- React更新元素 基础
React元素创建后无法修改其内容和属性.唯一的办法是创建新的元素,传入ReactDOM.render()方法 三种实现形式: 1.整体替换 function tick () { const ele= ...
- 目标检测框架py-faster-rcnn修改anchor_box
众所周知,anchor_box控制了回归框的大小,我们有时候检测的是大物体或小物体时,需要调整回归框的大小的时候,得改一下anchor_box.基于rgb公开的py-faster-rcnn修改anch ...
- JavaScript学习-4——DOM对象、事件
本章目录 --------window对象 --------document对象 --------事件 一.window对象 函数调用: 自己封装的函数只写:函数名(): 数学函数Math 例:绝对值 ...
- CentOS 7 无法yum安装解决方法
1)下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7.repo 2)备份并替换系统的repo文件 .repo /etc/yum.repos.d ...
- ReactiveX 学习笔记(24)使用 RxCpp + C++ REST SDK 调用 REST API
JSON : Placeholder JSON : Placeholder (https://jsonplaceholder.typicode.com/) 是一个用于测试的 REST API 网站. ...
- servlet 最大线程数探索笔记
servlet默认是单例模式的,所以是单例多线程的.如果实现了singleservlet是可以多个servlet实例,下面是一个servlet的请求生命周期 1 客户端请求该 Servlet:加载 S ...
- oracle 连接字符串的问题
未指定的错误,发生了一个 Oracle 错误,但无法从 Oracle 中检索错误信息.数据类型不被支持. 原因是你用的ADO for ORACLE的驱动是微软的Microsoft OLE DB ...