Day15 范例code出现 InvalidArgumentError
我用的tensorflow版本是2.0
谢谢~
完整错误信息如下,(自己有更改过keras.json中的"channels_last"和"channels_first",均是报相同错误)。
(50000, 32, 32, 3)
--------------------------------------------------------------------------- InvalidArgumentError Traceback (most recent call last) D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs) 1609 try: -> 1610 c_op = c_api.TF_FinishOperation(op_desc) 1611 except errors.InvalidArgumentError as e: InvalidArgumentError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,32]. During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) <ipython-input-1-f3e169563d31> in <module> 47 classifier.add(Convolution2D(32,3,3,activation='relu')) 48 classifier.add(BatchNormalization())##BatchNormalization ---> 49 classifier.add(MaxPooling2D(pool_size=(2,2))) 50 51 #flatten D:\Anaconda\lib\site-packages\tensorflow_core\python\training\tracking\base.py in _method_wrapper(self, *args, **kwargs) 455 self._self_setattr_tracking = False # pylint: disable=protected-access 456 try: --> 457 result = method(self, *args, **kwargs) 458 finally: 459 self._self_setattr_tracking = previous_value # pylint: disable=protected-access D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\engine\sequential.py in add(self, layer) 194 # If the model is being built continuously on top of an input layer: 195 # refresh its output. --> 196 output_tensor = layer(self.outputs[0]) 197 if len(nest.flatten(output_tensor)) != 1: 198 raise TypeError('All layers in a Sequential model ' D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py in __call__(self, inputs, *args, **kwargs) 840 not base_layer_utils.is_in_eager_or_tf_function()): 841 with auto_control_deps.AutomaticControlDependencies() as acd: --> 842 outputs = call_fn(cast_inputs, *args, **kwargs) 843 # Wrap Tensors in `outputs` in `tf.identity` to avoid 844 # circular dependencies. D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\layers\pooling.py in call(self, inputs) 246 strides=strides, 247 padding=self.padding.upper(), --> 248 data_format=conv_utils.convert_data_format(self.data_format, 4)) 249 return outputs 250 D:\Anaconda\lib\site-packages\tensorflow_core\python\ops\nn_ops.py in max_pool(value, ksize, strides, padding, data_format, name, input) 3813 padding=padding, 3814 data_format=data_format, -> 3815 name=name) 3816 3817 D:\Anaconda\lib\site-packages\tensorflow_core\python\ops\gen_nn_ops.py in max_pool(input, ksize, strides, padding, data_format, name) 5673 _, _, _op = _op_def_lib._apply_op_helper( 5674 "MaxPool", input=input, ksize=ksize, strides=strides, padding=padding, -> 5675 data_format=data_format, name=name) 5676 _result = _op.outputs[:] 5677 _inputs_flat = _op.inputs D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords) 791 op = g.create_op(op_type_name, inputs, dtypes=None, name=scope, 792 input_types=input_types, attrs=attr_protos, --> 793 op_def=op_def) 794 return output_structure, op_def.is_stateful, op 795 D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\func_graph.py in create_op(***failed resolving arguments***) 546 return super(FuncGraph, self)._create_op_internal( # pylint: disable=protected-access 547 op_type, inputs, dtypes, input_types, name, attrs, op_def, --> 548 compute_device) 549 550 def capture(self, tensor, name=None): D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\ops.py in _create_op_internal(self, op_type, inputs, dtypes, input_types, name, attrs, op_def, compute_device) 3427 input_types=input_types, 3428 original_op=self._default_original_op, -> 3429 op_def=op_def) 3430 self._create_op_helper(ret, compute_device=compute_device) 3431 return ret D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\ops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def) 1771 op_def, inputs, node_def.attr) 1772 self._c_op = _create_c_op(self._graph, node_def, grouped_inputs, -> 1773 control_input_ops) 1774 # pylint: enable=protected-access 1775 D:\Anaconda\lib\site-packages\tensorflow_core\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs) 1611 except errors.InvalidArgumentError as e: 1612 # Convert to ValueError for backwards compatibility. -> 1613 raise ValueError(str(e)) 1614 1615 return c_op ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,32].
回答列表
-
2020/07/13 上午 11:54Jeffrey贊同數:0不贊同數:0留言數:0
看起來應該跟 channel_first/channel_last 無關,
1. CONV 跟 Pooling 的 input data shape 一致?
2. 有退回 TF1.x 嘗試過嗎?
-
2020/10/01 下午 07:22Patrick Ruan贊同數:0不贊同數:0留言數:0
基本上出現 "Negative dimension size" 很容易是 我們的 輸入資料的 dimension 不足以作 maxpooling ,比如說
error message 最後兩行說, "caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,32]."
因為我們前一層輸出,這一層的輸入 size = (1,1,32) , (1,1) 是無法作 maxpooling 的
其實作 CNN 也是有機會中標 "Negative dimension size": 每次做CNN我們的 size 都會變小一點,做太多次了,變成了小於零。
比如 (32,32) 卷 (7,7) ==> (26,26) 再卷 (7, 7) ==> (20,20) 再卷 (7, 7) ==> (14,14) 再卷 (7, 7) ==> (8,8) 再卷 (7, 7) ==> (2, 2) ==> 再卷 (7, 7) 就變負的了 就會 是 Negative dimension size