ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node conv2d_3/Conv2D}}

ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node conv2d_3/Conv2D}}

对于这个 CNN 模型:

# Construct model
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, input_shape=(num_rows, num_columns, num_channels), activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.2))

model.add(Conv2D(filters=32, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=1))
model.add(Dropout(0.2))

model.add(Conv2D(filters=64, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=1))
model.add(Dropout(0.2))

model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=1))
model.add(Dropout(0.2))
model.add(GlobalAveragePooling2D())

model.add(Dense(num_labels, activation='softmax'))

我收到 ValueError 消息:

ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node conv2d_3/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](Placeholder, conv2d_3/Conv2D/ReadVariableOp)' with input shapes: [?,1,84,64], [2,2,64,128].

我尝试将 padding='same' 放在最后一个卷积层中,例如:

model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=1), padding='same')

如建议的那样here,,但仍然无效。

为什么会出现此错误以及如何解决?谢谢!

出现此错误是因为您输入的尺寸太小。使用您当前的设置,num_rowsnum_columns 的值不能低于 9。要解决此问题,您可以做的一件事是增加变量的值(从而增加您的输入大小)num_rowsnum_columns 到至少 9.

您还可以做一件事。网络中的某些层会在数据通过网络传播时降低数据的维度。这些是您的 Conv2D 层,也是您的第一个 MaxPooling2D 层。您可以通过更改这些图层来保留输入的大小。对于 Conv2D 图层,您可以在创建图层时使用 padding="same" 参数,如下所示:

model.add(Conv2D(filters=32, kernel_size=2, activation='relu', padding='same'))

对于 MaxPooling2D 图层,您可以在创建图层时使用 pool_size=1 参数,因为您已经在使用所有 MaxPooling2D 图层,但第一个图层除外。