转置卷积又被成为反卷积。
卷积过程:Input:4*4,Kernel:3*3,Output:2*2

  • 反卷积从宏观角度命名,首先将2*2输入矩阵重新排列成4*1,再将3*3重新排列成4*16的卷积核转置为16*4,两者运算得到16*1的矩阵经过重新排列最终得到4*4矩阵。
  • 转置卷积从具体实现方法命名,即卷积操作中将3*3的卷积核重新排列成4*16的卷积核;而反卷积操作将4*16的卷积核转置为16*4的反卷积核矩阵。

一、反卷积的数学推导

反卷积并非常规卷积的逆过程,即对常规卷积的输出进行反卷积,只能得到与常规卷积输入矩阵相同尺寸的矩阵,但里面的元素不一定相同。
反卷积是特殊的正向卷积,先按照一定的比例通过补0来扩大输入尺寸,接着旋转卷积核再进行正向卷积。

1、正向卷积实现过程

假设输入图像 卷积、转置卷积、反卷积实现原理、API函数 - 图13尺寸为 卷积、转置卷积、反卷积实现原理、API函数 - 图14 ,元素矩阵为:卷积、转置卷积、反卷积实现原理、API函数 - 图15;卷积核卷积、转置卷积、反卷积实现原理、API函数 - 图16尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图17,元素矩阵为:卷积、转置卷积、反卷积实现原理、API函数 - 图18。步长卷积、转置卷积、反卷积实现原理、API函数 - 图19,填充卷积、转置卷积、反卷积实现原理、API函数 - 图20,即卷积、转置卷积、反卷积实现原理、API函数 - 图21。依据卷积的计算公式卷积、转置卷积、反卷积实现原理、API函数 - 图22,输出图像卷积、转置卷积、反卷积实现原理、API函数 - 图23的尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图24

2、用矩阵乘法描述卷积

卷积、转置卷积、反卷积实现原理、API函数 - 图25的元素矩阵展开成一个列向量卷积、转置卷积、反卷积实现原理、API函数 - 图26卷积、转置卷积、反卷积实现原理、API函数 - 图27
卷积、转置卷积、反卷积实现原理、API函数 - 图28的元素矩阵展开成一个列向量卷积、转置卷积、反卷积实现原理、API函数 - 图29卷积、转置卷积、反卷积实现原理、API函数 - 图30
对于输入的元素矩阵卷积、转置卷积、反卷积实现原理、API函数 - 图31和输出的元素矩阵卷积、转置卷积、反卷积实现原理、API函数 - 图32,用矩阵运算描述这个过程:卷积、转置卷积、反卷积实现原理、API函数 - 图33
通过推导,得到稀疏矩阵卷积、转置卷积、反卷积实现原理、API函数 - 图34卷积、转置卷积、反卷积实现原理、API函数 - 图35
反卷积的操作就是要对这个矩阵运算过程进行逆运算,即通过卷积、转置卷积、反卷积实现原理、API函数 - 图36卷积、转置卷积、反卷积实现原理、API函数 - 图37得到卷积、转置卷积、反卷积实现原理、API函数 - 图38,根据各个矩阵的尺寸大小,推导出反卷积的计算过程:卷积、转置卷积、反卷积实现原理、API函数 - 图39
但是代入数学计算之后发现,反卷积的操作只是恢复了矩阵卷积、转置卷积、反卷积实现原理、API函数 - 图40的尺寸大小,并不能恢复卷积、转置卷积、反卷积实现原理、API函数 - 图41的每个元素值。

3、反卷积输入输出尺寸关系

关系一:若卷积、转置卷积、反卷积实现原理、API函数 - 图42,则卷积、转置卷积、反卷积实现原理、API函数 - 图43

卷积、转置卷积、反卷积实现原理、API函数 - 图44尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图45,卷积核卷积、转置卷积、反卷积实现原理、API函数 - 图46尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图47,步长卷积、转置卷积、反卷积实现原理、API函数 - 图48,填充卷积、转置卷积、反卷积实现原理、API函数 - 图49,即卷积、转置卷积、反卷积实现原理、API函数 - 图50,则输出卷积、转置卷积、反卷积实现原理、API函数 - 图51的尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图52

image.png

关系二:若卷积、转置卷积、反卷积实现原理、API函数 - 图54,则卷积、转置卷积、反卷积实现原理、API函数 - 图55

