[CNN] 卷积、反卷积、池化、反池化「建议收藏」

[CNN] 卷积、反卷积、池化、反池化「建议收藏」之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积、反卷积、池化、反池化的内容。一、卷积1、卷积的简单定义卷积神经网络中的卷积操作可以看做是输入和卷积核的内积运算。其运算过程非常容易理解,下面会有详细解释。2、举例解释(1)为了方便直接解释,我们首先以一个通道为例进行讲解,首先明确概念:1)输入是一个5*5的图片,其像素值如下:[11100011100011100110011…

大家好,又见面了,我是你们的朋友全栈君。

之前一直太忙,没时间整理,这两天抽出点时间整理一下卷积、反卷积、池化、反池化的内容,也希望自己对一些比较模糊的地方可以理解的更加清晰。

一、卷积

1、卷积的简单定义

卷积神经网络中的卷积操作可以看做是输入和卷积核的内积运算。其运算过程非常容易理解,下面有举例。

2、举例解释

(1)为了方便直接解释,我们首先以一个通道(若是彩图,则有RGB的颜色,所以是三个通道)为例进行讲解,首先明确概念:

1) 输入是一个5*5的图片,其像素值如下:
[ 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 ] \begin{bmatrix} 1 & 1 &1 & 0 & 0\\ 0 & 1 & 1 &1 & 0\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 &0 \\ 0 &1 &1 & 0 &0 \end{bmatrix} 1000011001111110111000100
2)卷积核(kernel)是需要训练的参数,这里为了讲解卷积运算的操作,所以最开始我们假设卷积核的值如下:
[ 1 0 1 0 1 0 1 0 1 ] \begin{bmatrix} 1 & 0 &1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \\ \end{bmatrix} 101010101
3)通过窗口和卷积核的内积操作得到的结果叫做feature map。

(2)如下图所示(对应的是上面提到的数据),我们在输入图片上框出一个和卷积核相同大小的区域,基于此计算子区域和卷积核对应元素乘积之和:
注: 本节图形来自对FCN及反卷积的理解


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 4 1*1 + 1*0+1*1+0*0+1*1+1*0+0*1+0*0+1*1=4 11+10+11+00+11+10+01+00+11=4
所以feature map的第一个元素值为4。

(3)接着计算第二个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 = 3 1*1+1*0+0*1+1*0+1*1+1*0+0*1+1*0+1*1=3 11+10+01+10+11+10+01+10+11=3
所以feature map的第二个元素值为3。

(4)接着计算第三个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

1 ∗ 1 + 0 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 = 4 1*1+0*0+0*1+1*0+1*1+0*0+1*1+1*0+1*1=4 11+00+01+10+11+00+11+10+11=4
所以feature map的第三个元素值为4。

(5)接着计算第四个子区域和卷积核的对应元素乘积之和,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

0 ∗ 1 + 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 0 + 0 ∗ 1 + 1 ∗ 0 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 1 = 2 0*1+1*0+1*1+0*0+0*1+1*0+0*1+0*0+1*1=2 01+10+11+00+01+10+01+00+11=2
所以feature map的第四个元素值为2。

(6)以此类推,不断执行,最后得到的feature map如下:

[ 4 3 4 2 4 3 2 3 4 ] \begin{bmatrix} 4 & 3&4 \\ 2 & 4 & 3 \\ 2& 3 & 4 \\ \end{bmatrix} 422343434
(7)下面的动图可以连贯的展示上面的过程,可以帮助更直观的理解:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

3、多个输入通道

若输入含有多个通道,则对于某个卷积核,分别对每个通道求feature map后将对应位置相加得到最终的feature map,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

4、多个卷积核

若有多个卷积核,则对应多个feature map,也就是下一个输入层有多个通道。如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

5、步数的大小

上述展示的步长为1的情况,若步长为2,则滑动窗口每2步产生一个,如下图所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

输入大小为 5 ∗ 5 5*5 55,卷积核的大小为 3 ∗ 3 3*3 33,第一个滑动窗口为红色部分,第二个滑动窗口为绿色部分,第三个滑动窗口为紫色部分,第四个滑动窗口为蓝色部分,所以最后的feature map的大小为 2 ∗ 2 2*2 22

若假设输入大小是 n ∗ n n*n nn,卷积核的大小是 f ∗ f f*f ff,步长是 s s s,则最后的feature map的大小为 o ∗ o o*o oo,其中 o o o如下:
o = ⌊ n − f s ⌋ + 1 o=\left \lfloor \frac{n-f}{s} \right \rfloor+1 o=snf+1

