第四门课 卷积神经网络(Convolutional Neural Networks)
1.1计算机视觉(Computer vision)
应用计算机视觉时要面临一个挑战是数据的输入可能会非常大,进行卷积计算可以解决这一问题。
1.2边缘检测示例(Edge detction example)
卷积运算是卷积神经网络最基本的组成部分。让电脑去搞清楚这张照片里有什么物体,做的第一件事是检测图片中的垂直边缘。要构造一个3×3的过滤器(在论文中有时被称为核),对这个6×6的图像进行卷积运算,卷积运算用“ ∗ * ∗”来表示,结果通过元素乘法(element-wise products)运算获得。在编程中使用conv_forward函数。如果在tensorflow下函数叫tf.conv2d。在Keras框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。
在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。因为使用3×3的矩阵(过滤器),所以垂直边缘是一个3×3的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。
1.3更多边缘检测内容(More edge detection)
通过使用不同的过滤器就可以找出垂直的或是水平的边缘。
Sobel过滤器: [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix} 1 & 0 & -1 \\ 2 & 0 & -2 \\ 1 & 0 & -1 \end{bmatrix} ⎣⎡121000−1−2−1⎦⎤优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。
Scharr过滤器: [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix} 3 & 0 & -3 \\ 10 & 0 & -10 \\ 3 & 0 & -3 \end{bmatrix} ⎣⎡3103000−3−10−3⎦⎤它有着和之前完全不同的特性,实际上也是一种垂直边缘检测,如果将其翻转90度就能得到对应水平边缘检测。
相比单纯的垂直边缘和水平边缘,最后一张图的过滤器可以检测出45°或70°甚至是任何角度的边缘。将矩阵的所有数字都设置为参数,通过数据反馈,让神经网络自动去学习它们,我们会发现神经网络可以学习一些低级的特征,如这些边缘的特征。构成这些计算的基础依然是卷积运算,使得反向传播算法能够让神经网络学习任何它所需要的3×3的过滤器,并在整幅图片上去应用它。
1.4Padding
我们有一个 n × n n×n n×n的图像,用 f × f f×f f×f的过滤器做卷积,那么输出的维度就是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)×(n-f+1) (n−f+1)×(n−f+1)。这样每次做卷积操作图片都会缩小,而且由于边缘区域的像素点在输出中采用较少,会丢掉图像边缘位置的很多信息。为了解决这个问题可以在卷积操作之前填充图像。
如果
p
p
p是填充的数量,输出就变成了
(
n
+
2
p
−
f
+
1
)
×
(
n
+
2
p
−
f
+
1
)
(n+2p-f+1)×(n+2p-f+1)
(n+2p−f+1)×(n+2p−f+1)。选择填充多少像素通常有两个选择:
- Valid卷积:不填充, p = 0 p=0 p=0。
- Same卷积:填充后输出大小 n + 2 p − f + 1 n+2p-f+1 n+2p−f+1等于输入大小 n n n, p = ( f − 1 ) 2 p=\frac{(f-1)}{2} p=2(f−1)。
通常 f f f是奇数,这样过滤器就会有一个中心像素点,便于指出过滤器的位置,且若为偶数就会产生不对称填充。
1.5卷积步长(Strided convolutions)
用
f
×
f
f×f
f×f的过滤器卷积一个
n
×
n
n×n
n×n的图像,padding为
p
p
p,步幅为
s
s
s,输出为
n
+
2
p
−
f
s
+
1
×
n
+
2
p
−
f
s
+
1
\frac{n+2p-f}{s}+1×\frac{n+2p-f}{s}+1
sn+2p−f+1×sn+2p−f+1。若输出的商不为整数,则进行地板除(floor),向下取整到最近的整数
[
n
+
2
p
−
f
s
+
1
]
×
[
n
+
2
p
−
f
s
+
1
]
[\frac{n+2p-f}{s}+1]×[\frac{n+2p-f}{s}+1]
[sn+2p−f+1]×[sn+2p−f+1]。
数学教科书中卷积的定义是做元素乘积求和,在卷积之前首先要将过滤器沿水平和垂直轴翻转,所以 [ 3 4 5 1 0 2 − 1 9 7 ] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 0 & 2 \\ -1 & 9 & 7 \end{bmatrix} ⎣⎡31−1409527⎦⎤变为 [ 7 2 5 9 0 4 − 1 1 3 ] \begin{bmatrix} 7 & 2 & 5 \\ 9 & 0 & 4 \\ -1 & 1 & 3 \end{bmatrix} ⎣⎡79−1201543⎦⎤(应该是先顺时针旋转90度得到 [ − 1 1 3 9 0 4 7 2 5 ] \begin{bmatrix} -1 & 1& 3 \\ 9 & 0 & 4 \\ 7 & 2 & 5 \end{bmatrix} ⎣⎡−197102345⎦⎤再水平翻转得到 [ 7 2 5 9 0 4 − 1 1 3 ] \begin{bmatrix} 7 & 2 & 5 \\ 9 & 0 & 4 \\ -1 & 1 & 3 \end{bmatrix} ⎣⎡79−1201543⎦⎤),相当于将过滤器镜像,得到的翻转矩阵再进行元素相乘。之前跳过了这个镜像操作,之前的操作有时被称为互相关(cross-correlation)而不是卷积(convolution)。但在深度学习文献中,将这(不进行翻转操作)叫做卷积操作。
1.6三维卷积(Convolutions over volumes)
一个 n × n × n c n×n×n_c n×n×nc(通道数)的输入图像, n c n_c nc是通道数目,卷积上一个 f × f × n c f×f×n_c f×f×nc,按照惯例,前一个 n c n_c nc和后一个 n c n_c nc必须数值相同,就得到了 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1)×(n-f+1)×n_{c'} (n−f+1)×(n−f+1)×nc′, n c ′ n_{c'} nc′就是下一层的通道数,就是过滤器的个数。一般用通道数( n c n_c nc)表示最后一个维度,在文献里也叫做3维立方体的深度。通道或深度经常被用在文献中。
1.7单层卷积网络(One layer of a convolutional network)
即使图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。输出图像中的通道数量就是神经网络中这一层所使用的过滤器的数量。过滤器中通道的数量必须与输入中通道的数量一致。因此输出通道数量就是输入通道数量。
如果 l l l是一个卷积层:
f [ l ] = f i l t e r s i z e f^{[l]}=filter \space size f[l]=filter size
p [ l ] = p a d d i n g p^{[l]}=padding p[l]=padding
s [ l ] = s t r i d e s^{[l]}=stride s[l]=stride
n c [ l ] = n u m b e r o f f i l t e r s n_c^{[l]}=number\space of\space filters nc[l]=number of filters
I n p u t : n H [ l − 1 ] × n W [ l − 1 ] × n c [ l − 1 ] Input:n_H^{[l-1]}×n_W^{[l-1]}×n_c^{[l-1]} Input:nH[l−1]×nW[l−1]×nc[l−1]
O u t p u t : n H [ l ] × n W [ l ] × n c [ l ] Output:n_H^{[l]}×n_W^{[l]}×n_c^{[l]} Output:nH[l]×nW[l]×nc[l]
n H [ l ] = [ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ] n_H^{[l]}=[\frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1] nH[l]=[s[l]nH[l−1]+2p[l]−f[l]+1]
n W [ l ] = [ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ] n_W^{[l]}=[\frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1] nW[l]=[s[l]nW[l−1]+2p[l]−f[l]+1]
E a c h f i l t e r i s : f [ l ] × f [ l ] × n c [ l − 1 ] Each \space filter \space is:f^{[l]}×f^{[l]}×n_c^{[l-1]} Each filter is:f[l]×f[l]×nc[l−1]
A c t i v a t i o n s : a [ l ] → m × n H [ l ] × n W [ l ] × n c [ l ] Activations:a^{[l]}\to m×n_H^{[l]}×n_W^{[l]}×n_c^{[l]} Activations:a[l]→m×nH[l]×nW[l]×nc[l](m个例子)
A [ l ] → n H [ l ] × n W [ l ] × n c [ l ] A^{[l]}\to n_H^{[l]}×n_W^{[l]}×n_c^{[l]} A[l]→nH[l]×nW[l]×nc[l]
W i g h t s : f [ l ] × f [ l ] × n c [ l − 1 ] × n c [ l ] Wights:f^{[l]}×f^{[l]}×n_c^{[l-1]}×n_c^{[l]} Wights:f[l]×f[l]×nc[l−1]×nc[l]
b i a s : n c [ l ] → ( 1 , 1 , 1 , n c [ l ] ) bias:n^{[l]}_c\to (1,1,1,n^{[l]}_c) bias:nc[l]→(1,1,1,nc[l])
1.8简单卷积网络示例(A simple convolution networks example)
一张39×39×3的输入图像处理如上图,最终为图片提取了7×7×40个特征,就是1960个特征。然后对该卷积进行处理,可以将其平滑或展开成1960个单元。平滑处理后可以输出一个向量,其填充内容是logistic回归单元还是softmax回归单元,取决于我们是想识图片上有没有猫,还是想识别 K K K种不同对象中的一种,用 y ^ \hat y y^表示最终神经网络的预测输出。
通常开始时的图像要大一些,高度和宽度在一段时间内保持一致,随着网络深度的加深而逐渐减小,而通道数量在增加。一个典型的卷积神经网络通常有三层:
- 卷积层CONV
- 池化层POOL
- 全连接层FC
虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络架构师依然会添加池化层和全连接层。
1.9池化层(Pooling layers)
除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性。
最大化运算的实际作用就是,如果在过滤器中提取到某个特征,那么保留其最大值。如果没有提取到这个特征,那么其中的最大值也还是很小。它有一组超参数,但并没有参数需要学习。一旦确定
f
f
f和
s
s
s,它就是一个固定运算,梯度下降无需改变任何值。
池化的超级参数包括过滤器大小
f
f
f和步幅
s
s
s,常用的参数值为
f
=
2
,
s
=
2
f=2,s=2
f=2,s=2,应用频率非常高,其效果相当于高度和宽度缩减一半。最大池化的输入是
n
H
×
n
W
×
n
c
n_H×n_W×n_c
nH×nW×nc,假设没有padding,则输出为
[
n
H
−
f
s
+
1
]
×
[
n
W
−
f
s
+
1
]
×
n
c
[\frac{n_H-f}{s}+1]×[\frac{n_W-f}{s}+1]×n_c
[snH−f+1]×[snW−f+1]×nc。执行反向传播时,反向传播没有参数适用于最大池化。只有这些设置过的超参数,可能是手动设置的,也可能是通过交叉验证设置的。
1.10卷积神经网络示例(Convolutional networks example)
假设有一张大小为32×32×3的输入图片,这是一张RGB模式的图片,想做手写体数字识别。想识别图片中数字是从0-9这10个数字中的哪一个,构建一个神经网络来实现这个功能。本示例用的网络模型和经典网络LeNet-5非常相似,LeNet-5是多年前Yann LeCun创建的,本模型并不是LeNet-5,但是受它启发,许多参数选择都与LeNet-5相似。
卷积有两种分类,与层的划分存在一致性。一类卷积是一个卷积层和一个池化层一起作为一层layer。另一类卷积是把卷积层作为一层,而池化层单独作为一层。在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。这里把CONV1和POOL1共同作为一个卷积,并标记为Layer1。
Activation shape | Activation Size | parameters | |
---|---|---|---|
Input: | (32,32,3) | 3072 | 0 |
CONV1(f=5,s=1,p=0) | (28,28,8) | 6272 | (5*5+1)*8=208 |
POOL1(f=2,s=2) | (14,14,8) | 1568 | 0 |
CONV2(f=5,s=1,p=0) | (10,10,16) | 1600 | (5*5+1)*16=416 |
POOL2(f=2,s=2) | (5,5,16) | 400 | 0 |
FC3 | (120,1) | 120 | 400*120+1=48001 |
FC4 | (84,1) | 84 | 120*84+1=10081 |
Softmax | (10,1) | 10 | 84*10+1=841 |
注:手写数字数据是灰度图,通道不用乘3,所以卷积层的参数也不用乘3.。
可以把平整化结果想象成这样的一个神经元集合,利用这400个单元构建下一层。下一层含有120个单元,这400个单元与这120个单元的每一项连接,这就是第一个全连接层,标记为FC3。它很像在第一和第二门课中讲过的单神经网络层,这是一个标准的神经网络,权重矩阵为 W [ 3 ] W^{[3]} W[3]维度为 ( 120 , 400 ) (120,400) (120,400),偏差参数 b [ 3 ] b^{[3]} b[3]维度为 ( 120 , 1 ) (120,1) (120,1)。最后输出120个维度,因为有120个输出。然后对这120个单元再添加一个全连接层,假设它含有84个单元,标记为FC4。
第一池化层和最大池化层没有参数;第二卷积层的参数相对较少,许多参数都存在于神经网络的全连接层。随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。
1.11为什么使用卷积(Why convolutions?)
和只用全连接层相比,卷积网络映射参数较少,有两个原因:参数共享和稀疏连接。神经网络可以通过这两种机制减少参数,以便用更小的训练集来训练它,从而预防过度拟合。
卷积神经网络善于捕捉平移不变。因为神经网络的卷积结构使得即使移动几个像素,图片依然具有非常相似的特征,应该属于同样的输出标记。实际上用同一个过滤器生成各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。
错题
1.下面的过滤器应用到灰度图像会怎么样?
[ 0 1 − 1 0 1 3 − 3 − 1 1 3 − 3 − 1 0 1 − 1 0 ] \begin{bmatrix} 0 & 1 & -1 & 0\\ 1 & 3 & -3 & -1\\ 1 & 3 & -3 & -1\\ 0 & 1 & -1 & 0 \end{bmatrix} ⎣⎢⎢⎡01101331−1−3−3−10−1−10⎦⎥⎥⎤
会检测垂直边缘,因为左边的部分为正,右边的部分为负。(左边亮,右边暗)
5.padding不在 n c n_c nc维度填充
8.在前向传播过程中,池化层里保存着卷积层的各个部分的最大值/平均值,然后由池化层传递给下一层,在反向传播过程中,由下一层传递梯度过来,“不影响反向传播的计算”意味着池化层到卷积层(反向)没有梯度变化,梯度值就为0,既然梯度值为0,那么例如在 W [ l ] = W [ l ] − α × d W [ l ] W^{[l]}=W^{[l]}−α×dW^{[l]} W[l]=W[l]−α×dW[l]的过程中 d W [ l ] = 0 dW^{[l]}=0 dW[l]=0,也就是说它不再更新,反向传播到此中断。所以池化层会影响反向传播的计算。