卷积神经网络(CNN)
一、算法思想
卷积神经网络主要是通过设计的滤波器与图像进行卷积操作,提取图片中的某些特征,歃歎歎的主要思想是通过滤波器不断提取特征从局部特征到整体特征,从而对物体进行识别。
二、算法推导
1、边缘检测示例
假如有一张图像,想让计算器搞清楚图片上有什么物体,可以做的事情是检测图像的水平边缘与垂直边缘。
图1是一个
6
×
6
6×6
6×6的灰度图像,构造一个
3
×
3
3×3
3×3的矩阵,在卷积神经网络中通常称为filter,对这个
6
×
6
6×6
6×6的图像进行卷积运算得到
4
×
4
4×4
4×4的矩阵,以左上角的-5为例:
3
∗
1
+
0
∗
0
+
1
∗
(
−
1
)
+
1
∗
1
+
5
∗
0
+
8
∗
(
−
1
)
+
2
∗
1
+
7
∗
0
+
2
∗
(
−
1
)
=
−
5
3*1+0*0+1*(-1)+1*1+5*0+8*(-1)+2*1+7*0+2*(-1)=-5
3∗1+0∗0+1∗(−1)+1∗1+5∗0+8∗(−1)+2∗1+7∗0+2∗(−1)=−5
为什么这种卷积计算可以得到图像的边缘,下图0表示图像暗色区域,10为图像比较亮的区域,同样用一个
3
∗
3
3*3
3∗3过滤器,对图像进行卷积,得到的图像中间亮,两边暗,亮色区域就对应图像边缘。
通过以下的垂直过滤器与水平过滤器可以实现垂直边缘与水平边缘的检测
以下列出了一些常用的过滤器,对于不同的过滤器也有着不同的争论,在卷积神经网络中把这些过滤器当成我们要学习的参数,卷积神经网络训练的目标就是去理解过滤器的参数.
2、Padding
在上部分中,通过一个 3 ∗ 3 3*3 3∗3的过滤器来对 6 ∗ 6 6*6 6∗6的图像进行卷积,得到了一幅 4 ∗ 4 4*4 4∗4的图像,假设输出图像大小为 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).
这样做卷积运算的缺点是,卷积图像的大小会不断缩小,另外图像的左上角的元素只被一个输出所使用,所以在图像边缘的像素在输出中采用较少,也就意味着你丢掉了很多图像边缘的信息,为了解决这两个问题,就引入了padding操作,也就是在图像卷积操作之前,沿着图像边缘用0进行图像填充。对于 3 ∗ 3 3*3 3∗3的过滤器,我们填充宽度为1时,就可以保证输出图像和输入图像一样大。
经过padding之后,原始图片尺寸为
(
n
+
2
p
)
∗
(
n
+
2
p
)
(n+2p) * (n+2p)
(n+2p)∗(n+2p),filter尺寸为
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+2p−f+1)∗(n+2p−f+1)。若要保证卷积前后图片尺寸不变,则p应满足:
没有padding操作,
p
=
0
p=0
p=0,我们称之为“Valid convolutions”;有padding操作,
p
=
f
−
1
2
p = \frac{{f - 1}}{2}
p=2f−1,我们称之为“Same convolutions”。
3、Stride
卷积步长是指过滤器在图像上滑动的距离,前两部分步长都默认为1,如果卷积步长为2,卷积运算过程为:
我们用s表示stride长度,p表示padding长度,如果原始图片尺寸为
n
∗
n
n * n
n∗n,filter尺寸为
f
∗
f
f * f
f∗f,则卷积后的图片尺寸为:
上式中,
⌊
⌋
\left\lfloor {} \right\rfloor
⌊⌋表示向下取整。
4、彩色图像卷积
以上讲述的卷积都是灰度图像的,如果想要在RGB图像上进行卷积,过滤器的大小不在是 3 ∗ 3 3*3 3∗3而是有 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3,最后的3对应为通道数(channels),卷积生成图像中每个像素值为 3 ∗ 3 ∗ 3 3*3*3 3∗3∗3过滤器对应位置和图像对应位置相乘累加,过滤器依次在RGB图像上滑动,最终生成图像大小为 4 ∗ 4 4*4 4∗4。
另外一个问题是,如果我们在不仅仅在图像总检测一种类型的特征,而是要同时检测垂直边缘、水平边缘、45度边缘等等,也就是多个过滤器的问题。如果有两个过滤器,最终生成图像为
4
∗
4
∗
2
4*4*2
4∗4∗2的立方体,这里的2来源于我们采用了两个过滤器。如果有10个过滤器那么输出图像就是
4
∗
4
∗
10
4*4*10
4∗4∗10的立方体。
5、单层卷积神经网络
相比之前的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b.在图10中,每个过滤器的参数的个数为:
3
∗
3
∗
3
+
1
=
28
3*3*3+1=28
3∗3∗3+1=28个参数,
3
∗
3
∗
3
3*3*3
3∗3∗3为过滤器的大小,1为偏差系数。如果有10个过滤器,那么总的参数个数为
28
∗
10
=
280
28*10=280
28∗10=280个。最后,总结一下CNN单层结构的所有标记符号,设层数为
l
l
l。
f
[
l
]
=
f
i
l
t
e
r
s
i
z
e
{f^{[l]}} = filtersize
f[l]=filtersize
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\ of \ filters
nc[l]=number of filters
输入维度为:
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[l−1]×nW[l−1]×nc[l−1]
每个滤波器的维度为:
f
[
l
]
×
f
[
l
]
×
n
c
[
l
−
1
]
{f^{[l]}} \times {f^{[l]}} \times n_c^{[l - 1]}
f[l]×f[l]×nc[l−1]
权重维度为:
f
[
l
]
×
f
[
l
]
×
n
c
[
l
−
1
]
×
n
c
[
l
]
{f^{[l]}} \times {f^{[l]}} \times n_c^{[l - 1]} \times n_c^{[l]}
f[l]×f[l]×nc[l−1]×nc[l]
偏置维度为:
1
×
1
×
1
×
n
c
[
l
]
1 \times 1 \times 1 \times 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、简单卷积神经网络示例
该CNN模型如图11所示,
a
[
3
]
{a^{[3]}}
a[3]的维度是7740,将
a
[
3
]
{a^{[3]}}
a[3]排成1列,维度为1960*1,然后连接最后一级输出层,输出层可以是二分类(logistic),也可以是多分类(softmax),最后得到预测输出
y
^
\widehat y
y
.CNN有三种类型的layer:卷积层,池化层,全连接层。
池化层是CNN用来减小尺寸,提高运算速度的,同样能减小nosie影响,让各特征更具有健壮性。池化中的maxpooling是求滤波器滑动区域内的最大值,池化中的averagepooling是求滤波器滑动区域内的平均值。