【卷积神经网络】卷积神经网络(Convolutional Neural Networks, CNN)基础

卷积神经网络(Convolutional Neural Networks, CNN),是一种 针对图像 的特殊的 神经网络

卷积神经网络概述

Why not DNN?

图像数据的维数很高,比如 1,000×1,000大小的彩色图像对应于1000×1000×3=300w维的特征。如果继续沿用 常规的全连接网络,会导致 巨大的参数量【第一个隐层中每一个单独的全连接神经元就有300w个权重】。巨大的参数量意味着 繁重的计算,而更重要的是,会有 很高的过拟合风险

CNN是什么?在图像问题上有什么优势?

卷积神经网络基于图像数据的特点,向结构中添加了一些特殊的性质【局部连接,参数共享,从而 在图像问题上获得不小的优势大幅度降低了网络中参数的数量,使得 前向传播更高效,同时又 保持了很高的网络容量

和常规神经网络相似,卷积神经网络同样

  • 是由神经元组成,每个神经元都有学习能力【神经元的权重和偏差参数都是可学习的】。
  • 每个神经元的计算方式,同样是 ①得到一些输入数据,进行 ②内积运算 后,再进行 ③激活函数运算
  • 整个网络依旧是一个 可导的 映射函数:函数的输入是原始的图像像素,输出是不同类别的评分(对于分类任务而言)或是(对于回归任务的输出是什么?)。
  • 在常规神经网络中我们实现的各种技巧和要点依旧适用于卷积神经网络

如下图所示,左边是一个3层的全连接网络。右边是一个卷积神经网络。
在这里插入图片描述
卷积神经网络的各层的数据体和神经元是按照 宽度高度深度 3维排列的(这里的深度指的是数据体的第三个维度,而不是整个网络的深度,整个网络的深度指的是网络的层数)。比如,输入层为输入图像,所以它的宽度和高度就是图像的宽度和高度,它的深度为3,代表了红、绿、蓝3种颜色通道。

用来构建卷积网络的各种层

卷积神经网络一般由三种类型的层构成

  • 卷积层(Convolution Layer)
  • 池化层(Pooling Layer)
  • 全连接层(Fully Connected Layer,和常规神经网络中的一样)

1)卷积层(Convolution Layer)

卷积层是卷积神经网络的核心。

卷积层中的神经元——过滤器

卷积层是由 一些 (a set of) 可学习的过滤器(filter,也叫做 卷积核,convolution kernel)构成的。每个过滤器在 空间上(宽度,高度) 比较小,在 深度上 和输入数据一致

举个例子,卷积神经网络第一层的一个典型的过滤器的尺寸可以是5x5x3(宽高都是5像素,深度是3是因为彩色图像有RGB3个颜色通道)。

过滤器的计算方式——卷积

在前向传播的时候,每个过滤器会在输入数据的宽度和高度方向上 滑动,计算整个过滤器和输入数据每一处的 点积,得到一个 2维激活图(activation map)

卷积层的卷积 和 数学教材中的卷积 是什么关系? 基本没有关系。卷积层中的卷积实质是输入和权值的 互相关(cross-correlation)函数,而不是数学教材中的卷积。

简单的卷积运算流程如下图所示,蓝色的输入数据和红色的过滤器逐元素相乘,然后求其总和,最后加上偏差,得到了绿色的输出激活数据的单个值,如此循环。
在这里插入图片描述

过滤器的作用

简单来讲,每个过滤器都是一种 特征的提取器,就像一个筛子,将图像中符合条件的部分筛选出来。激活图表示 过滤器在每个空间位置处的响应情况,激活值越大说明越符合条件。

具体的视觉特征可能是 某些方位上的边界【比如垂直边缘、水平边缘】,或者 某些颜色的斑点,甚至可以是 更高层的网络 上的蜂巢状或者车轮状图案。

在每个卷积层上,我们会使用不止一个过滤器【比如12个】,来同时提取不同的特征【比如水平边缘和垂直边缘等】。每个过滤器都会生成一个不同的二维激活图,这些激活图 在深度方向上堆叠,从而构成了输出。

卷积层神经元和常规神经元的对比

我们可以将输出的3维数据中的每个数据点看做是单个神经元的输出,而该神经元 只观察输入数据中的一小部分,并且和空间上左右两边的所有神经元 共享参数(这些数字都是使用同一个过滤器得到的结果)。

局部连接:

