在使用 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)
uj5u.com熱心網友回復:
就像@whereismywall所說的那樣,maxpooling 層的輸入是 (1, 1, 64) 這太小而無法使用您的 (2, 2) 池大小。簡短的回答是為卷積層和最大池層添加 padding='SAME' 引數。
查看您的代碼和您的預測層,我假設您想保留特征體積的高度和寬度, padding='SAME' 會這樣做。這個網頁更詳細地解釋了它。
邊注。
當您使用順序模型時,您不必為其余層重新定義 input_shape。特征體積的形狀將由前一層確定。因此,只要第一層定義了輸入形狀,您就不需要為其余層指定輸入形狀。
在第一個密集層之前,您還需要一個展平層,以將體積轉換為一維矢量。
uj5u.com熱心網友回復:
第三個 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/362375.html
