ValueError: Exception encountered when calling layer "max_pooling2d_26" (type MaxPooling2D)

ValueError: Exception encountered when calling layer "max_pooling2d_26" (type MaxPooling2D)

我在使用 Keras 构建 CNN 模型时有以下代码。我添加了三个卷积层和三个池化层。编译模型时,池化层会出现值错误。我已经添加了代码和错误。请帮忙

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))


model.add(Conv2D(filters = 64, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size=(2, 2)))


model.add(Conv2D(filters = 64, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Dense(128, activation = 'relu'))
model.add(Dropout(0.5))

model.add(Dense(10, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])



### Error

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-52904ec71757> in <module>
     13 model.add(Conv2D(filters = 64, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
     14 # pool layer
---> 15 model.add(MaxPool2D(pool_size = (2,2)))
     16 
     17 # Dense layer

~\Anaconda3\lib\site-packages\tensorflow\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs)
    528     self._self_setattr_tracking = False  # pylint: disable=protected-access
    529     try:
--> 530       result = method(self, *args, **kwargs)
    531     finally:
    532       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~\Anaconda3\lib\site-packages\keras\utils\traceback_utils.py in error_handler(*args, **kwargs)
     65     except Exception as e:  # pylint: disable=broad-except
     66       filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67       raise e.with_traceback(filtered_tb) from None
     68     finally:
     69       del filtered_tb

~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs, op_def)
   1937   except errors.InvalidArgumentError as e:
   1938     # Convert to ValueError for backwards compatibility.
-> 1939     raise ValueError(e.message)
   1940 
   1941   return c_op

ValueError: Exception encountered when calling layer "max_pooling2d_29" (type MaxPooling2D).

Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling2d_29/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NHWC", explicit_paddings=[], ksize=[1, 2, 2, 1], padding="VALID", strides=[1, 2, 2, 1]](Placeholder)' with input shapes: [?,1,1,64].

Call arguments received:
  • inputs=tf.Tensor(shape=(None, 1, 1, 64), dtype=float32)

第三个 MaxPool 层的输入大小为 (1,1,64),您无法在其上 运行 2x2 池。您需要检查每一层的输入维度。示例:

model = Sequential()
model.add(Conv2D(filters = 32, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))


model.add(Conv2D(filters = 64, kernel_size = (4,4), input_shape = (28,28,1), activation = 'relu'))
model.add(MaxPool2D(pool_size=(2, 2)))


model.add(Conv2D(filters = 64, kernel_size = (4,4) ,activation = 'relu'))

model.summary()

最后一层输出为:

conv2d_24 (Conv2D)           (None, 1, 1, 64)          65600 

就像 @whereismywall 说的那样,最大池化层的输入是 (1, 1, 64) 这太小了,无法使用你的 (2, 2) 池大小。简短的回答是为 conv 和最大池层添加 padding='SAME' 参数。

查看您的代码和预测层,我假设您想要保留特征量的高度和宽度,padding='SAME' 会这样做。这个webpage解释得更详细。

旁注。
您不必为其余层重新定义 input_shape,因为您使用的是顺序模型。特征体积的形状将由前一层决定。所以只要第一层定义了输入形状,就不需要为其余层指定输入形状。

您还需要在第一个致密层之前有一个展平层,以将体积转换为一维向量。