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,因为您使用的是顺序模型。特征体积的形状将由前一层决定。所以只要第一层定义了输入形状,就不需要为其余层指定输入形状。
您还需要在第一个致密层之前有一个展平层,以将体积转换为一维向量。
我在使用 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,因为您使用的是顺序模型。特征体积的形状将由前一层决定。所以只要第一层定义了输入形状,就不需要为其余层指定输入形状。
您还需要在第一个致密层之前有一个展平层,以将体积转换为一维向量。