卷积,特征图,转置卷积和空洞卷积的计算细节

转载自:https://www.jianshu.com/p/09ea4df7a788?utm_source=oschina-app

这篇文章写的超详细!!!!:https://www.cnblogs.com/cvtoEyes/p/8513958.html

============================================================

最近在做姿态估计的项目,在定制和实现卷积网络的时候发现自己对里面的一些计算细节还不够了解,所以整理了该文章,内容如下:

  • 卷积计算过程(单 / RGB 多通道)
  • 特征图大小计算公式
  • 转置卷积(反卷积)的计算过程
  • 空洞卷积的计算过程

该文章只单纯的讲解计算的细节,关于对应的原理和证明可以戳尾部的参考文献。


卷积计算过程(单 / RGB 多通道)


假设输入层的大小为 5 x 5,局部感受野(或称卷积核)的大小为 3 x 3,那么输出层一个神经元所对应的计算过程(下文简称「卷积计算过程」)如下:

卷积计算过程

上述计算对应的公式如下:

其中 I 表示输入,W 表示卷积对应的权重。

每个卷积核对应的权重 W 在计算卷积过程中,值是固定的,我们称为权重共享

然后,将值输入到激活函数 σ 中获得输出值。

如果将输入层想像成黑板,局部感受野就像是黑板擦,他会从左往右,从上至下的滑动,每次滑动 1 个步长(Stride)并且每次滑动都重复上述的计算过程,我们就可以得到输出的特征图(feature map),如下图所示:

卷积过程,蓝色表示输入,绿色表示输出

有时候,按照规定步数滑动到黑板边缘时,黑板擦一部分会露出在黑板外,这个时候就 不能够顺利执行卷积过程了,解决的方法是填充,常见的有两种填充(Padding)方法,第一种方法为 Valid,第二种方法为 Same,如下图所示:

Valid 填充方法

Valid 是丢弃的方法,比如上述的 input_width = 7,kernel_width = 5,stride = 3,只允许滑动 1 次,多余的元素则丢掉。

image.png

Same 是补全的方法,对于上述的情况,允许滑动 3 次,但是需要补 4 个元素,左边补 2 个 0,右边补 2 个 0,这种方法则不会抛弃边缘的信息,关于如何计算填充数量会在下小节中讲到。

在实际应用中,输入的都为彩色图像(RGB 三通道),也就是说输入的维度是 [图片数,图片高,图片宽,通道数],这个时候,执行卷积的过程如下:

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])来表示

矩阵 C

那么,转置卷积就可以理解为是

空洞卷积的计算过程

空洞卷积(Dilated convolutions)在卷积的时候,会在卷积核元素之间塞入空格,如下图所示:

空洞卷积过程,蓝色表示输入,绿色表示输出

这里引入了一个新的超参数 d,(d - 1) 的值则为塞入的空格数,假定原来的卷积核大小为 k,那么塞入了 (d - 1) 个空格后的卷积核大小 n 为:

进而,假定输入空洞卷积的大小为 i,步长 为 s ,空洞卷积后特征图大小 o 的计算公式为:

参考资料



========================

在看图像语义分割方面的论文时,发现在网络解码器结构中有的时候使用反卷积、而有的时候使用unpooling或或者unsampling,查了下资料,发现三者还是有不同的。这里记录一下。

图示理解
使用三张图进行说明: 


图(a)表示UnPooling的过程,特点是在Maxpooling的时候保留最大值的位置信息,之后在unPooling阶段使用该信息扩充Feature Map,除最大值位置以外,其余补0。与之相对的是图(b),两者的区别在于UnSampling阶段没有使用MaxPooling时的位置信息,而是直接将内容复制来扩充Feature Map。从图中即可看到两者结果的不同。图(c)为反卷积的过程,反卷积是卷积的逆过程,又称作转置卷积。最大的区别在于反卷积过程是有参数要进行学习的(类似卷积过程),理论是反卷积可以实现UnPooling和unSampling,只要卷积核的参数设置的合理。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值