是否有办法去掉avg_pool层?我找不到解决方案 🙁
SAMPLE_SHAPE = (32,32,3)def generate_model(sample_shape): inp = Input(shape=sample_shape) resnet = resnet50.ResNet50(weights="imagenet",include_top=False) x = resnet(inp) predictions = Dense(2, activation='softmax')(x) m = Model(inputs=inp, outputs=predictions) #model.add(Dense(2, activation='softmax')) # This creates a model #predictions = Dense(2, activation='softmax')(x) return mmodel = generate_model(SAMPLE_SHAPE)
错误:InvalidArgumentError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs) 1566 try: -> 1567 c_op = c_api.TF_FinishOperation(op_desc) 1568 except errors.InvalidArgumentError as e:
InvalidArgumentError: 由于从1中减去7导致的负维度大小,针对’resnet50_14/avg_pool/AvgPool’(操作:’AvgPool’)的输入形状为[?,1,1,2048]。
在处理上述异常时,发生了另一个异常:
ValueError Traceback (most recent call last) in () 15 #predictions = Dense(2, activation=’softmax’)(x) 16 return m —> 17 model = generate_model(SAMPLE_SHAPE)
in generate_model(sample_shape) 7 inp = Input(shape=sample_shape) 8 resnet = resnet50.ResNet50(weights=”imagenet”,include_top=False) —-> 9 x = resnet(inp) 10 predictions = Dense(2, activation=’softmax’)(x) 11
~\Anaconda3\lib\site-packages\keras\engine\topology.py in call(self, inputs, **kwargs) 552 553 # Actually call the layer, collecting output(s), mask(s), and shape(s). –> 554 output = self.call(inputs, **kwargs) 555 output_mask = self.compute_mask(inputs, previous_mask) 556
~\Anaconda3\lib\site-packages\keras\engine\topology.py in call(self, inputs, mask) 1988 return self._output_tensor_cache[cache_key] 1989 else: -> 1990 output_tensors, _, _ = self.run_internal_graph(inputs, masks) 1991 return output_tensors 1992
~\Anaconda3\lib\site-packages\keras\engine\topology.py in run_internal_graph(self, inputs, masks) 2138
if ‘mask’ not in kwargs: 2139
kwargs[‘mask’] = computed_mask -> 2140 output_tensors = _to_list(layer.call(computed_tensor, **kwargs)) 2141 output_masks = _to_list(layer.compute_mask(computed_tensor, 2142
computed_mask))~\Anaconda3\lib\site-packages\keras\layers\pooling.py in call(self, inputs) 152 strides=self.strides, 153 padding=self.padding, –> 154 data_format=self.data_format) 155 return output 156
~\Anaconda3\lib\site-packages\keras\layers\pooling.py in _pooling_function(self, inputs, pool_size, strides, padding, data_format) 269 padding, data_format): 270 output = K.pool2d(inputs, pool_size, strides, –> 271 padding, data_format, pool_mode=’avg’) 272 return output 273
~\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py in pool2d(x, pool_size, strides, padding, data_format, pool_mode) 3012 x = tf.nn.max_pool(x, pool_size, strides, padding=padding) 3013
elif pool_mode == ‘avg’: -> 3014 x = tf.nn.avg_pool(x, pool_size, strides, padding=padding) 3015 else: 3016 raise ValueError(‘Invalid pooling mode:’, pool_mode)~\Anaconda3\lib\site-packages\tensorflow\python\ops\nn_ops.py in avg_pool(value, ksize, strides, padding, data_format, name) 2110
padding=padding, 2111 data_format=data_format, -> 2112 name=name) 2113 2114~\Anaconda3\lib\site-packages\tensorflow\python\ops\gen_nn_ops.py in avg_pool(value, ksize, strides, padding, data_format, name) 73 _, _, _op = _op_def_lib._apply_op_helper( 74 “AvgPool”, value=value, ksize=ksize, strides=strides, padding=padding, —> 75 data_format=data_format, name=name) 76 _result = _op.outputs[:] 77 _inputs_flat = _op.inputs
~\Anaconda3\lib\site-packages\tensorflow\python\framework\op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords) 785 op = g.create_op(op_type_name, inputs, output_types, name=scope, 786 input_types=input_types, attrs=attr_protos, –> 787 op_def=op_def) 788 return output_structure, op_def.is_stateful, op 789
~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in create_op(self, op_type, inputs, dtypes, input_types, name, attrs, op_def, compute_shapes, compute_device) 3390
input_types=input_types, 3391
original_op=self._default_original_op, -> 3392 op_def=op_def) 3393 3394 # Note: shapes are lazily computed with the C API enabled.~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in init(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def) 1732 op_def, inputs, node_def.attr) 1733 self._c_op = _create_c_op(self._graph, node_def, grouped_inputs, -> 1734 control_input_ops) 1735 else: 1736 self._c_op = None
~\Anaconda3\lib\site-packages\tensorflow\python\framework\ops.py in _create_c_op(graph, node_def, inputs, control_inputs) 1568 except errors.InvalidArgumentError as e: 1569 # Convert to ValueError for backwards compatibility. -> 1570 raise ValueError(str(e)) 1571 1572 return c_op
ValueError: 由于从1中减去7导致的负维度大小,针对’resnet50_14/avg_pool/AvgPool’(操作:’AvgPool’)的输入形状为[?,1,1,2048]。
回答:
您的问题/错误来自于您的输入形状。您的输入形状太小了。
所有预训练网络都有一个最小的图像尺寸。对于ResNet50,这个最小尺寸是197。将您的SAMPLE_SHAPE增加到197或ResNet50的默认尺寸224:
SAMPLE_SHAPE = (197,197,3)
或者
SAMPLE_SHAPE = (224,224,3)
如果您的图像更小,请将它们调整到197或224大小