在全连接层中,每个神经元都是与前一层中的所有神经元的输出通过权重完全连接的。而在处理图像这样的高维度数据时,这显然是不现实的,考虑到(基于假设)

  1. 整张图像中,关键性的图像特征、边缘、角点等往往只占据一小部分
  2. 图像中 相距很远的像素的相关性 很小

因此,在卷积层中,每个输出神经元 深度方向 保持全连接,而 空间方向 上只和一小部分的神经元的输出相连。这个连接空间的大小也就是 过滤器尺寸(filter size),是一个超参数。

在这里插入图片描述

参数共享:

作一个合理的假设,如果一组权值可以 在图像中某个区域 提取出有效的表示,那么它们也能 在图像的另外区域 中提取出有效的表示。即如果一个模式(pattern)出现在图像中的某个区域,那么它们也可以出现在图像中的其他任何区域。

因此,卷积层不同空间位置的神经元 共享权值,用于发现图像中不同空间位置的模式

通过局部连接和参数共享,我们可以 显著地减少参数量,同时仍然能 保持很高的网络容量(capacity)

卷积层的四个超参数

一个卷积层有四个超参数(由四个超参数所确定),它们控制着输出数据体的尺寸。

1、过滤器个数 K

一个过滤器对输入进行卷积会得到一个二维的特征图(feature map)。我们可以同时使用多个过滤器对输入进行卷积,以提取多个特征的特征图。输出数据体的深度等于使用的过滤器的个数

2、步长 S S S (stride)

在滑动过滤器的时候,必须指定步长 s s s,即每移动 s s s个像素得到一个输出值。

  • 步长为1,过滤器每次移动1个像素。
  • 步长为2,过滤器滑动时每次移动2个像素。这个操作会让输出数据体在空间上变小。
  • 3或者更大的步长在实际中很少使用
3、填充 P P P (padding)

我们知道,如果用一个3×3的过滤器卷积一个6×6的图像,最后会得到一个4×4的输出,这样的话会有 两个缺点

  1. 每次做卷积操作,图像就会缩小。比如从6×6缩小到4×4,做了几次之后,图像就会变得很小了。
  2. 角落边缘的像素只被一个输出所触碰或者使用,而中间的像素点会有许多输出区域与之重叠,所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着会 丢失图像边缘位置的许多信息

因此,我们可以 在卷积之前填充这幅图像 来控制输出数据体的空间尺寸。

在输入矩阵的边缘使用0进行填充(zero-padding) 是很方便的。

至于填充多少像素,通常有两种策略,分别叫做 Valid卷积Same卷积

  • Valid卷积:也就是不填充
  • Same卷积:也就是确保输出大小和输入大小满足步长倍数的关系【 n o u t = n i n / S n_{out}=n_{in}/S nout=nin/S】,特殊的,当 S=1 时,输出和输入大小相同。

关于TensorFlow的padding操作是如何补充0的
Tensorflow:padding操作

4、过滤器尺寸 F F F (filter size)

为什么CNN中的卷积核一般都是奇数 * 奇数,没有偶数 * 偶数的? - 知乎

过滤器在空间上局部连接的大小。一般都是为奇数【3×3最常见,也有5×5,7×7的,以及特殊的1×1】,这是因为:

  1. 奇数的 F 有中心点(central pixel),方便进行中心定位
  2. 关系到 padding 的对称性。即进行 Same卷积 时,只有 F 是奇数,才能保证图像两边的 padding 是 对称,自然 的,而不是像左边填充多一点,右边填充小一点这样子【Valid卷积 (no padding) 不需要考虑这个问题】。
如何合理设置超参数?

过滤器个数 K 的选择影响的是输出的通道数,比较简单,没什么约束条件。主要是空间尺寸上的超参数S, P, F,彼此之间是相互限制的。

输出数据体空间尺寸的计算公式

假设输入数据体的空间形状为正方形,即高宽相等,均为 W W W,过滤器尺寸为 F F F,步长为 S S S,(单侧) 零填充的数量为 P P P ,那么输出数据体的空间尺寸为 ( W − F + 2 P ) / S + 1 (W-F +2P)/S+1 (WF+2P)/S+1

S = 1 S=1 S=1 时,通过设定 P = ( F − 1 ) / 2 P=(F-1)/2 P=(F1)/2, 可以保证输入输出空间大小相同。例如,3*3的卷积需要填补一个像素使得输入输出空间大小不变。

  • 举例来说,当输入尺寸 W = 10 W=10 W=10,不使用零填充则 P = 0 P=0 P=0,过滤器尺寸 F = 3 F=3 F=3,这样步长 S = 2 S=2 S=2 就行不通,因为 ( W − F + 2 P ) / S + 1 = 4.5 (W-F +2P)/S+1 = 4.5 (WF+2P)/S+1=4.5结果不是整数,这就是说神经元不能整齐对称地滑过输入数据体
  • 可以通过 修改零填充值,或者 修改过滤器尺寸 来让设置合理,或者其他什么措施。
  • 我们需要合理地设置网络的尺寸让每一层都能正常工作

