使用tensorflow conv2d_transpose时匹配形状

时间:2018-04-13 15:30:17

标签: tensorflow convolution

我正在尝试使用张量流创建卷积变分自动编码器。在解码器中,我尝试使用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)

```

我们可以看到尺寸不匹配。是否有任何数学公式可用于恢复正确的尺寸或我的代码有问题?

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)形状。
  • 或者,您可以在所有上采样层之后填充最终输出。