【问题标题】:Matching shapes when using tensorflow conv2d_transpose使用 tensorflow conv2d_transpose 时匹配形状
【发布时间】:2018-04-13 15:30:17
【问题描述】:

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

```

我们可以看到尺寸不匹配。我应该使用任何数学公式来恢复正确的尺寸还是我的代码有问题?

【问题讨论】:

标签: tensorflow convolution


【解决方案1】:

这里的问题是因为conv3。在conv3 中,您使用的卷积步长为2,内核大小为3。这将您的输入限制为奇数形状,但是您的输入形状为(24, 24, 16)。因此,只对(23, 23, 16)进行卷积,忽略边界像素。您可以参考此CS231N tutorial 了解有关如何计算输出形状的更多信息。

现在,当您尝试从 (11, 11, 8) 进行上采样时,它将上采样到从中获得它的形状,即 `(23, 23, 16)。因此,这会在您的输入形状和上采样形状之间产生错误。

您可以使用多种选项来解决此问题 -

  • 找到步幅和内核大小的正确组合,这样就不会忽略任何值。这将使您的输入形状和上采样形状保持一致。
  • 进行上采样时,手动填充输出(仅在一侧)以从形状 (23, 23, 16) 创建 (24, 24, 16) 的形状。
  • 或者,您可以在所有上采样层之后填充最终输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    相关资源
    最近更新 更多