通过卷积层和池化层后输出大小怎么得出

如果不能整除怎么办?

特殊的1x1卷积

一文读懂卷积神经网络中的1x1卷积核

1x1卷积,其实就是 对数据体每个空间位置处的D维向量做一个相同的变换【线性变换(+ 非线性激活)】
在这里插入图片描述
1x1卷积作用

  • 不改变数据体的空间尺寸,仅在通道方向上进行升维或者降维(跨通道信息融合)
  • 增加非线性

1x1卷积具体应用

inception
resnet

1×1卷积是 减少网络参数和计算量 的重要方式。

在输入数据体空间大小为1×1的情况下(比如1×1×N),1×1卷积的作用相当于全连接层。

卷积的深入理解

卷积结果的两种视角(解释)

卷积的输出是一个D×H×W的三维张量。其可以被认为是有D个通道,每个通道是一个二维的特征图,反映了从一张提取到的某种的特征的分布。也可以被认为是一张图有H×W个空间位置,每个空间位置是一个D维的描述向量,描述了对应感受野的图像局部区域的语义特征

② 卷积神经元和语义概念的“多对多”映射关系

卷积结果的各通道之间不是独立的卷积结果的各通道的神经元和语义概念之间是一个“多对多”的映射。即,每个语义概念由多个通道神经元一起表示,而每个神经元又同时参与到多个语义概念中去。并且,神经元响应是稀疏的,即大部分的神经元输出为0。

每层卷积层到底学到了什么?卷积层特征从低层次到高层次的递进

通过卷积,我们可以捕捉到图像的特征信息。通过多层卷积层堆叠,每层捕捉到的特征也是从低级【】

模型低层捕捉输入的不同部分之间的高级关系【如边缘和模式】,高层捕捉有助于做出最终决策的信息,通常能够帮助在想要的输出间进行区分【低层用于感知,高层用于决策】。

逐渐由边缘、纹理、方向等低级特征过渡到文字、车轮、人脸等更复杂的高级特征

有些人利用特定技术将卷积层学到的东西可视化,这能够帮助我们更好地了解工作原理

在这里插入图片描述
CNN可视化最新研究方法进展(附结构、算法)
卷积神经网络CNN:Tensorflow实现(以及对卷积特征的可视化)
CNN可视化/可解释性
利用可视化方法直观理解CNN

2)池化层(Pooling Layer)

池化层,也叫汇聚层。

通常,在连续的卷积层之间会周期性地插入一个池化层,对特征图进行下采样, 在保留有用信息的同时降低数据体的空间尺寸

和卷积层不同,池化层不包含需要学习的参数
在这里插入图片描述
在这里插入图片描述
常见的池化函数有 最大池化(max pooling)平均池化(average pooling) ,还可以使用其他的函数,比如L-2范式池化(L2-norm pooling)等 。最大池化在一个区域中选择 最大值 作为输出,而平均池化是计算一个区域的 均值 作为输出。

另外池化又分为 针对局部区域的局部区域池化(local pooling)针对全图的全局池化(global pooling)

局部区域池化 中最大池化用得更多【实践证明,最大池化的效果比平均池化要好】。最常见的形式是使用尺寸F=2的过滤器,以步长为S=2来对每个深度切片进行降采样,将其中75%的激活信息都丢掉。另外还有一种是 F=3,S=2的,叫 重叠池化(overlapping pooling)

全局池化 是一般是将最后一层卷积得到的 W × H × C W×H×C W×H×C 的feature map输入转化为 1 × 1 × C 1×1×C 1×1×C的 输出,其中 全局平均池化(global average pooling) 最为常用。

深度学习: global pooling (全局池化)

Global Average Pooling全局平均池化的一点理解

池化层的反向传播

回顾一下反向传播的内容,其中max(x,y)函数的反向传播可以简单理解为将梯度只沿最大的数回传。因此,在向前传播经过池化层的时候,通常会把池中最大元素的索引记录下来(有时这个也叫作道岔(switches)),这样在反向传播的时候梯度的路由就很高效。

池化层的作用

