前言:
- 卷积 (Convolution)
反卷积(Deconvolution)也有很多其他的叫法,比如:Transposed Convolution(转置卷积),Fractional Strided Convolution(微步卷积)等等。
卷积的实质:
卷积的实质就是矩阵相乘,具体细节参照下图:
反卷积和卷积的关系:
-
转置卷积stride = 1:
下图表示的是参数为的反卷积操作,其对应的卷积操作参数为 。我们可以发现对应的卷积和非卷积操作关系为 ,但是反卷积却多了。通过对比我们可以发现卷积层中左上角的输入只对左上角的输出有贡献,所以反卷积层会出现 。通过示意图,我们可以发现,反卷积层的输入输出在 的情况下关系为:
Fractionally Strided Convolution(微步卷积):
- 转置卷积stride > 1:
下图表示参数为 的卷积计算过程,从计算结果可以看出输出特征的尺寸为 。
上面也提到过反卷积有时候也被叫做Fractionally Strided Convolution,翻译过来大概意思就是小数步长的卷积。对于步长的卷积,我们可能会想到其对应的反卷积步长 。 如下图所示为一个参数为 的卷积操作(上图)所对应的反卷积操作。对于反卷积操作的小数步长我们可以理解为:在其输入特征单元之间插入个0,再在特征图的周围进行padding操作,padding的个数为(kernel_size - stride),插入0后把其看出是新的特征输入,然后此时步长 不再是小数而是为1。因此,结合上面所得到的结论,我们可以得出Fractionally Strided Convolution的输入输出关系为:
padding的三种形式:
卷积padding = "same":
Tensorflow2.0中转置卷积:
Tensorflow2.0中转置卷积对应的实现函数为tf.keras.layers.Conv2DTranspose(),经转置卷积操作后的特征图大小,对应公式如下:
参数:
- filters :控制输出特征图的通道数。
- input_shape:输入特征图大小。
- kernel_size:卷积核的大小。
- strides = 2:移动步长。
- padding:same/valid。
个人经验来说:strides可以使输出特征图的大小扩大strides倍,但要注意padding方式一定要设置为same,才能严格保证扩大的倍数。