这种架构有什么问题?我收到错误的负尺寸。我想避免密集层和辍学

数据挖掘 机器学习 神经网络 深度学习
2022-02-20 04:21:53
model = Sequential()
model.add(Conv2D(64, (1, 1), activation='relu', input_shape=(64,64,3)))
model.add(Conv2D(64, (5,5), strides=(2,2), padding='same'))
model.add(MaxPooling2D(pool_size=3, strides=(2,2)))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(128, (1,1),
                strides=(2,2),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1,1),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1,1),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (3,3), 
                strides=(1,1), 
                padding='valid'))

model.add(AveragePooling2D(pool_size=2, strides=(2,2), padding='valid'))
model.add(Conv2D(1,1,200))
model.add(Flatten())
model.add(Activation('softmax'))
1个回答

您使用的图层太多,空间空间不足。

大多数卷积层都使用“有效”填充,这意味着卷积仅在没有任何填充的实际“像素”上执行,因此输出的空间维度小于输入。

我已经标记了它在您的脚本中发生的位置:

model = Sequential()
model.add(Conv2D(64, (1, 1), activation='relu', input_shape=(64,64,3)))
model.add(Conv2D(64, (5,5), strides=(2,2), padding='same'))
model.add(MaxPooling2D(pool_size=3, strides=(2,2)))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(64, (3, 3), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(128, (1,1),
                strides=(2,2),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1, 1), 
                          strides=(1,1), 
                          activation='relu',
                          padding='valid' ))
model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1,1),
                strides=(1,1),
                activation='relu',
                padding='valid'))

model.summary() # This is where it happens - The output of this layer is of shape (1,1,128)

model.add(Conv2D(128, (3,3),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (1,1),
                strides=(1,1),
                activation='relu',
                padding='valid'))
model.add(Conv2D(128, (3,3), 
                strides=(1,1), 
                padding='valid'))

model.add(AveragePooling2D(pool_size=2, strides=(2,2), padding='valid'))
model.add(Conv2D(1,1,200))
model.add(Flatten())
model.add(Activation('softmax'))

您可以使用 Keras 的“摘要”方法来调查您的模型。例如,我在这里编写的脚本的输出是:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 64, 64, 64)        256       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 32, 32, 64)        102464    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 15, 15, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 15, 15, 64)        4160      
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 13, 13, 64)        36928     
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 13, 13, 64)        4160      
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 11, 11, 64)        36928     
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 11, 11, 64)        4160      
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 9, 9, 64)          36928     
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 5, 5, 128)         8320      
_________________________________________________________________
conv2d_10 (Conv2D)           (None, 3, 3, 128)         147584    
_________________________________________________________________
conv2d_11 (Conv2D)           (None, 3, 3, 128)         16512     
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 1, 1, 128)         147584    
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 1, 1, 128)         16512     
=================================================================
Total params: 562,496
Trainable params: 562,496
Non-trainable params: 0