这个CNN对40x40x2图像很好,但是现在我想改成13x78x2并得到以下错误。我该如何改变CNN的架构?你知道吗
Negative dimension size caused by subtracting 3 from 2 for 'conv2d_13/convolution' (op: 'Conv2D') with input shapes: [?,2,35,64], [3,3,64,64].
我的代码:
data_w = 40 #CHANGE TO 13
data_h = 40 #CHANGE TO 78
n_classes = 2
n_filters_1 = 32
n_filters_2 = 64
d_filter = 3
p_drop_1 = 0.25
p_drop_2 = 0.50
model = Sequential()
model.add(Convolution2D(n_filters_1, d_filter, d_filter, border_mode='valid', input_shape=(data_w, data_h,2)))
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_1, d_filter, d_filter))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(p_drop_1))
model.add(Convolution2D(n_filters_2, d_filter, d_filter, border_mode='valid'))
model.add(Activation('relu'))
model.add(Convolution2D(n_filters_2, d_filter, d_filter))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(p_drop_1))
## Used to flat the input (1, 10, 2, 2) -> (1, 40)
model.add(Flatten())
# Full Connected layer
model.add(Dense(256))
model.add(Activation('relu'))
# Drop layer
model.add(Dropout(p_drop_2))
# Output Full Connected layer
model.add(Dense(n_classes))
model.add(Activation('softmax'))
因为您选择了
valid
作为卷积的border_mode
,所以我们将使用3 x 3的滤波器大小,从而在每个Convolution2D
层为生成的滤波器输出移除边界周围的1个像素。还要注意,省略参数也会假定填充有效。如果计算出每一层的输出大小的减少值,那么输出过滤器大小的一个维度(行)将为0,从而得到错误。在d_filter = 3
中,假设输入图像大小为13x78,让我们遍历每一层的输出滤波器大小。请注意,我省略了在Activation
和Dropout
层显示过滤器大小输出,因为我们已经知道它们保持了与简洁性相同的输出大小:我建议立即更改
border_mode
,使其成为'same'
。这样,在每个Convolution2D
层到达池层之前,输出过滤器的大小都会保持不变。我不确定您选择有效卷积的目的,但请尝试这样做:否则,您需要删除一些
Convolution2D
和MaxPooling2D
层,以便生成非零的过滤器输出。做同样的工作,我做了上面,以找出多少你需要删除层你需要。我建议用n_filters_2
过滤器移除第一个Convolution2D
和Activation
层之后的层:相关问题 更多 >
编程相关推荐