CNN基础

1. 计算机视觉

(Computer Vision)

一般的CV问题包括以下三类:

  1. 图像分类(Image Classification)
  2. 目标识别(Object detection)
  3. 神经风格转换(Neural Style Transfer)

使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大。如果图片尺寸较大,例如一张1000x1000x3的图片,神经网络输入层的维度将达到3百万,使得网络权重W非常庞大。这样会造成两个后果,一是神经网络结构复杂,数据量相对不够,容易出现过拟合;二是所需内存、计算量较大。解决这一问题的方法就是使用卷积神经网络(CNN)。

CNN做的事情其实是,来简化这个neural network的架构,我们根据自己的知识和对图像处理的理解,一开始就把某些实际上用不到的参数给过滤掉,我们一开始就想一些办法,不要用fully connected network,而是用比较少的参数,来做图像处理这件事情,所以CNN其实是比一般的DNN还要更简单的。


2. 卷积操作:以边缘检测举例

(Edge Detection)

最常检测的图片边缘有两类:一是垂直边缘(vertical edges),二是水平边缘(horizontal edges)。

在这里插入图片描述
图片的边缘检测可以通过与相应滤波器进行卷积来实现。以垂直边缘检测为例,原始图片尺寸为6×6,滤波器filter尺寸为3×3,卷积后的图片尺寸为4×4,得到结果如下:

在这里插入图片描述其中 ∗ * 表示卷积操作,上图只显示了卷积后的第一个值和最后一个值,其余值可自行计算。

以垂直边缘检测(vertical edges detection)为例,利用卷积可以检测到图像的垂直边缘:
在这里插入图片描述


3. 边缘检测补充

图像边缘有两种渐变方式,一种是由明变暗,另一种是由暗变明。以垂直边缘检测为例,下图展示了两种方式的区别。实际应用中,这两种渐变方式并不影响边缘检测结果,可以对输出图像取绝对值操作,得到同样的结果。

在这里插入图片描述
下图展示一个水平边缘检测的例子:

在这里插入图片描述

垂直边缘检测和水平边缘检测的滤波器算子如下所示:

在这里插入图片描述
除了上面提到的这种简单的Vertical、Horizontal滤波器之外,还有其它常用的filters,例如Sobel filter和Scharr filter。这两种滤波器的特点是增加图片中心区域的权重。(下图展示的是垂直边缘检测算子,水平边缘检测算子只需将上图顺时针翻转90度即可。)

在这里插入图片描述
在深度学习中,如果我们想检测图像的各种边缘特征,而不仅限于垂直边缘和水平边缘,那么 filter 的数值一般需要通过模型训练得到,类似于标准神经网络中的权重 w w w 一样由反向传播算法迭代求得。CNN的主要目的就是计算出这些 filter 的数值。确定得到了这些 filter 后,CNN浅层网络也就实现了对图片所有边缘特征的检测。
在这里插入图片描述

4. Padding

按照我们上面讲的图片卷积,如果原始图片尺寸为 n × n n × n n×n,filter尺寸为 f × f f× f f×f,则卷积后的图片尺寸为 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1) × (n-f+1) (nf+1)×(nf+1),注意 f f f 一般为奇数。这样会带来两个问题:

  1. 卷积运算后,输出图片尺寸缩小
  2. 原始图片边缘信息对输出贡献得少,输出图片丢失边缘信息

为了解决图片缩小的问题,可以 使用padding方法,即把原始图片尺寸进行扩展,扩展区域补零,用 p p p 来表示每个方向扩展的宽度。
在这里插入图片描述
经过padding之后:

原始图像padding后尺寸filter尺寸卷积后的图像尺寸
( n + 2 p ) × ( n + 2 p ) (n+2p) × (n+2p) (n+2p)×(n+2p) f × f f × f f×f ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1) × (n+2p-f+1) (n+2pf+1)×(n+2pf+1)

若要保证卷积前后图像尺寸不变,则p应满足:
n = ( n + 2 p − f + 1 ) , 即   p = f − 1 2 n=(n+2p-f+1),即\ p=\frac{f-1}{2} n=(n+2pf+1) p=2f1
稍作总结:

  • 无padding操作, p = 0 p=0 p=0,我们称之为 Valid convolutions (不填充)
  • 有padding操作, p = f − 1 2 p=\frac{f-1}{2} p=2f1 ,我们称之为 Same convolutions (填充,输入输出大小相等)

5. 卷积步长

(Strided convolutions)

Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。之前我们默认stride=1。若stride=2,则表示filter每次步进长度为2,即隔一点移动一次。
在这里插入图片描述
我们用 s s s 表示stride长度, p p p 表示padding长度,如果原始图片尺寸为 n × n n × n n×n,filter尺寸为 f × f f× f f×f,则卷积后的图片尺寸为:
⌊ n + 2 p − f s + 1 ⌋ × ⌊ n + 2 p − f s + 1 ⌋ \left\lfloor\frac{n+2 p-f}{s}+1\right\rfloor ×\left\lfloor\frac{n+2 p-f}{s}+1\right\rfloor sn+2pf+1×sn+2pf+1在上图的例子中, n = 7 ,   p = 0 ,   f = 3 ,   s = 2 ,   7 + 0 − 3 2 + 1 = 3 n=7, \ p=0,\ f=3,\ s=2,\ \frac{7+0-3}{2}+1=3 n=7, p=0, f=3, s=2, 27+03+1=3, 即 3 × 3 3\times3 3×3 的输出。

