【问题标题】:ValueError: Exception encountered when calling layer "max_pooling2d_26" (type MaxPooling2D)ValueError:调用层“max_pooling2d_26”时遇到异常(类型 MaxPooling2D)
【发布时间】:2021-12-28 10:19:57
【问题描述】:

在使用 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)

【问题讨论】:

  • 考虑删除MaxPool2D 层之一。错误显示特征图太小,无法执行 2 * 2 Max Pooling 操作。

标签: tensorflow keras valueerror


【解决方案1】:

就像 @whereismywall 所说,最大池化层的输入是 (1, 1, 64),它太小而无法使用您的 (2, 2) 池大小。简短的回答是为 conv 和 max pool 层添加 padding='SAME' 参数。

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

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

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

【讨论】:

    【解决方案2】:

    第三个 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      相关资源
      最近更新 更多