CNN输出形状解释

数据挖掘 机器学习 神经网络 深度学习 美国有线电视新闻网 卷积
2022-02-27 16:26:39

我有以下顺序模型:

model = models.Sequential()
model.add(Reshape(([1]+in_shp), input_shape=in_shp))
model.add(ZeroPadding2D((0, 2)))
model.add(Conv2D(256, (1, 3),padding='valid', activation="relu", name="conv1",data_format="channels_first", kernel_initializer='glorot_uniform'))
model.add(Dropout(dr))
model.add(ZeroPadding2D((0, 2)))
model.add(Conv2D(80, (2, 3), padding="valid", activation="relu", name="conv2",data_format="channels_first", kernel_initializer='glorot_uniform'))
model.add(Dropout(dr))
model.add(Flatten())
model.add(Dense(256, activation='relu', kernel_initializer='he_normal', name="dense1"))
model.add(Dropout(dr))
model.add(Dense( len(classes), kernel_initializer='he_normal', name="dense2" ))
model.add(Activation('softmax'))
model.add(Reshape([len(classes)]))
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.summary()

我得到了以下摘要:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
reshape_1 (Reshape)          (None, 1, 2, 128)         0         
_________________________________________________________________
zero_padding2d_1 (ZeroPaddin (None, 1, 6, 128)         0         
_________________________________________________________________
conv1 (Conv2D)               (None, 256, 6, 126)       1024      
_________________________________________________________________
dropout_1 (Dropout)          (None, 256, 6, 126)       0         
_________________________________________________________________
zero_padding2d_2 (ZeroPaddin (None, 256, 10, 126)      0         
_________________________________________________________________
conv2 (Conv2D)               (None, 80, 9, 124)        122960    
_________________________________________________________________
dropout_2 (Dropout)          (None, 80, 9, 124)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 89280)             0         
_________________________________________________________________
dense1 (Dense)               (None, 256)               22855936  
_________________________________________________________________
dropout_3 (Dropout)          (None, 256)               0         
_________________________________________________________________
dense2 (Dense)               (None, 8)                 2056      
_________________________________________________________________
activation_1 (Activation)    (None, 8)                 0         
_________________________________________________________________
reshape_2 (Reshape)          (None, 8)                 0         
=================================================================
Total params: 22,981,976
Trainable params: 22,981,976
Non-trainable params: 0

该模型工作正常。但是,我想了解有关conv1图层的一些信息。为什么宽度值从 128 减少到 126?我真的很困惑,它不应该与上一层的值相同吗?

此外,对于conv2高度和宽度从 (10,126) 减小到 (9,124) 的图层也是如此。

有人可以解释我为什么吗?

2个回答

在卷积层中,过滤器(在您的情况下为3x3)应用于图像以产生输出(特征图),并通过称为 stride 的参数向右和底部滑动(在您的情况下,未定义, 默认值为 1)。现在如果padding='valid',输出维度将会改变,但是如果你将其更改为padding='same',输出维度将与输入相同,这是因为零填充的想法(即,用零填充图像边界)。

这是因为您使用的卷积类型。这是一个valid卷积。如果您希望输出为128,将卷积设置为same考虑到这也适用于深层。它们也可以具有这些卷积中的任何一个。