every blog every motto: We would rather reuse an active dwarf than a sleeping giant.

0. 前言

一直划水。。。

1. 正文

1.1 Conv2D

说明: 关于这部分之前有写过,所以就不详细展开了,具体可以参考参考文章1 参考文章2

pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM

pytorch实现CONVLSTM pytorch convtranspose_卷积核_02

输出特征图计算:

pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_03

1.2 Conv2DTranspose

Conv2DTranspose一般称为反卷积、逆卷积等,对图片进行一个上采样过程,即放大图片。 主要通过三步进行:

  1. 对输入特征图m进行变换,生成新的输入特征图m’
  2. 对卷积核k进行变换,生成新的卷积核k’
  3. 用上面产生的新的输入特征图和新的卷积核进行1.1中的常规卷积操作

变量说明: 输入特征图:(H,W) 卷积核:(K,K),步幅:S,填充padding


pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_04

1.2.1 分步骤讲解

第一步:对输入特征图进行变换

对输入特征图进行插值,输入特征图值之间插0,如下图

pytorch实现CONVLSTM pytorch convtranspose_卷积_05

当然,具体来说:

两个相邻位置中间的插0个数: S-1

对应输入的高为H,中间有(H-1)个空隙,则

高度方向上总插0个数: (H-1)*(S-1)


新的输入特征图的大小,以高度为例: H’ = H + (H-1)*(S-1)

第二步:对卷积核进行变换

说明: 准确说是填充变换。

  1. 卷积核大小不变:(K,K)
  2. 步幅,S’=1 ,这里不好理解,后面解释
  3. 填充:padding’ = K-padding-1
第三步:普通卷积操作

由1.1知,普通卷积的特征图变换为

pytorch实现CONVLSTM pytorch convtranspose_ide_06 将第一、二步中变换的结果代入上式,的

pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_07 化简,得:pytorch实现CONVLSTM pytorch convtranspose_卷积_08 上式中分母步幅为1,则最终结果为:pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_09

至此, Conv2D和Conv2DTranspose 在输入和输出形状方面互为倒数。

关于步幅:说明: 仅做一般性说明,非严格计算,此部分不理解可以跳过,回头再看。

  1. 正常卷积(大图变小图)情况下: 输入(5,5),步幅(2,2),输出(3,3)
  2. 逆卷积操作中, 小图变大图,输入(3,3)输出(5,5)

pytorch实现CONVLSTM pytorch convtranspose_卷积_10

强调:

逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。

逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。

逆卷积Conv2DTranspose中有步幅这一个参数,具体来说应该是卷积(大图变小图)的步幅,即有(5,5)到(3,3)的步幅,逆卷积操作的步幅永远为1。


其中有两个步幅的概念!

  • Conv2DTranspose中的参数步幅实际是大图变小图的步幅。
  • 上面第三步的步幅始终为1。

1.2.2 案例练习

1.2.2.1 当步幅stride=1
(1) 卷积

输入特征图(蓝色):(Hin,Wout)=(4,4) 卷积核:K=3,stride(S) = 1,padding=0 输出特征图(绿色):(Hout,Wout)=(2,2)

pytorch实现CONVLSTM pytorch convtranspose_ide_11


代入1.1中,输出特征图为:pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_12


(2) 逆卷积

输入特征图(蓝色):(2,2) 卷积核:K=3,stride(S)=1, padding=0 输出特征图(绿色):(4,4)

pytorch实现CONVLSTM pytorch convtranspose_ide_13

说明: 上图中的padding是Conv2DTranspose 经过三步变换以后的padding


  • 代入1.2 公式中,

pytorch实现CONVLSTM pytorch convtranspose_ide_14pytorch实现CONVLSTM pytorch convtranspose_ide_15


  • 分步骤讲解:
  1. 输入特征图变换: 步幅stride=1,输入特征图不变,即:(2,2)
  2. 卷积核变换: 卷积核不变(3,3)步幅:strdie=1 padding’ = K-p-1 即:padding = 3-0-1=2
  3. 卷积

pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_16


说明: 至此,逆卷积的两种方法结果一致。

1.2.2.2 当步幅stride=2
(1) 卷积

输入特征图(蓝色):(Hin,Wout)=(5,5)

卷积核:K=3,stride(S) = 2,padding=1

输出特征图(绿色):(Hout,Wout)=(3,3)

pytorch实现CONVLSTM pytorch convtranspose_卷积核_17


代入1.1中,输出特征图为:pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_18


(2) 逆卷积

输入特征图(蓝色):(3,3)

卷积核:K=3,stride(S)=2, padding=1

输出特征图(绿色):(5,5)

pytorch实现CONVLSTM pytorch convtranspose_pytorch实现CONVLSTM_19


  • 代入1.2 公式中,

pytorch实现CONVLSTM pytorch convtranspose_ide_14pytorch实现CONVLSTM pytorch convtranspose_ide_21


  • 分步骤讲解:
  1. 输入特征图变换: 步幅stride=2,输入特征图,(3,3)变为:(5,5)
  2. 卷积核变换: 卷积核不变(3,3)步幅改变: strdie=1 padding’ = K-p-1 即:padding = 3-1-1=1
  3. 卷积

pytorch实现CONVLSTM pytorch convtranspose_卷积核_22pytorch实现CONVLSTM pytorch convtranspose_卷积核_23

1.3 小结

  1. 正常卷积,特征图变换:

pytorch实现CONVLSTM pytorch convtranspose_卷积_24

  1. 逆卷积,特征图变换

pytorch实现CONVLSTM pytorch convtranspose_卷积_25

  1. 卷积和逆卷积特征图变换互为倒数
  2. 逆卷积(小图变大图,(3,3)到(5,5)),中参数步幅,是(大图变小图,(5,5)到(3,3))的步幅。
  3. 逆卷积进行卷积操作(前文提到第三步)中的步幅为1。

参考文献

[1] [2] [3] https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2DTranspose [4] https://zhuanlan.zhihu.com/p/31988761 [5]