您可以使用model.summary() 查看每一层之后的输出形状,因此对于24x24x1 输入,您有:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 20, 20, 8) 208
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 10, 10, 8) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 8, 8, 2) 146
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 4, 4, 2) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 1, 1, 5) 165
=================================================================
请注意,在最后一次卷积(即过滤器的数量)之后,您最终会得到 5 个值。
如果您将输入大小增加到48x48x1,您将获得7x7x5 输出:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_3 (Conv2D) (None, 44, 44, 8) 208
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 22, 22, 8) 0
_________________________________________________________________
conv2d_4 (Conv2D) (None, 20, 20, 2) 146
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 10, 10, 2) 0
_________________________________________________________________
conv2d_5 (Conv2D) (None, 7, 7, 5) 165
=================================================================
我假设您想要1x1x5 的输出,如第一个示例所示,因此您需要添加两个新层,将图像的高度和宽度降低到1x1,例如:
model = Sequential()
model.add(tf.keras.layers.Conv2D(8, 5, activation="relu", input_shape=(48,48,1)))
model.add(tf.keras.layers.MaxPool2D(2))
model.add(tf.keras.layers.Conv2D(2, 3, activation="relu"))
model.add(tf.keras.layers.MaxPool2D(2))
# new layers
model.add(tf.keras.layers.Conv2D(2, 3, activation="relu"))
model.add(tf.keras.layers.MaxPool2D(2))
# ---
model.add(tf.keras.layers.Conv2D(5, 4, activation="relu"))
你会得到:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_21 (Conv2D) (None, 44, 44, 8) 208
_________________________________________________________________
max_pooling2d_16 (MaxPooling (None, 22, 22, 8) 0
_________________________________________________________________
conv2d_22 (Conv2D) (None, 20, 20, 2) 146
_________________________________________________________________
max_pooling2d_17 (MaxPooling (None, 10, 10, 2) 0
_________________________________________________________________
conv2d_23 (Conv2D) (None, 8, 8, 2) 38
_________________________________________________________________
max_pooling2d_18 (MaxPooling (None, 4, 4, 2) 0
_________________________________________________________________
conv2d_24 (Conv2D) (None, 1, 1, 5) 165
=================================================================
请注意,在您的示例中,只有池化层具有stride = 2,因此这是大小减半的地方; Conv2D layer 默认有strides=(1, 1)。
参考文献