ValueError:从 1 中减去 2 导致的负维度大小 '{{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')

正如这里所建议的,但它仍然不起作用。

为什么会出现此错误以及如何修复?谢谢

发生此错误是因为输入的维度太小。使用当前设置,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层。

最新更新