文章目录
1.Computer Vision
CV问题分类
机器视觉(Computer Vision)是深度学习应用的主要方向之一。一般的CV问题包括以下三类:
- Image Cliassification 图片分类
- Object Detection 目标检测
- Neural Style Transfer 图片风格迁移
大尺寸图片的深度学习
对于小尺寸的图片问题,也许我们用DNN的结构可以较为简单的解决一定的问题。
例如一张64x64x3的图片,神经网络输入层的维度为12288。
如果图片尺寸较大,例如一张1000x1000x3的图片,神经网络输入层的维度将达到3百万,使得网络权重W非常庞大。这样会造成两个后果,一是神经网络结构复杂,数据量相对不够,容易出现过拟合;二是所需内存、计算量较大。解决这一问题的方法就是使用卷积神经网络(CNN)。
2.Edge detection 示例
边缘检测
对于CV问题,神经网络由浅层到深层,分别可以检测出图片的边缘特征 、局部特征(例如眼睛、鼻子等)、整体面部轮廓。
边缘分类
- vertical edge : 垂直边缘
- horizontal edge : 水平边缘
所谓边缘检测,在下面的图中,分别通过垂直边缘检测和水平边缘检测得到不同的结果:
垂直边缘检测
图片的边缘检测可以通过与相应滤波器(filter)进行卷积(convolution)以 “∗” 符号表示来实现。
以垂直边缘检测为例,原始图片尺寸为6x6,滤波器filter尺寸为3x3,卷积后的图片尺寸为4x4,得到结果如下:
卷积过程就是 filter 不断地和其大小相同的部分做对应元素的乘法运算并求和,最终得到的数字相当于新图片的一个像素值
边缘检测原理
以一个有一条垂直边缘线的简单图片来说明。通过垂直边缘 filter 我们得到的最终结果图片可以明显地将边缘和非边缘区分出来:
卷积运算提供了一个方便的方法来检测图像中的边缘,成为卷积神经网络中重要的一部分。
3.More Edge Detection
图片边缘有两种渐变方式,一种是由明变暗,另一种是由暗变明。以垂直边缘检测为例,下图展示了两种方式的区别。
实际应用中,这两种渐变方式并不影响边缘检测结果,可以对输出图片取绝对值操作,得到同样的结果。
下图是垂直检测和水平检测的滤波器算子,可看作互相可以由翻转90度而来
除了上面提到的这种简单的Vertical、Horizontal滤波器之外,还有其它常用的filters,例如Sobel filter和Scharr filter。这两种滤波器的特点是增加图片中心区域的权重。
在深度学习中,如果我们想检测图片的各种边缘特征,而不仅限于垂直边缘和水平边缘,那么filter的数值一般需要通过模型训练得到,类似于标准神经网络中的权重W一样由梯度下降算法反复迭代求得。对于复杂的图片,我们可以直接将filter中的数字直接看作是需要学习的参数,其可以学习到对于图片检测相比上面filter更好的更复杂的filter,如相对于水平和垂直检测器,我们训练的 filter 参数也许可以知道不同角度的边缘。
通过卷积运算,在CNN中通过反向传播算法计算出这些filter的数值。确定得到了这些filter后,CNN浅层网络也就实现了对图片所有边缘特征的检测。
4.Padding
没有paading会有什么问题?
-
按照卷积过程,每次卷积运算后,输出图片的尺寸会缩小;
令原始图片尺寸为 n × n n\times n n×n;
filter的尺寸为: f × f f\times f f×f ;
求解:卷积后的图片尺寸: ( n − f + 1 ) × ( n − f + 1 ) ( n - f + 1 )\times ( n - f + 1 ) (n−f+1)×(n−f+1) -
原始图片的角落和边缘进行卷积运算的次数小,输出的图片丢失边缘信息,而这些信息可能为有用的信息。
加入Padding
为了解决上面的问题,在进行卷积运算前为图片加padding,即把原始图片尺寸进行扩展,包围角落和边缘的像素,使得通过filter的卷积运算后,图片大小不变,也不会丢失角落和边缘的信息。
引入Padding后的参数
以p表示 Padding 的值,加入Padding ,卷积后的图片尺寸为:
(
n
+
2
p
−
f
+
1
)
×
(
n
+
2
p
−
f
+
1
)
( n + 2p - f + 1 )\times ( n + 2p - f + 1 )
(n+2p−f+1)×(n+2p−f+1)
如果要保证卷积前后的图片尺寸不变,则 p 应满足以下条件:
p
=
f
−
1
2
p = \frac{f - 1 }{2}
p=2f−1
下图为加入padding的卷积实例:
Valid / Same Convolution
-
Valid : no padding, 即 p = 0
n × n ∗ f × f → ( n − f + 1 ) × ( n − f + 1 ) n\times n * f\times f \rightarrow ( n - f + 1 )\times ( n - f + 1 ) n×n∗f×f→(n−f+1)×(n−f+1) -
Same : padding,输出与输入图片尺寸相同
p = f − 1 2 p = \frac{f - 1 }{2} p=2f−1
n × n ∗ f × f → ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) n\times n * f\times f \rightarrow( n + 2p - f + 1 )\times ( n + 2p - f + 1 ) n×n∗f×f→(n+2p−f+1)×(n+2p−f+1)
5.Strided Convolutions
Stride为步长,卷积的步长是构建卷积神经网络的一个基本的操作。
Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。之前我们默认stride=1。若stride=2,则表示filter每次步进长度为2,即隔一点移动一次。
按如下表示:
stride长度:
s
s
s
padding长度:
p
p
p
原始图片尺寸:
filter大小:
则卷积后的图片尺寸为:
⌊
(
n
+
2
p
−
f
)
s
+
1
⌋
×
⌊
(
n
+
2
p
−
f
)
s
+
1
⌋
\lfloor \frac{( n + 2p - f )}{s}+1\rfloor \times \lfloor \frac{( n + 2p - f )}{s}+1 \rfloor
⌊s(n+2p−f)+1⌋×⌊s(n+2p−f)+1⌋
上式中,
⌊
.
.
.
⌋
\lfloor ...\rfloor
⌊...⌋ 表示向下取证
下图为
s
s
s = 2 的卷积计算
cross-correlations和convolutions
在数学定义上,矩阵的卷积(convolution)操作为首先将卷积核同时在水平和垂直方向上进行翻转,构成一个卷积核的镜像,然后使用该镜像再和前面的矩阵进行移动相乘求和操作。如下面例子所示:
在深度学习中,我们称为的卷积运算实则没有卷积核变换为镜像的这一步操作,因为在权重学习的角度,变换是没有必要的。深度学习的卷积操作在数学上准确度来说称为互相关(cross-correlation)。
6.Convolutions Over Volumes
立体卷积
上述对于灰色图像中,卷积核和图像均是二维的。
而应用于彩色图像中,因为图片有R、G、B三个颜色通道,所以此时的卷积核应为三维立体卷积核。
对于3-channel的RGB图片,其对应的filter算子同样也是3-channel的。
例如下图中图片是6 x 6 x 3,分别表示图片的高度(height)、宽度(weight)和通道(#channel)。
3-channel图片的卷积运算与单通道图片的卷积运算基本一致。过程是将每个单通道(R,G,B)与对应的filter进行卷积运算求和,然后再将3通道的和相加,得到输出图片的一个像素值。
多卷积核
不同通道的filter可以不相同,例如R通道filter实现垂直边缘检测,G和B通道不进行边缘检测,全部置零,或者将R,G,B三通道filter全部设置为水平边缘检测。
为了进行多个卷积运算,实现更多边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。这样,不同滤波器组卷积得到不同的输出,个数由滤波器组决定。
由图可知,最终提取到彩色图片的垂直特征图和水平特征图,得到有2个通道的4×4大小的特征图片。
多个通道的卷积计算如下:
n
×
n
×
n
c
∗
f
×
f
×
n
c
→
(
n
−
f
+
1
)
×
(
n
−
f
+
1
)
×
n
c
′
n\times n\times n_c * f\times f\times n_c \rightarrow( n - f + 1 )\times ( n - f + 1 )\times n_c'
n×n×nc∗f×f×nc→(n−f+1)×(n−f+1)×nc′
其中:
nc :通道的数量;
nc’ : filter个数
7.One Layer of a Convolutional Network
和普通的NN单层前向传播的过程类似,CNN也是一个先由输入"input" 和权重"w"及偏置"b"做线性运算,然后得到的结果输入一个激活函数"ReLU"中,得到最终的输出“output”:
Z
[
l
]
=
W
[
l
]
A
[
l
−
1
]
+
b
Z^{[l]} = W^{[l]}A^{[l-1]} + b
Z[l]=W[l]A[l−1]+b
A
[
l
]
=
g
[
l
]
Z
[
l
]
A{[l]} = g^{[l]}Z^{[l]}
A[l]=g[l]Z[l]
不同点是在卷积神经网络中,权重和输入进行的是卷积运算,filter组数值对应着
W
[
l
]
W^{[l]}
W[l] ,所选的激活函数为:ReLU
单层CNN参数个数
计算一下上图中参数的数目:
- filter的个数(即weight数):3 x 3 x 3 = 27
- bias偏移量b的个数为 : 1
- 每个filter中参数个数:27 + 1 = 28
- 两个filter共有 28 x 2 = 56 个参数
无论图片大小是多少,卷积层参数个数一直都是280个,相对于普通的神经网络,卷积神经网络的参数个数要少很多。选定filter个数后,参数数目与输入图片尺寸无关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由filter个数决定,数目相对来说要少得多,这是CNN的优势之一。
标记总结
设单层CNN中层数为 l l l
- f [ l ] f^{[l]} f[l] :filter的大小
- p [ l ] p^{[l]} p[l]:padding
- s [ l ] s^{[l]} s[l]:stride
- n c [ l ] n^{[l]}_c nc[l]:在第 l l l层的filter个数
- Input: n H [ l − 1 ] × n W [ l − 1 ] × n C [ l − 1 ] n^{[l-1]}_H \times n^{[l-1]}_W\times n^{[l-1]}_C nH[l−1]×nW[l−1]×nC[l−1]
- 每个filter : f [ l ] × f [ l ] × n C [ l − 1 ] f^{[l]}\times f^{[l]}\times n^{[l-1]}_C f[l]×f[l]×nC[l−1]
- weight: f [ l ] × f [ l ] × n C [ l − 1 ] × n C [ l ] f^{[l]}\times f^{[l]}\times n^{[l-1]}_C\times n^{[l]}_C f[l]×f[l]×nC[l−1]×nC[l]
- bias: 1 × 1 × 1 × n C [ l ] 1\times1\times1\times n^{[l]}_C 1×1×1×nC[l]
- output: n H [ l ] × n W [ l ] × n C [ l n^{[l]}_H \times n^{[l]}_W\times n^{[l}_C nH[l]×nW[l]×nC[l
- 其中:
n H [ l ] = ⌊ ( n H [ l − 1 ] + 2 p [ l ] − f [ l ] ) s [ l ] + 1 ⌋ n^{[l]}_H = \lfloor \frac{( n^{[l-1]}_H + 2p^{[l]} - f^{[l]} )}{s^{[l]}}+1\rfloor 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^{[l]}_W = \lfloor \frac{( n^{[l-1]}_W + 2p^{[l]} - f^{[l]} )}{s^{[l]}}+1\rfloor nW[l]=⌊s[l](nW[l−1]+2p[l]−f[l])+1⌋ - 如果有m个样本,output = m × n H [ l ] × n W [ l ] × n C [ l m\times n^{[l]}_H \times n^{[l]}_W\times n^{[l}_C m×nH[l]×nW[l]×nC[l
8.Simple CNN Example
CNN结构如下图所示:
下图是一个简单的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^ 。
随着CNN增加,
n
H
[
l
]
n^{[l]}_H
nH[l] 和
n
W
[
l
]
n^{[l]}_W
nW[l] 逐级减小,而
n
C
[
l
]
n^{[l]}_C
nC[l]一般逐渐增大
CNN中网络层的类型
- 卷积层:Convolution层(CONV)
- 池化层:Pooling层(POOL)
- 全连接层:Fully connected层(FC)
9.Pooling Layers
Pooling layers是CNN中用来减小尺寸,提高运算速度的,同样能减小noise影响,让各特征更具有健壮性。
Pooling layers的做法比convolution layers简单许多,没有卷积运算,注意,超参数p很少在pooling layers中使用。
Max pooling
最大池化是对前一层得到的特征图进行池化减小,仅由当前小区域内的最大值来代表最终池化后的值。
Max pooling的好处是只保留区域内的最大值(特征),忽略其它值,降低noise影响,提高模型健壮性。
而且,max pooling需要的超参数仅为滤波器尺寸 f 和 filter 的步进长 s ,没有其他参数需要模型训练得到,计算量很小。
Average pooling
平均池化与最大池化唯一不同的是其选取的是小区域内的均值来代表该区域内的值。
实际应用中,max pooling比average pooling更为常用。
池化层超参数
- f :filter的大小;
- s:stride大小;
- 最大池化或者平均池化;
- p:padding,这里要注意,几乎很少使用。
10.CNN Example
这里以 LeNet-5 为例,给出一个完整的卷积神经网络。
图中,CON层后面紧接一个POOL层,CONV1和POOL1构成第一层,CONV2和POOL2构成第二层。特别注意的是FC3和FC4为全连接层FC,它跟标准的神经网络结构一致。最后的输出层(softmax)由10个神经元构成。
构建深度卷积的模式:
- 随着网络的深入,提取的特征图片大小将会逐渐减小,但同时通道数量应随之增加;
- Conv——Pool——Conv——Pool——Fc——Fc——Fc——softmax。
整个网络各层的尺寸和参数如下表格所示:
根据上表我们可以看出,对于卷积卷积神经网络的参数:
- 在卷积层,仅有少量的参数;
- 在池化层,没有参数;
- 在全连接层,存在大量的参数。
11.Why Convolutions
相比标准神经网络,CNN的优势之一就是参数数目要少得多。参数数目少的原因有两个:
- Parameter Sharing:一个feature detector(例如垂直边缘检测)对图片某块区域有用,同时也可能作用在图片其它区域。
- Sparsity of Connection:在每一层中,每个输出值只取决于少量的输入。
训练卷积神经网络:
我们将训练集输入到卷积神经网络中,对网络进行训练。利用梯度下降(Adam、momentum等优化算法)最小化代价函数来寻找网络最优的参数。