池化层主要有以下三点作用:

  1. 增加特征平移不变性。池化可以提高网络对微小位移的容忍能力
  2. 减小特征图大小。汇合层对空间局部区域进行下采样,使下一层需要的参数量和计算量减少,并降低过拟合风险
  3. 最大池化可以带来非线性。这是目前最大汇合更常用的原因之一。

缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。

不使用池化层:

很多人不喜欢池化操作,认为可以不使用它。比如在《Striving for Simplicity: The All Convolutional Net》一文中,提出使用一种只有重复的卷积层组成的结构,抛弃池化层。通过 在卷积层中使用更大的步长(比如步长为2)来代替池化层降低数据体的尺寸

有发现认为,在训练一个良好的生成模型时,弃用池化层能够更好训练。比如变化自编码器(VAEs:variational autoencoders)和生成性对抗网络(GANs:generative adversarial networks)。现在看起来,未来的卷积网络结构中,可能会很少使用甚至不使用池化层。

3)全连接层

在全连接层中,神经元对于前一层中的所有激活数据是全部连接的,这个常规神经网络中一样。

全连接层的作用 个人理解是建立不同区域间的连接关系

卷积层怎么和全连接层连到一起的? 直接把卷积层输出的三维数据体reshape成一维的

归一化层

卷积神经网络结构

卷积神经网络通常由三种层构成:卷积层,池化层(除非特别说明,一般就是最大值池化)和全连接层(简称FC)。激活函数也算是一层,它逐元素地进行激活函数操作。

下面来看看在卷积神经网络中这些层通常是如何组合在一起的。

不同层的组合排列规律

卷积神经网络 最常见的形式 就是将若干个 卷积层 + ReLU层 的组合 放在一起,然后跟一个池化层,重复如此直到图像在空间上被缩小到一个足够小的尺寸,在某个地方过渡成成全连接层也较为常见。最后的全连接层得到输出,比如分类评分等

最常见的卷积神经网络结构 如下:

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC

其中,* 指的是重复次数,POOL? 指的是一个可选的池化层。其中 N >=0,通常 N<=3, M>=0, K>=0 ,通常 K<3。例如,下面是一些 常见的网络结构规律

  • INPUT -> FC,实现一个线性分类器,此处N = M = K = 0。
  • INPUT -> CONV -> RELU -> FC
  • INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC。此处在每个池化层之间有一个卷积层。
  • INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC。此处每个池化层前有两个卷积层,这个思路适用于更大更深的网络,因为在执行具有破坏性的池化操作前,多重的卷积层可以从输入数据中学习到更多的复杂特征。

层的尺寸设置规律

网络层尺寸的一般设置规则:

输入层(包含图像的)应该能被2整除很多次。常用数字包括32(比如CIFAR-10),64,96(比如STL-10)或224(比如ImageNet卷积神经网络),384和512。

卷积层 应该使用小尺寸过滤器(比如3x3或最多5x5),使用步长S=1。还有一点非常重要,就是对输入数据进行零填充,这样卷积层就不会改变输入数据在空间维度上的尺寸,一般对于任意F,当P=(F-1)/2的时候能保持输入尺寸。如果必须使用更大的过滤器尺寸(比如7x7之类),通常只用在第一个面对原始图像的卷积层上。

池化层 最常用的设置是用用 2x2 感受野(即F=2)的最大值池化,步长为2(S=2)。注意这一操作将会把输入数据中75%的激活数据丢弃(因为对宽度和高度都进行了2的降采样)。另一个不那么常用的设置是使用3x3的感受野,步长为2。最大值池化的感受野尺寸很少有超过3的,因为池化操作过于激烈,易造成数据信息丢失,这通常会导致算法性能变差

几个小过滤器卷积层的组合比一个大过滤器卷积层好:

  • 比如重叠了3个3x3的卷积层和单独使用7x7的感受野的卷积层,两种情况对输入数据体都有7x7的视野。
  • 但是,多个卷积层与非线性的激活层交替的结构,比单一卷积层的结构更能提取出深层的更好的特征
  • 其次,假设所有的数据有 C C C 个通道,那么单独的7x7卷积层将会包含 C × ( 7 × 7 × C ) = 49 C 2 C×(7×7×C)=49C^2 C×(7×7×C)=49C2个参数,而3个3x3的卷积层的组合仅有 3 × ( C × ( 3 × 3 × C ) ) = 27 C 2 3×(C×(3×3×C))=27C^2 3×(C×(3×3×C))=27C2个参数,,使用的参数更少。
  • 直观说来,最好选择带有小过滤器的卷积层组合,而不是用一个带有大的过滤器的卷积层。唯一的不足是,在进行反向传播时,中间的卷积层可能会导致占用更多的内存