注:商不是整数的情况下,向下取整,上式中的 ⌊ . . . ⌋ \lfloor...\rfloor ... 表示向下取整。


值得一提的是,相关系数cross-correlations)与 卷积convolutions)之间是有区别的。

  • 数学意义上的卷积运算会先将filter绕其中心旋转180度,然后再将旋转后的filter在原始图片上进行滑动计算。filter旋转如下所示:
    在这里插入图片描述
  • 相关系数的计算过程则不会对filter进行旋转,而是直接在原始图片上进行滑动计算。

其实,目前为止我们介绍的CNN卷积实际上计算的是相关系数,而不是数学意义上的卷积。但是,为了简化计算,我们一般把CNN中的这种“相关系数”就称作卷积运算。之所以可以这么等效,是因为滤波器算子一般是水平或垂直对称的,180度旋转影响不大;而且最终滤波器算子需要通过CNN网络梯度下降算法计算得到,旋转部分可以看作是包含在CNN模型算法中。总的来说,忽略旋转运算可以大大提高CNN网络运算速度,而且不影响模型性能。

卷积运算服从结合律: ( A ∗ B ) ∗ C = A ∗ ( B ∗ C ) (A * B) * C=A *(B * C) (AB)C=A(BC)


6. 三维卷积

(Convolutions over volumes)

对于3通道的RGB图像,其对应的滤波器算子同样也是3通道的。例如一个图像是6 x 6 x 3,分别表示图像的高度(height)、宽度(weight)和通道(channel)。

3通道图像的卷积运算与单通道图像的卷积运算基本一致。过程是将每个单通道(R,G,B)与对应的filter进行卷积运算求和,然后再将3通道的和相加,得到输出图像的一个像素值。

在这里插入图片描述
不同通道的滤波算子可以不相同。例如R通道filter实现垂直边缘检测,G和B通道不进行边缘检测,全部置零,或者将R,G,B三通道filter全部设置为水平边缘检测。

为了实现更多边缘检测,可以增加更多的滤波器组,进行多个卷积运算。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。这样,不同滤波器组卷积得到不同的输出,个数由滤波器组决定。

在这里插入图片描述
三维卷积下的尺寸计算为:

原始图像尺寸filter尺寸卷积后的图像尺寸
n × n × n c n ×n×n_c n×n×nc f × f × n c f × f×n_c f×f×nc ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1) × (n-f+1)×n_c^{'} (nf+1)×(nf+1)×nc

其中, n c n_c nc 为图片通道数目, n c ′ n_c^{'} nc 为滤波器组个数。

因此:

  • 滤波器层数 = = = 原始图像层数 = n c =n_c =nc
  • 卷积后的图像层数 = = = 滤波器组个数 = n c ′ =n_c^{'} =nc

7. 单层卷积网络

(One layer of a convolutional network)

卷积神经网络的单层结构如下所示:
卷积神经网络的单层结构如下所示:
相比之前单独的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b。整个过程与标准的神经网络单层结构非常类似: Z [ l ] = W [ l ] A [ l − 1 ] + b A [ l ] = g [ l ] ( Z [ l ] ) \begin{aligned} &Z^{[l]}=W^{[l]} A^{[l-1]}+b\\ &A^{[l]}=g^{[l]}\left(Z^{[l]}\right) \end{aligned} Z[l]=W[l]A[l1]+bA[l]=g[l](Z[l])卷积运算对应着上式中的乘积运算,滤波器组数值对应着权重 W [ l ] W^{[l]} W[l] ,所选的激活函数为ReLU。

我们来计算一下上图中参数的数目:每个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每个滤波器组有27+1=28个参数,两个滤波器组总共包含28×2=56个参数。我们发现,选定滤波器组后,参数数目与输入图片尺寸无关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,这是CNN的优势之一

总结一下CNN单层结构的所有标记符号,设层数为 l l l,给定一下符号标记:

padding步长
stride
滤波器大小
filter size
滤波器组个数
number of filters
p [ l ] p^{[l]} p[l] s [ l ] s^{[l]} s[l] f [ l ] f^{[l]} f[l] n c [ l ] n_c^{[l]} nc[l]

可以得到( H , W , c H,W,c H,W,c 分别表示height、weight和channel):

输入维度 n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] n_{H}^{[l-1]} \times n_{W}^{[l-1]} \times n_{c}^{[l-1]} nH[l1]×nW[l1]×nc[l1]
每个滤波器组维度 f [ l ] × f [ l ] × n c [ l − 1 ] f^{[l]}×f^{[l]}×n_{c}^{[l-1]} f[l]×f[l]×nc[l1]
权重维度 f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] f^{[l]}×f^{[l]}×n_{c}^{[l-1]}×n_{c}^{[l]} f[l]×f[l]×nc[l1]×nc[l]
偏置维度 1 × 1 × 1 × n c [ l ] 1×1×1×n_{c}^{[l]} 1×1×1×nc[l]
输出维度 n H [ l ] × n W [ l ] × n c [ l ] n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} nH[l]×nW[l]×nc[l]

