最近在做姿态估计的项目,在定制和实现卷积网络的时候发现自己对里面的一些计算细节还不够了解,所以整理了该文章,内容如下:
- 卷积计算过程(单 / RGB 多通道)
- 特征图大小计算公式
- 转置卷积(反卷积)的计算过程
- 空洞卷积的计算过程
该文章只单纯的讲解计算的细节,关于对应的原理和证明可以戳尾部的参考文献。
卷积计算过程(单 / RGB 多通道)
假设输入层的大小为 5 x 5,局部感受野(或称卷积核)的大小为 3 x 3,那么输出层一个神经元所对应的计算过程(下文简称「卷积计算过程」)如下:
上述计算对应的公式如下:
其中 I 表示输入,W 表示卷积对应的权重。
每个卷积核对应的权重 W 在计算卷积过程中,值是固定的,我们称为权重共享。
然后,将值输入到激活函数 σ 中获得输出值。
如果将输入层想像成黑板,局部感受野就像是黑板擦,他会从左往右,从上至下的滑动,每次滑动 1 个步长(Stride)并且每次滑动都重复上述的计算过程,我们就可以得到输出的特征图(feature map),如下图所示:
有时候,按照规定步数滑动到黑板边缘时,黑板擦一部分会露出在黑板外,这个时候就 不能够顺利执行卷积过程了,解决的方法是填充,常见的有两种填充(Padding)方法,第一种方法为 Valid,第二种方法为 Same,如下图所示:
Valid 是丢弃的方法,比如上述的 input_width = 7,kernel_width = 5,stride = 3,只允许滑动 1 次,多余的元素则丢掉。
Same 是补全的方法,对于上述的情况,允许滑动 3 次,但是需要补 4 个元素,左边补 2 个 0,右边补 2 个 0,这种方法则不会抛弃边缘的信息,关于如何计算填充数量会在下小节中讲到。
在实际应用中,输入的都为彩色图像(RGB 三通道),也就是说输入的维度是 [图片数,图片高,图片宽,通道数],这个时候,执行卷积的过程如下:
特征图大小的计算公式
我们在设计和调整网络结构的时候,还需要快速知道调整了卷积核后,输出特征图的大小,假定:
- 输入图片 i(只考虑输入宽高相等)
- 卷积核大小 f
- 步长 s
- 填充的像素数 p
那么输出的特征图大小 o 的计算公式则如下:
o 值的大小与 i,f,p,s 这四个变量相关,也和填充的方式有关。
- 当填充方式为 VALID 时,p 值等于 0,代入相应的 i,f,p,s 就可以相应的计算出 o 值了。
- 当填充方式为 SAME 时,步长 s 为 1 时,输出的 o == i,我们则可以计算出相应的 P 值为 p = (f-1) / 2
转置卷积(反卷积,逆卷积)的计算过程
在理解转置卷积(Transposed Convolution)计算过程之前,先来看一下如何用矩阵相乘的方法代替传统的卷积。
假设一个卷积操作,它的输入是 4x4,卷积核大小是 3x3,步长为 1x1,填充方式为 Valid 的情况下,输出则为 2x2,如下图所示:
我们将其从左往右,从上往下以的方式展开,
- 输入矩阵可以展开成维数为 [16, 1] 的矩阵,记作 x
- 输出矩阵可以展开成维数为 [4, 1] 的矩阵,记作 y
- 卷积核可以表示为 [4, 16] 的矩阵,记作 C,其中非 0 的值表示卷积对应的第 i 行 j 列的权重。
- 所以卷积可以用 y = C * x ([4, 1] = [4, 16] * [16, 1])来表示
那么,转置卷积就可以理解为是
空洞卷积的计算过程
空洞卷积(Dilated convolutions)在卷积的时候,会在卷积核元素之间塞入空格,如下图所示:
这里引入了一个新的超参数 d,(d - 1) 的值则为塞入的空格数,假定原来的卷积核大小为 k,那么塞入了 (d - 1) 个空格后的卷积核大小 n 为:
进而,假定输入空洞卷积的大小为 i,步长 为 s ,空洞卷积后特征图大小 o 的计算公式为: