我的输入形状是(20,10,1)
我的非工作模型看起来像这样:
num_classes = 2
model.add(Conv2D(32, (5, 5),
padding='same',
data_format='channels_last',
input_shape=input_shape))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(32, (5, 5)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (5, 5), padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv2D(64, (5, 5)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
self.model = model
这给了我以下错误: Negative dimension size caused by subtracting 5 from 2 for 'conv2d_4/convolution' (op: 'Conv2D') with input shapes: [?,5,2,64], [5,5,64,64].
但是,如果我执行以下两项操作之一,则错误消失:
1.删除所有三个 model.add(Conv2D(64, (5, 5)))
要么
2.从(5,5)到(3,3)更改^三个Conv2D层并更改全部
pool_size(2,2)
据我所知,第4层末端的尺寸造成了麻烦 .
我该怎么做才能使^模型在当前状态下工作?
基本上我想比较这个模型的性能(过滤器大小5x5与pool_size(3,3)与另一个使用3x3过滤器和pool_size(2,2)的模型 . 谢谢
2 回答
问题是层
conv2d_4
的输出变为零或负 . 要解决此问题,必须设计网络,以便不会对输入数据进行高度下采样 .这是一些可能的解决方案:
使用较少的图层 . 特别是删除一个最大池化层,它会大量下采样(在此设置下减少三分之一) .
使用较小的最大池,例如
pool_size=(2, 2)
,导致下采样一半 .对
Conv2D
图层使用"same padding",这会导致卷积步骤中没有下采样 .将步幅值更改为1,1,如下所示 . 这解决了我的问题
model.add(MaxPooling2D(pool_size=(2, 2),strides=(1,1),padding='same',name = 'pool2'))
我的代码的完整层图是
model = getModel()