我正在尝试使用张量流创建卷积变分自动编码器。在解码器中,我尝试使用tf.layers.conv2d_transpose
来执行上采样。但是,我无法理解如何匹配尺寸。例如,这是我的代码:
# shape: (-1, 26, 26, 32)
conv1 = tf.layers.conv2d(
image_batch,
filters=32,
kernel_size=3,
strides=1,
activation=tf.nn.relu)
# shape: (-1, 24, 24, 16)
conv2 = tf.layers.conv2d(
conv1,
filters=16,
kernel_size=3,
strides=1,
activation=tf.nn.relu)
#shape: (-1, 11, 11, 8)
conv3 = tf.layers.conv2d(
conv2,
filters=8,
kernel_size=3,
strides=2,
activation=tf.nn.relu)
#shape: (-1, 23, 23, 16)
deconv1 = tf.layers.conv2d_transpose(
conv3,
filters=16,
kernel_size=3,
strides=2)
#shape: (-1, 25, 25, 32)
deconv2 = tf.layers.conv2d_transpose(
deconv1,
filters=32,
kernel_size=3,
strides=1)
#shape: (-1, 27, 27, 1)
deconv3 = tf.layers.conv2d_transpose(
deconv2,
filters=1,
kernel_size=3,
strides=1)
```
我们可以看到尺寸不匹配。是否有任何数学公式可用于恢复正确的尺寸或我的代码有问题?
答案 0 :(得分:1)
这里的问题是因为conv3
。在conv3
中,您使用的是步长为2且内核大小为3的卷积。这会将输入限制为奇怪的形状,但输入形状为(24, 24, 16)
。因此,仅在(23, 23, 16)
上执行卷积,并且忽略边界像素。您可以参考此CS231N tutorial以获取有关如何计算输出形状的更多信息。
现在,当您尝试从(11, 11, 8)
进行上采样时,它将上采样到获得它的形状,即`(23,23,16)。因此,这会在输入形状和上采样形状之间产生错误。
您可以使用多种方法来解决此问题 -
(24, 24, 16)
创建(23, 23, 16)
形状。