奇怪的填充层输出
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)
我正在尝试构建一个看起来像这样的模型。
注意填充层的输出形状是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)