奇怪的填充层输出

Strange padding layer output

我正在尝试构建一个看起来像这样的模型。

注意填充层的输出形状是1 * 48 * 48 * 32。填充层的输入形状是 1 * 48 * 48 * 16。那是哪种类型的填充操作?

我的代码:

    prelu3 = tf.keras.layers.PReLU(shared_axes = [1, 2])(add2)
    deptconv3 = tf.keras.layers.DepthwiseConv2D(3, strides=(2, 2), padding='same')(prelu3)
    conv4 = tf.keras.layers.Conv2D(32, 1, strides=(1, 1), padding='same')(deptconv3)
    maxpool1 = tf.keras.layers.MaxPool2D()(prelu3)
    pad1 = tf.keras.layers.ZeroPadding2D(padding=(1, 1))(maxpool1) # This is the padding layer where problem lies.

这是试图复制该块的代码部分。但是,我得到的模型看起来像这样。

我是不是遗漏了什么,还是用错了图层?

默认情况下,keras maxpool2d 接受:

Input shape : 4D tensor with shape (batch_size, rows, cols, channels).
Output shape : (batch_size, padded_rows, padded_cols, chamels)

请在此处查看 zero_padding2d keras 中的图层文档。

在这方面,您正在尝试将此处视为渠道的内容加倍。 您的输入看起来更像 (batch, x, y, z) 并且您想要一个 (batch, x, y, 2*z) 为什么你想要一个 zeropadding 来加倍你的 z?我宁愿建议你使用像

这样的密集层
tf.keras.layers.Dense(32)(maxpool1)

这会将 z 形状从 16 增加到 32。

已编辑:

我有东西可以帮到你。

tf.keras.layers.ZeroPadding2D(
    padding=(0, 8), data_format="channels_first"
)(maxpool1)

这样做是将您的 y、z 视为 (x, y) 并将 x 视为通道并在 (y, z) 周围填充 (0, 8) 以提供 (y, 32)

演示:

import tensorflow as tf
input_shape = (4, 28, 28, 3)
x = tf.keras.layers.Input(shape=input_shape[1:])
y = tf.keras.layers.Conv2D(16, 3, activation='relu', dilation_rate=2, input_shape=input_shape[1:])(x)
x=tf.keras.layers.ZeroPadding2D(
    padding=(0, 8), data_format="channels_first"
)(y)
print(y.shape, x.shape)

(None, 24, 24, 16) (None, 24, 24, 32)