使用TensorFlow conv2d_transpose时的维度匹配问题
解决卷积变分自编码器解码器的维度匹配问题
我来帮你理清楚怎么用tf.layers.conv2d_transpose实现维度匹配,核心就是先搞懂编码器里卷积的形状变化逻辑,再反向推导转置卷积的参数就行~
首先拆解你给出的编码器部分的形状变化:
- 输入
image_batch经过第一个卷积conv1后,形状变成(-1, 26, 26, 32)。这里用的是kernel_size=3、strides=1,默认padding='valid',所以可以反推你的输入image_batch的空间维度应该是28x28(计算逻辑:28 - 3 + 1 = 26)。 - 接着
conv1的输出经过第二个卷积conv2,形状变成(-1, 24, 24, 16),同样是kernel_size=3、strides=1、padding='valid',计算逻辑是26 - 3 + 1 = 24,完全对应。
现在要做解码器,就是把(-1, 24, 24, 16)一步步还原回输入的(-1, 28, 28, 原通道数),我们可以用转置卷积反向对应每一步的卷积操作:
第一步:从24x24x16还原到26x26x32
这一步对应编码器中conv2的逆操作,转置卷积在padding='valid'时的形状计算逻辑是:输出空间维度 = (输入空间维度 - 1) * strides + kernel_size
我们需要输出是26,输入是24,代入公式:26 = (24 - 1)*1 + 3,刚好成立。所以参数设置和conv2反向对应:
# 对应conv2的逆操作,从(-1,24,24,16)得到(-1,26,26,32) deconv1 = tf.layers.conv2d_transpose( inputs=conv2, # 编码器最后一层的输出 filters=32, # 和conv1的filters一致 kernel_size=3, # 和conv2的kernel_size一致 strides=1, # 和conv2的strides一致 padding='valid', # 和conv2的padding一致 activation=tf.nn.relu )
第二步:从26x26x32还原到输入的28x28x原通道数
这一步对应编码器中conv1的逆操作,同样用转置卷积的形状公式:28 = (26 - 1)*1 + 3,完全匹配。参数设置对应conv1的反向:
# 对应conv1的逆操作,从(-1,26,26,32)得到(-1,28,28,原通道数) # 这里假设原输入通道数是3(比如RGB图像),你可以改成自己的实际通道数 deconv2 = tf.layers.conv2d_transpose( inputs=deconv1, filters=3, # 替换成你的输入image_batch的通道数 kernel_size=3, # 和conv1的kernel_size一致 strides=1, # 和conv1的strides一致 padding='valid', # 和conv1的padding一致 activation=None # 最后一步通常不用激活,或者根据任务用sigmoid/tanh )
关键总结
- 转置卷积的参数要和对应的正向卷积反向对应:filters对应正向卷积的输入通道数,kernel_size、strides、padding完全和正向卷积一致,这样就能保证维度完美匹配。
- 如果你的正向卷积用了
padding='same',那转置卷积也用padding='same',此时输出维度公式是输入维度 * strides,同样可以反向推导。
内容的提问来源于stack exchange,提问作者lucasmoura
相关产品推荐
相关产品推荐