卷积、转置卷积、反卷积实现原理、API函数 - 图56尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图57,卷积核卷积、转置卷积、反卷积实现原理、API函数 - 图58尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图59,步长卷积、转置卷积、反卷积实现原理、API函数 - 图60,填充卷积、转置卷积、反卷积实现原理、API函数 - 图61,即卷积、转置卷积、反卷积实现原理、API函数 - 图62,则输出卷积、转置卷积、反卷积实现原理、API函数 - 图63的尺寸为卷积、转置卷积、反卷积实现原理、API函数 - 图64

image.png

二、TensorFlow实现反卷积

1、反卷积的具体计算步骤

输入图像:卷积、转置卷积、反卷积实现原理、API函数 - 图66,卷积核为:卷积、转置卷积、反卷积实现原理、API函数 - 图67

关系一:输出尺寸卷积、转置卷积、反卷积实现原理、API函数 - 图68,步长卷积、转置卷积、反卷积实现原理、API函数 - 图69,TF函数:

  1. transpose_conv = tf.nn.conv2d_transpose(value=input,
  2. filter=kernel,
  3. output_shape=[1,5,5,1],
  4. strides=2,
  5. padding='SAME')

当执行tf.nn.conv2d_transpose时,TF会先计算卷积类型、输入尺寸、步长和输出尺寸的关系是否成立,如果不成立会提示错误,如成立则执行如下操作:

Step1:根据步长卷积、转置卷积、反卷积实现原理、API函数 - 图70对输入内部进行填充,卷积、转置卷积、反卷积实现原理、API函数 - 图71可理解为输入放大的倍数,即在卷积、转置卷积、反卷积实现原理、API函数 - 图72的每个元素之间填充0,0的个数卷积、转置卷积、反卷积实现原理、API函数 - 图73卷积、转置卷积、反卷积实现原理、API函数 - 图74的关系为:卷积、转置卷积、反卷积实现原理、API函数 - 图75
即在卷积、转置卷积、反卷积实现原理、API函数 - 图76的每个元素之间填充卷积、转置卷积、反卷积实现原理、API函数 - 图77个0,则 卷积、转置卷积、反卷积实现原理、API函数 - 图78**即此时按照此方式卷积、转置卷积、反卷积实现原理、API函数 - 图79

Step2:用卷积核卷积、转置卷积、反卷积实现原理、API函数 - 图80对填充后的输入卷积、转置卷积、反卷积实现原理、API函数 - 图81进行步长卷积、转置卷积、反卷积实现原理、API函数 - 图82的正向卷积,根据正向卷积公式输出尺寸:卷积、转置卷积、反卷积实现原理、API函数 - 图83,得到的输出尺寸是卷积、转置卷积、反卷积实现原理、API函数 - 图84,与反卷积函数给出的输出尺寸相同,所以可以进行计算,卷积、转置卷积、反卷积实现原理、API函数 - 图85经过卷积、转置卷积、反卷积实现原理、API函数 - 图86的填充后得到卷积、转置卷积、反卷积实现原理、API函数 - 图87,计算后结果为卷积、转置卷积、反卷积实现原理、API函数 - 图88。与TF运行结果一致。

关系二:输出尺寸卷积、转置卷积、反卷积实现原理、API函数 - 图89,步长卷积、转置卷积、反卷积实现原理、API函数 - 图90,TF函数:

  1. transpose_conv = tf.nn.conv2d_transpose(value=input,
  2. filter=kernel,
  3. output_shape=[1,6,6,1],
  4. strides=2,
  5. padding='SAME')

Step1:由于卷积类型是SAME,故先在外围填充一圈0:卷积、转置卷积、反卷积实现原理、API函数 - 图91,填充后输入尺寸卷积、转置卷积、反卷积实现原理、API函数 - 图92与卷积核卷积、转置卷积、反卷积实现原理、API函数 - 图93卷积后的输出尺寸卷积、转置卷积、反卷积实现原理、API函数 - 图94,与输出尺寸卷积、转置卷积、反卷积实现原理、API函数 - 图95不一致。故需要继续填充0,TF优先在左侧核和上侧填充一排0,填充后输入变为卷积、转置卷积、反卷积实现原理、API函数 - 图96

Step2:再对这个填充后的输入与卷积、转置卷积、反卷积实现原理、API函数 - 图97的卷积核卷积,结果为卷积、转置卷积、反卷积实现原理、API函数 - 图98

三、函数

1、PyTorch

2、TensorFlow

- TF1.x

- TF2.x

- Keras