6、三种模式:Full,Same和Valid


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

如上图所示,3种模式的主要区别是从哪部分边缘开始滑动窗口卷积操作,区别如下:

Full模式:第一个窗口只包含1个输入的元素,即从卷积核(fileter)和输入刚相交开始做卷积。没有元素的部分做补0操作。
Valid模式:卷积核和输入完全相交开始做卷积,这种模式不需要补0。
Same模式:当卷积核的中心C和输入开始相交时做卷积。没有元素的部分做补0操作。

在之前讲到的内容使用的是Valid的模式。

6、Full,Same和Valid下的feature map的大小

(1)若输入大小是 n ∗ n n*n nn,卷积核大小为 f ∗ f f*f ff,步长为 s s s,若采用Full或Same模式,假设填充大小为 p p p p p p为一边填充的大小,举例:如果输出 5 ∗ 5 5*5 55,卷积核 3 ∗ 3 3*3 33,采用Full模式,则 p = 2 p=2 p=2),则feature map的大小是: ( ⌊ n + 2 p − f s ⌋ + 1 ) ∗ ( ⌊ n + 2 p − f s ⌋ + 1 ) (\left \lfloor \frac{n+2p-f}{s} \right \rfloor+1)*(\left \lfloor \frac{n+2p-f}{s} \right \rfloor+1) (sn+2pf+1)(sn+2pf+1)
(2)若输入大小是 n ∗ n n*n nn,卷积核大小为 f ∗ f f*f ff,步长为 s s s,若不补0,即Valid模式下,feature map的大小为: ( ⌊ n − f s ⌋ + 1 ) ∗ ( ⌊ n − f s ⌋ + 1 ) (\left \lfloor \frac{n-f}{s} \right \rfloor+1)*(\left \lfloor \frac{n-f}{s} \right \rfloor+1) (snf+1)(snf+1)
(3)Same模式下,feature map的维度和输入维度相同。

注意:卷积核大小一般为奇数,原因如下:

①当卷积核为偶数时,p不为整数,假设是Same模式,若想使得卷积之后的维度和卷积之前的维度相同,则需要对图像进行不对称填充,较复杂。
②当kernel为奇数维时,有中心像素点,便于定位卷积核。

5、卷积特点

(1)局部视野
卷积操作在运算的过程中,一次只考虑一个窗口的大小,因此其具有局部视野的特点,局部性主要体现在窗口的卷积核的大小。
(2)参数减少
比如,在上述输入为 5 ∗ 5 5*5 55,卷积核为 3 ∗ 3 3*3 33,输出为 3 ∗ 3 3*3 33的例子中,如果是使用NN,则其参数个数为 ( 5 ∗ 5 ) ∗ ( 3 ∗ 3 ) (5*5)*(3*3) (55)(33)。而在CNN中,其参数个数为卷积核的大小 3 ∗ 3 3*3 33
这只是简单的情况,若输入非常大,卷积核通常不是很大,此时参数量的差距将会非常明显。
(3)权重共享
从上面的讲解可以看到,对一个输入为 5 ∗ 5 5*5 55,卷积核为 3 ∗ 3 3*3 33的情况下,对于每一个滑动窗口,使用的都是同一个卷积核,所以其参数共享。
(4)多个卷积核可以发现不同角度的特征,多个卷积层可以捕捉更全局的特征(处于卷积网络更深的层或者能够的单元,他们的接受域要比处在浅层的单元的接受域更大)。详见下图(图片来源:花书):


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

可以看到, h 2 h_2 h2的接受域是 x 1 , x 2 , x 3 x_1, x_2,x_3 x1,x2,x3,而 g 3 g_3 g3的接受域是 x 1 , x 2 , x 3 , x 4 , x 5 x_1, x_2,x_3,x_4,x_5 x1,x2,x3,x4,x5

二、反卷积

为了更深度的了解反卷积,现在还来看下卷积的数学操作。

1、卷积的数学操作
上述是比较直观的图形展示的例子,如果把卷积操作写成矩阵相乘,则对于 4 ∗ 4 4*4 44的输入和 3 ∗ 3 3*3 33的卷积核的结果如下:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

