使用 tensorflow 时匹配形状 conv2d_transpose
Matching shapes when using tensorflow conv2d_transpose
我正在尝试使用 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)
```
我们可以看到尺寸不匹配。我应该使用任何数学公式来取回正确的尺寸,还是我的代码有问题?
这里的问题是因为conv3
。在 conv3
中,您使用步幅为 2 且内核大小为 3 的卷积。这将您的输入限制为奇数形状,但是,您的输入形状为 (24, 24, 16)
。因此,仅对 (23, 23, 16)
执行卷积,而忽略边界像素。你可以参考这个CS231N tutorial来了解更多关于如何计算输出形状的信息。
现在,当您尝试从 (11, 11, 8)
进行上采样时,它将上采样到获得它的形状,即 `(23, 23, 16)。因此,这会在您的输入形状和上采样形状之间产生误差。
您可以采用多种方法来解决这个问题 -
- 找到步幅和内核大小的正确组合,这样就不会忽略任何值。这将使您的输入形状和上采样形状保持一致。
- 在上采样时,手动填充输出(仅在一侧)以从形状
(23, 23, 16)
. 创建 (24, 24, 16)
的形状
- 或者,您可以在所有上采样层之后填充最终输出。
我正在尝试使用 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)
```
我们可以看到尺寸不匹配。我应该使用任何数学公式来取回正确的尺寸,还是我的代码有问题?
这里的问题是因为conv3
。在 conv3
中,您使用步幅为 2 且内核大小为 3 的卷积。这将您的输入限制为奇数形状,但是,您的输入形状为 (24, 24, 16)
。因此,仅对 (23, 23, 16)
执行卷积,而忽略边界像素。你可以参考这个CS231N tutorial来了解更多关于如何计算输出形状的信息。
现在,当您尝试从 (11, 11, 8)
进行上采样时,它将上采样到获得它的形状,即 `(23, 23, 16)。因此,这会在您的输入形状和上采样形状之间产生误差。
您可以采用多种方法来解决这个问题 -
- 找到步幅和内核大小的正确组合,这样就不会忽略任何值。这将使您的输入形状和上采样形状保持一致。
- 在上采样时,手动填充输出(仅在一侧)以从形状
(23, 23, 16)
. 创建 - 或者,您可以在所有上采样层之后填充最终输出。
(24, 24, 16)
的形状