减少尺寸设置的问题:上文中展示的两种设置是很好的,因为所有的卷积层都能保持其输入数据的空间尺寸池化层只负责对数据体从空间维度进行降采样。如果使用的步长大于1并且不对卷积层的输入数据使用零填充,那么就必须非常仔细地监督输入数据体通过整个卷积神经网络结构的过程,确认所有的步长和过滤器都尺寸互相吻合,卷积神经网络的结构美妙对称地联系在一起。

为什么在卷积层使用1的步长? 在实际应用中,更小的步长效果更好。上文也已经提过,步长为1可以让空间维度的降采样全部由池化层负责,卷积层只负责对输入数据体的深度进行变换。

为何使用零填充? 使用零填充除了前面提到的可以让卷积层的输出数据保持和输入数据在空间维度的不变,还可以提高算法性能。如果卷积层值进行卷积而不进行零填充,那么数据体的尺寸就会略微减小,那么图像边缘的信息就会过快地损失掉。

因为内存限制所做的妥协:在某些案例(尤其是早期的卷积神经网络结构)中,基于前面的各种规则,内存的使用量迅速飙升。例如,使用64个尺寸为3x3的过滤器对224x224x3的图像进行卷积,零填充为1,得到的激活数据体尺寸是[224x224x64]。这个数量就是一千万的激活数据,或者就是72MB的内存(每张图就是这么多,激活函数和梯度都是)。因为GPU通常因为内存导致性能瓶颈,所以做出一些妥协是必须的。在实践中,人们倾向于在网络的第一个卷积层做出妥协。例如,可以妥协可能是在第一个卷积层使用步长为2,尺寸为7x7的过滤器(比如在ZFnet中)。在AlexNet中,过滤器的尺寸的11x11,步长为4。

有名的CNN结构

LeNet: 第一个成功的卷积神经网络应用,是Yann LeCun在上世纪90年代实现的。当然,最著名还是被应用在识别数字和邮政编码等的LeNet结构。

AlexNet: AlexNet卷积神经网络在计算机视觉领域中受到欢迎,它由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton实现。AlexNet在2012年的ImageNet ILSVRC 竞赛中夺冠,性能远远超出第二名(16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构和LeNet非常类似,但是更深更大,并且使用了层叠的卷积层来获取特征(之前通常是只用一个卷积层并且在其后马上跟着一个池化层)。

ZF Net: Matthew Zeiler和Rob Fergus发明的网络在ILSVRC 2013比赛中夺冠,它被称为 ZFNet(Zeiler & Fergus Net的简称)。它通过修改结构中的超参数来实现对AlexNet的改良,具体说来就是增加了中间卷积层的尺寸,让第一层的步长和过滤器尺寸更小。

GoogLeNet: ILSVRC 2014的胜利者是谷歌的Szeged等实现的卷积神经网络。它主要的贡献就是实现了一个奠基模块,它能够显著地减少网络中参数的数量(AlexNet中有60M,该网络中只有4M)。还有,这个论文中没有使用卷积神经网络顶部使用全连接层,而是使用了一个平均池化,把大量不是很重要的参数都去除掉了。GooLeNet还有几种改进的版本,最新的一个是Inception-v4。

VGGNet: ILSVRC 2014的第二名是Karen Simonyan和 Andrew Zisserman实现的卷积神经网络,现在称其为VGGNet。它主要的贡献是展示出网络的深度是算法优良性能的关键部分。他们最好的网络包含了16个卷积/全连接层。网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的池化。他们的预训练模型是可以在网络上获得并在Caffe中使用的。VGGNet不好的一点是它耗费更多计算资源,并且使用了更多的参数,导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。后来发现这些全连接层即使被去除,对于性能也没有什么影响,这样就显著降低了参数数量。

ResNet: 残差网络(Residual Network)是ILSVRC2015的胜利者,由何恺明等实现。它使用了特殊的跳跃链接,大量使用了批量归一化(batch normalization)。这个结构同样在最后没有使用全连接层。读者可以查看何恺明的的演讲(视频,PPT),以及一些使用Torch重现网络的实验。ResNet当前最好的卷积神经网络模型(2016年五月)。何开明等最近的工作是对原始结构做一些优化,可以看论文Identity Mappings in Deep Residual Networks,2016年3月发表。


参考教程:
[1] CS231n
[2] deeplearning.ai

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值