深度学习网络层之上采样(Unpooling)

之前一篇博文中介绍了深度学习中的pooling层,在本篇中主要介绍转置卷积这种上采样操作。转置卷积也是一种卷积

L2 pooling

\[a^l={1\over k}\sqrt{\sum_{j=1}^k(a_j^{l-1})^2} \]

pooling除了仅输出一个值, 也可以输出top k个(mix pooling).

CNN中的上采样

Unpooling:

  • 近邻,以复制的方式.

  • "Bed of Nails":其他位置用0填充

  • "Max Unpooling" 在对称的max pooling中记录最大值的位置,在unpooling时将最大值位置设置为特征值,其他位置置0.

  • 转置卷积:Transpose Convolution,参数可学习,而上述的上采样方式都是固定的函数,不可学习.

转置卷积

转置卷积计算过程是将输入的每个元素值作为卷积核的权重,相乘后作为该元素对应的上采样输出,不同输入的重叠的输出部分直接相加作为输出.示意图如下:

trans-conv-1D

2-D转置卷积操作:在输入的相邻像素间填充stride-1个0,再在边缘填充kernel_size - 1 - crop个 zero-padding,再进行卷积运算。最后一步还要进行裁剪。

transpose_conv

转置卷积运算示意图如下:[1]

转置卷积运算

为什么叫转置卷积? 因为卷积的 im2col 矩阵乘实现中对卷积核展开成了二维的矩阵, 大小如\(k^2\times n\),而转置卷积中需要的卷积矩阵的维度是\(n\times k^2\), 所以在形式上是转置的形式.

转置卷积也被称为小数步长卷积(Fractionally Strided Convolution),如果前向卷积中步长\(s>1\),那么转置卷积中步长\(s'<1\),但是小于1的步长不能够直接实现,可以从另外的方式实现:在输入特征单元之间插入 s−1 个0,此时步长 s′ 设置为1,不再是小数。[2]
输入输出尺度关系:[3]
一般前向卷积中\(o=\lfloor{i+2p-k\over s}\rfloor+1\),如果\(i+2p-k\)是s的整数倍,那么转置卷积中: \(o'= s(i' −1)+k −2p\), (\(k'=k,s'=1,p'=k-p-1\)).

转置卷积的用途

  • CNN可视化:通过转置卷积将feature map还原到像素空间,以观察特定的feature map对哪些pattern的图片敏感。
  • 上采样:在图像语义分割或生成对抗网络中需要像素级别的预测,需要较高的图像尺寸。

参考:


  1. 手写代码实现 https://www.jianshu.com/p/f0674e48894c ↩︎

  2. https://buptldy.github.io/2016/10/29/2016-10-29-deconv/ ↩︎

  3. http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html#transposed-convolution-arithmetic ↩︎

posted @ 2018-05-08 16:57  康行天下  阅读(15123)  评论(0编辑  收藏  举报