注:关于维度的关系理不清的话可以回顾第 #6节末的总结

根据第#5节的内容,可以得到输出维度满足:
n H [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ \begin{array}{l} n_{H}^{[l]}=\left\lfloor\displaystyle\frac{n_{H}^{[l-1]}+2 p^{[l]}-f^{[l]}}{s^{[l]}}+1\right\rfloor \\ \\ n_{W}^{[l]}=\left\lfloor\displaystyle\frac{n_{W}^{[l-1]}+2 p^{[l]}-f^{[l]}}{s ^{[l]}}+1\right\rfloor \end{array} nH[l]=s[l]nH[l1]+2p[l]f[l]+1nW[l]=s[l]nW[l1]+2p[l]f[l]+1如果有m个样本,进行向量化运算,相应的输出维度为: m × n H [ l ] × n W [ l ] × n c [ l ] m\times n_{H}^{[l]} \times n_{W}^{[l]} \times n_{c}^{[l]} m×nH[l]×nW[l]×nc[l]


8. 简单卷积网络示例

(A simple convolution network example)

下面介绍一个简单的CNN网络模型(计算过程见上节公式):
在这里插入图片描述
该CNN模型各层结构如上图所示。需要注意的是, a [ 3 ] a^{[3]} a[3] 的维度是7 x 7 x 40,将 a [ 3 ] a^{[3]} a[3] 排列成1列,维度为1960 x 1,然后连接最后一级输出层。输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出 y ^ \hat{y} y^

随着CNN层数增加, n H [ l ] n_H^{[l]} nH[l] n W [ l ] n_W^{[l]} nW[l] 一般逐渐减小,而 n c [ l ] n_c^{[l]} nc[l] 一般逐渐增大。

一个典型的卷积神经网络通常有三层:

  • 卷积层:Convolution layers(CONV
  • 池化层:Pooling layers(POOL
  • 全连接层:Fully connected layers(FC

虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。池化层和全连接层比卷积层更容易设计。


9. 池化层

(Pooling layers)

Pooling layers是CNN中用来减小尺寸,提高运算速度的,同样能减小noise影响,让各特征更具有健壮性。

Pooling layers 的做法比 Convolution layers 简单许多,没有卷积运算,仅仅是在滤波器算子滑动区域内取最大值,即max pooling,这是最常用的做法。(我的理解是类似于降采样)

注意,超参数p(padding)很少在pooling layers中使用。

在这里插入图片描述
Max pooling的好处是只保留区域内的最大值(特征),忽略其它值,降低noise影响,提高模型健壮性。而且,max pooling需要的超参数仅为滤波器尺寸 f f f 和滤波器步长 s s s,没有其他参数需要模型训练得到,计算量很小。

如果是多个通道,那么就每个通道单独进行max pooling操作。

除了max pooling之外,还有一种做法:average pooling。顾名思义,average pooling就是在滤波器算子滑动区域计算平均值。

在这里插入图片描述
实际应用中,max pooling比average pooling更为常用。


10. 卷积神经网络示例

(Convolutional neural network example)

下面介绍一个简单的数字识别的CNN例子:
在这里插入图片描述
图中,CONV层后面紧接一个POOL层,CONV1 和 POOL1 构成Layer1,CONV2 和 POOL2 构成 Layer2(一般在统计网络层数时,只计算具有权重的层,因为池化层没有权重和参数,只有一些超参数。因此我们把CONV1和POOL1共同作为一个卷积,并标记为Layer1)。

特别注意的是FC3和FC4为全连接层FC,它跟标准的神经网络结构一致。最后的输出层(softmax)由10个神经元构成。

整个网络各层的尺寸和参数如下表格所示:

在这里插入图片描述
有几点要注意,第一,池化层和最大池化层没有参数;第二,卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。

观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。


11. 为什么使用卷积?

(Why convolutions?)

相比标准神经网络,CNN的优势之一就是参数数目要少得多。参数数目少的原因有两个:

  • 参数共享:一个特征检测器(例如垂直边缘检测)对图片某块区域有用,同时也可能作用在图片其它区域。
  • 局部感知:因为滤波器算子尺寸限制,每一层的每个输出只与输入部分区域内有关。

在这里插入图片描述
在这里插入图片描述
除此之外,由于CNN参数数目较小,所需的训练样本就相对较少,从而一定程度上不容易发生过拟合现象。而且,CNN比较擅长捕捉区域位置偏移。也就是说CNN进行物体检测时,不太受物体所处图片位置的影响,增加检测的准确性和系统的健壮性。


参考:
红色石头:吴恩达《卷积神经网络》课程笔记
第四门课 卷积神经网络(Convolutional Neural Networks)

  • 16
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值