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_rows
和 num_columns
的值不能低于 9。要解决此问题,您可以做的一件事是增加变量的值(从而增加您的输入大小)num_rows
和 num_columns
到至少 9
.
您还可以做一件事。网络中的某些层会在数据通过网络传播时降低数据的维度。这些是您的 Conv2D
层,也是您的第一个 MaxPooling2D
层。您可以通过更改这些图层来保留输入的大小。对于 Conv2D
图层,您可以在创建图层时使用 padding="same"
参数,如下所示:
model.add(Conv2D(filters=32, kernel_size=2, activation='relu', padding='same'))
对于 MaxPooling2D
图层,您可以在创建图层时使用 pool_size=1
参数,因为您已经在使用所有 MaxPooling2D
图层,但第一个图层除外。
对于这个 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_rows
和 num_columns
的值不能低于 9。要解决此问题,您可以做的一件事是增加变量的值(从而增加您的输入大小)num_rows
和 num_columns
到至少 9
.
您还可以做一件事。网络中的某些层会在数据通过网络传播时降低数据的维度。这些是您的 Conv2D
层,也是您的第一个 MaxPooling2D
层。您可以通过更改这些图层来保留输入的大小。对于 Conv2D
图层,您可以在创建图层时使用 padding="same"
参数,如下所示:
model.add(Conv2D(filters=32, kernel_size=2, activation='relu', padding='same'))
对于 MaxPooling2D
图层,您可以在创建图层时使用 pool_size=1
参数,因为您已经在使用所有 MaxPooling2D
图层,但第一个图层除外。