反卷积(Transposed Convolution)是一种图像上采样(UpSample)的方法,在DCGAN中用它来将随机采样的值转换为一张完整的图像。
DCGAN生成手写数字。图片来源【5】
Transposed Convolution
“反向卷积也叫转置卷积,它是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核(Kernel),再进行正向卷积。
反卷积的操作只是恢复了矩阵的尺寸大小,并不能恢复每个元素值。
代码语言:javascript复制tf.nn.conv2d_transpose(
input, filters, output_shape, strides, padding='SAME', data_format='NHWC',
dilations=None, name=None
)
Transposed Convolution将Output Size恢复为Input Size,对于Convolution过程,我们知道其Output Size与Input Size的尺寸关系如下:
其中,o为Output Size, i是Input Size, p为Padding Size,s为Stride。
若要将o恢复为i,需考虑2种情况,
整除以及不整除两种情况。
详细的公式就不推导了,网上有很多资料,有兴趣可以深入研究下这些材料:
https://www.cnblogs.com/shine-lee/p/11559825.html
A guide to convolution arithmetic for deep learning
Tensorflow中实现反卷积
假设我们令输入图像为:
卷积核(kernel)为:
Case 1
如果要使输出的尺寸是5 x 5,步长stride = 2,tensorflow代码:
代码语言:javascript复制tf.nn.conv2d_transpose(
value=input, filter=kernel,
output_shape=[1,5,5,1],
strides=2, padding='SAME')
Tensorflow的内部做了以下几件事情:
1)根据步数stride对Input进行填充,即在Input的每个元素之间填充0 ,填充0的个数n与stride的关系为:
这里stride=1,所以在每个元素之间填充一个0。
2)用卷积核kernel对填充后的输入
进行stride=1的正向卷积,输入尺寸为5 x 5。
Case 2
如果要使输出的尺寸是6x6,其它参数不变,tensorflow代码:
代码语言:javascript复制tf.nn.conv2d_transpose(
value=input, filter=kernel,
output_shape=[1,6,6,1],
strides=2, padding='SAME')
卷积类型是same,我们首先在外围填充一圈0。此时仍然不能生成尺寸为6x6的图片,Tensorflow会在左上再填充一行和一列0,填充后的输入为:
对input执行卷积核为3x3的卷积操作,结果如下:
反卷积动图效果
No padding, no strides, transposed,图片来源【1】
No padding, strides=1, transposed,图片来源【1】