[ c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 0 0 0 0 0 0 c 11 c 12 c 13 0 c 21 c 22 c 23 0 c 31 c 32 c 33 ] [ x 11 x 12 x 13 x 14 x 21 x 22 x 23 x 24 x 31 x 32 x 33 x 34 x 41 x 42 x 43 x 44 ] = [ y 11 y 12 y 21 y 22 ] \begin{bmatrix} c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23} & 0 & c_{31} & c_{32} & c_{33} & 0 & 0 &0 & 0 & 0\\ 0 & c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23}& 0 & c_{31} & c_{32} & c_{33} & 0 & 0 &0 & 0 \\ 0 & 0 &0 & 0 & c_{11} & c_{12} &c_{13} & 0 & c_{21} & c_{22} & c_{23}& 0 & c_{31} & c_{32} & c_{33} & 0 \\ 0 & 0 &0 & 0 & 0 & c_{11} & c_{12} &c_{13}& 0 & c_{21} & c_{22} & c_{23} & 0 & c_{31} & c_{32} & c_{33} \end{bmatrix}\begin{bmatrix} x_{11}\\ x_{12}\\ x_{13}\\ x_{14}\\ x_{21}\\ x_{22}\\ x_{23}\\ x_{24}\\ x_{31}\\ x_{32}\\ x_{33}\\ x_{34}\\ x_{41}\\ x_{42}\\ x_{43}\\ x_{44} \end{bmatrix}=\begin{bmatrix} y_{11}\\ y_{12}\\ y_{21}\\ y_{22} \end{bmatrix} c11000c12c1100c13c12000c1300c210c110c22c21c12c11c23c22c13c120c230c13c310c210c32c31c22c21c33c32c23c220c330c2300c31000c32c3100c33c32000c33x11x12x13x14x21x22x23x24x31x32x33x34x41x42x43x44=y11y12y21y22
最后得到一个 4 ∗ 1 4*1 41的矩阵,可以reshape成 2 ∗ 2 2*2 22的矩阵,便是最后卷积的结果。

2、反卷积的数学操作
反卷积的操作就相当于对上述 y y y左乘 c T c^T cT,维度如下: c T c^T cT的维度是 16 ∗ 4 16*4 164 y y y的维度是 4 ∗ 1 4*1 41,故 c T y c^Ty cTy的维度是 16 ∗ 1 16*1 161,可以将其reshape成 4 ∗ 4 4*4 44便变回了原来的维度。

3、反卷积和卷积的关系
反卷积就是特殊的卷积,是使用Full模式的卷积操作,便可以将输入还原,在tensorFlow中,反卷积的操作也是卷积操作。
注意:
在卷积操作中: c x = y cx=y cx=y
在反卷积操作中: c T y = x c^Ty=x cTy=x,这里并不是严格意义上的等于,而只是维度的相等,因为 c c c c T c^T cT都是训练,并不是直接取转置。


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

三、池化

池化的定义比较简单,最直观的作用便是降维,常见的池化有最大池化、平均池化和随机池化。
池化层不需要训练参数。

1、三种池化示意图

最大池化是对局部的值取最大;平均池化是对局部的值取平均;随机池化是根据概率对局部的值进行采样,采样结果便是池化结果。概念非常容易理解,其示意图如下所示:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

2、三种池化的意义

(1)最大池化可以获取局部信息,可以更好保留纹理上的特征。如果不用观察物体在图片中的具体位置,只关心其是否出现,则使用最大池化效果比较好。
(2)平均池化往往能保留整体数据的特征,能凸出背景的信息。
(3)随机池化中元素值大的被选中的概率也大,但不是像最大池化总是取最大值。随机池化一方面最大化地保证了Max值的取值,一方面又确保了不会完全是max值起作用,造成过度失真。除此之外,其可以在一定程度上避免过拟合。

3、重叠池化

一般在CNN中使用的池化都是不重叠的,但是池化也可以重叠,重叠池化和卷积操作类似,可以定义步长等参数,其和卷积的不同在于:卷积操作将窗口元素和卷积核求内积,而池化操作求最大值/平均值等,窗口的滑动等原理完全相同。

四、反池化

池化操作中最常见的最大池化和平均池化,因此最常见的反池化操作有反最大池化和反平均池化,其示意图如下:


[CNN] 卷积、反卷积、池化、反池化「建议收藏」

反最大池化需要记录池化时最大值的位置,反平均池化不需要此过程。

五、参考文章:

[1] A guide to convolution arithmetic for deep learning
[2] 深度学习(书)
[3] deeplearning(ng)
[4] https://github.com/vdumoulin/conv_arithmetic
[5] 深度理解反卷积操作

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/142865.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号