两个原则
全连接的线性变换由于前一层和后一层所有的神经元之间都有一对一的连接关系,也称为稠密连接层(Dense Layer)。在实际的应用过程中,这种神经元之间关系的描述可能有许多冗余,对于神经网络模型的训练并不是很友好。为此,人们发明了一系列稀疏(Spare)的连接方式来描述前后两层神经元之间的连接关系,其中最有名的一个就是卷积层(Convolution Layer),对应的神经网络称为卷积神经网络(Convolution Neural Networks,CNN)。
卷积常用于计算机视觉,在边缘检测、锐化等方面有应用,卷积层中一个最重要的东西为卷积核,也称为权重,它通常是一个行列数相等的矩阵,卷积核中的每个分量都是可训练的实数,它的作用就是将输入数据(比如灰度图片数据,形式就是一个矩阵)通过运算输出,具体步骤后面介绍。
先引入卷积的两个原则:1,平移不变性;2,局部性。
平移不变性:
当我们要观测一张图片中的某个事物时,不应该受到该事物在图片中的位置的影响,也就是说,当我们在对一张图片数据做卷积变换的时候,这个事物所属区域经过运算得到的输出并不会因为该区域的不同而不同,意思就是卷积核不变。
局部性:
一张图片中的某个事物只与该事物的所属局部区域相关,并不会扩展到整张图片。所以在进行卷积变换时,输入不需要是整张图片的数据,而是从图片中取出的一块区域。
具体计算步骤
在运算过程中,需要从输入图片中取出和卷积和大小相同的一块区域,然后把区域里面的数,和卷积核的权重按照以一对的方式相乘,并把所有的乘积求和作为最后的输出。通过变化区域位置(可以将这个区域看做一个窗口,可以左右上下平移,得到不同的数据)可以得到新的输出,这个过程即为卷积的过程。
假如有一张灰度图,表示成矩阵的形式作为总的输入数据(input),大小为3x3。由平移不变性,我们先定义一个卷积核(Kernel),大小为2x2(后面卷积核可以通过训练得到)。在由局部性,我们从该图片数据中依次选取2x2大小的区域。卷积层的输入输出由下图所示:
对应的运算为:
一般化,我们将输入X定义为
n
w
×
n
h
n_w\times{n_h}
nw×nh大小的矩阵,卷积核为
k
w
×
k
h
k_w\times{k_h}
kw×kh大小的矩阵,通过以上的运算定义,不难发现,输出Y的形状由输入X的形状和卷积核的形状所决定,有以下关系:
Y
w
=
n
w
−
k
w
+
1
;
Y
h
=
n
h
−
k
h
+
1
Y_w=n_w-k_w+1;Y_h=n_h-k_h+1
Yw=nw−kw+1;Yh=nh−kh+1
其中
Y
w
、
Y
h
Y_w、Y_h
Yw、Yh分别表示输出宽度与高度。上面式子得出是由于每次运算的数据形状必须和卷积核相同,而且要保证区域整体在整个数据内。
上述运算可写作:
Y
=
X
∗
W
+
b
Y = X*W+b
Y=X∗W+b
这里的
∗
*
∗为矩阵的点乘,b为大小与输出一样的偏置项(bias),W与b都是可学习的参数。
填充与步幅
卷积层中有几个超参数需要确定,分别为卷积核的大小、填充、步幅。
填充:
前面可以发现,输入图像与卷积核进行卷积后的结果中损失了部分值,输入图像的边缘被“修剪”掉了(边缘处只检测了部分像素点,丢失了图片边界处的众多信息)。
所以,需要在原数据上多添加行和列,使裁剪时能包含全原数据的信息。至少需要填充
K
h
−
1
K_h-1
Kh−1行,
K
w
−
1
K_w-1
Kw−1列才能在卷积时取到全部。根据输出的形状公式算出此时输出的形状为
(
n
h
,
n
w
)
(n_h,n_w)
(nh,nw)。
步幅:
步幅的设置主要是为了计算量的减小。
因为当给定输入为224x224的矩阵时,在使用5x5卷积核的情况下,如果使用步幅为1(每次的裁剪区域按一个单位移动),需要55层卷积层才能将输出降低为4x4,耗费计算资源大。
为了解决这一问题,可以设置大一点的步幅,如下图:
加入填充与步幅之后的输出形状为:
[
(
n
h
−
k
h
+
p
h
+
s
h
)
/
s
h
]
×
[
(
n
w
−
k
w
+
p
w
+
s
w
)
/
s
w
]
[(n_h-k_h+p_h+s_h)/s_h]\times[(n_w-k_w+p_w+s_w)/s_w]
[(nh−kh+ph+sh)/sh]×[(nw−kw+pw+sw)/sw]
其中
p
h
,
s
h
p_h,s_h
ph,sh为高的填充与高方向的步幅,注意如果代码里面是padding=1的话那这里的
p
h
p_h
ph就是2,类似的
p
w
,
s
w
p_w,s_w
pw,sw也一样。
一般来说,卷积核的长宽为奇数,而且取的填充为
p
h
=
k
n
−
1
,
p
w
=
k
w
−
1
p_h=k_n-1,p_w=k_w-1
ph=kn−1,pw=kw−1,此时的输出形状变为:
[
(
n
h
+
s
h
−
1
)
/
s
h
]
×
[
(
n
w
+
s
w
−
1
)
/
s
w
]
[(n_h+s_h-1)/s_h]\times[(n_w+s_w-1)/s_w]
[(nh+sh−1)/sh]×[(nw+sw−1)/sw]
多输入输出通道
多输入单输出通道
通常我们输入的是一张彩色图,而不是一张灰度图,所以一般会有3个channel,这时的卷积核的维度需要提高,从(
k
w
k_w
kw,
k
h
k_h
kh)变为(
c
i
c_i
ci,
k
w
k_w
kw,
k
h
k_h
kh),这里的
c
i
c_i
ci为输入的channel数,将输入的每一个channel对应一个不同的卷积核,做上述灰度图的运算,再将每一个channel的输出相加得到最后的输出。
多输入多输出通道
有时候的输出需要多个channel,所以在多输入单输出的维度上再改变卷积核,这时候需要将卷积核的维度再次提高,从多输入单输出的(
c
i
c_i
ci,
k
w
k_w
kw,
k
h
k_h
kh)变为(
c
0
c_0
c0,
c
i
c_i
ci,
k
w
k_w
kw,
k
h
k_h
kh),这里
c
0
c_0
c0指的是要求输出的channel数,比如3个channel的输入要转换为2个channel的输出,这里的
c
0
c_0
c0就为2,
c
i
c_i
ci就为3。在每一个
c
0
c_0
c0的维度上做多输入单输出的运算,得到
c
0
c_0
c0个channel的输出。
参考资料:李沐—动手学深度学习v2