Python ValueError:输入通道数与筛选器的相应维度不匹配,512!=3.

Python ValueError:输入通道数与筛选器的相应维度不匹配,512!=3.,python,keras-layer,channels,Python,Keras Layer,Channels,似乎,他尝试了解决方案,但得到了成功 AttributeError: 'Tensor' object has no attribute 'reshape' 我正在使用keras构建一个基于VGG16的模型,下面的代码如下所示 if K.image_data_format() == 'channels_first': input_shape = (3, 256, 256) else: input_shape = (256, 256, 3) input_image = Input(

似乎,他尝试了解决方案,但得到了成功

AttributeError: 'Tensor' object has no attribute 'reshape'
我正在使用keras构建一个基于VGG16的模型,下面的代码如下所示

if K.image_data_format() == 'channels_first':
    input_shape = (3, 256, 256)
else:
    input_shape = (256, 256, 3)
input_image = Input(shape=input_shape)
base_model = VGG16( weights='imagenet', include_top=False, input_shape=input_shape)
这是基本模型输入输出

base_model.input
base_model.output
<tf.Tensor 'input_14:0' shape=(?, 256, 256, 3) dtype=float32>
<tf.Tensor 'block5_pool_13/MaxPool:0' shape=(?, 8, 8, 512) dtype=float32>
Model()
方法抛出以下错误:

ValueError: number of input channels does not match corresponding dimension of filter, 512 != 3

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-bace1b0f7f30> in <module>()
     23 model.add(Dense(3, activation='softmax'))
     24 #model.add(Activation('softmax'))
---> 25 model = Model(inputs=base_model.input, outputs=model(base_model.output))
     26 model.compile(loss='categorical_crossentropy',
     27               optimizer='rmsprop',

/usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in __call__(self, inputs, **kwargs)
    617 
    618             # Actually call the layer, collecting output(s), mask(s), and shape(s).
--> 619             output = self.call(inputs, **kwargs)
    620             output_mask = self.compute_mask(inputs, previous_mask)
    621 

/usr/local/lib/python3.6/dist-packages/keras/models.py in call(self, inputs, mask)
    577         if not self.built:
    578             self.build()
--> 579         return self.model.call(inputs, mask)
    580 
    581     def build(self, input_shape=None):

/usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in call(self, inputs, mask)
   2083             return self._output_tensor_cache[cache_key]
   2084         else:
-> 2085             output_tensors, _, _ = self.run_internal_graph(inputs, masks)
   2086             return output_tensors
   2087 

/usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in run_internal_graph(self, inputs, masks)
   2233                                 if 'mask' not in kwargs:
   2234                                     kwargs['mask'] = computed_mask
-> 2235                             output_tensors = _to_list(layer.call(computed_tensor, **kwargs))
   2236                             output_masks = layer.compute_mask(computed_tensor,
   2237                                                               computed_mask)

/usr/local/lib/python3.6/dist-packages/keras/layers/convolutional.py in call(self, inputs)
    166                 padding=self.padding,
    167                 data_format=self.data_format,
--> 168                 dilation_rate=self.dilation_rate)
    169         if self.rank == 3:
    170             outputs = K.conv3d(

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in conv2d(x, kernel, strides, padding, data_format, dilation_rate)
   3339         strides=strides,
   3340         padding=padding,
-> 3341         data_format=tf_data_format)
   3342 
   3343     if data_format == 'channels_first' and tf_data_format == 'NHWC':

/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py in convolution(input, filter, padding, strides, dilation_rate, name, data_format)
    779         dilation_rate=dilation_rate,
    780         name=name,
--> 781         data_format=data_format)
    782     return op(input, filter)
    783 

/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py in __init__(self, input_shape, filter_shape, padding, strides, dilation_rate, name, data_format)
    839           "number of input channels does not match corresponding dimension of "
    840           "filter, {} != {}".format(input_channels_dim,
--> 841                                     filter_shape[num_spatial_dims]))
    842 
    843     strides, dilation_rate = _get_strides_and_dilation_rate(

ValueError: number of input channels does not match corresponding dimension of filter, 512 != 3
ValueError:输入通道的数量与过滤器的相应维度不匹配,512!=3.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
23型号。添加(密集型(3,激活='softmax'))
24#型号.添加(激活('softmax'))
--->25模型=模型(输入=基本模型.输入,输出=模型(基本模型.输出))
26模型编译(loss='classifical_crossentropy',
27优化器='rmsprop',
/usr/local/lib/python3.6/dist-packages/keras/engine/topology.py in___调用(self,input,**kwargs)
617
618#实际调用层,收集输出、掩码和形状。
-->619输出=自调用(输入,**kwargs)
620输出屏蔽=自计算屏蔽(输入,前一个屏蔽)
621
/调用中的usr/local/lib/python3.6/dist-packages/keras/models.py(self、input、mask)
577如果不是自建的:
578 self.build()
-->579返回自模型调用(输入、掩码)
580
581 def生成(自身,输入形状=无):
/调用中的usr/local/lib/python3.6/dist-packages/keras/engine/topology.py(self、input、mask)
2083返回自。\u输出\u张量\u缓存[缓存\u键]
2084其他:
->2085输出张量,运行内部图(输入,掩码)
2086返回输出张量
2087
/运行内部图中的usr/local/lib/python3.6/dist-packages/keras/engine/topology.py(自身、输入、掩码)
2233如果“面具”不在kwargs中:
2234 kwargs['mask']=计算的\u mask
->2235输出\u张量=\u到\u列表(layer.call(计算的\u张量,**kwargs))
2236输出屏蔽=层。计算屏蔽(计算张量,
2237(U掩模)
/调用中的usr/local/lib/python3.6/dist-packages/keras/layers/convolutional.py(self,inputs)
166 padding=自填充,
167数据_格式=self.data_格式,
-->168扩张率=自身扩张率)
169如果self.rank==3:
170个输出=K.3d(
/conv2d中的usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py(x、内核、步幅、填充、数据格式、膨胀率)
3339步幅=步幅,
3340填充=填充,
->3341数据格式=tf数据格式)
3342
3343如果数据_格式=='channels_first'和tf_数据_格式=='NHWC':
/卷积中的usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn_ops.py(输入、过滤、填充、跨步、膨胀率、名称、数据格式)
779扩张率=扩张率,
780 name=名称,
-->781数据格式=数据格式)
782返回操作(输入、过滤器)
783
/usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/nn\u ops.py in\uuuuuuuuu init\uuuuuuuuu(self、input\u shape、filter\u shape、padding、步长、膨胀率、名称、数据格式)
839“输入通道的数量与的相应尺寸不匹配”
840“过滤器,{}!={}”。格式(输入通道),
-->841过滤器(形状[空间大小])
842
843步,扩张率=\u获得步数和扩张率(
ValueError:输入通道数与过滤器的相应维度不匹配,512!=3

既然您对VGG16的输出无能为力,我想您可以修改输入层:

将其添加为模型的第一层:

model.add(Reshape(target_shape=(128, 128, 2), input_shape=list(base_model.output.get_shape().as_list()[1:])))

重塑层所做的是,它接受一个
input\u形状
,然后将形状更改为
target\u形状
。只要输入和目标的大小不变(所有数字的乘积都相同),就允许此操作.

您可以尝试只修改您编写的层的输入,即添加
model.add(重塑(目标形状=(128,128,2),输入形状=列表(基本模型.输出.获取形状().作为列表()[1:]))
作为模型的第一层。@Primusa-谢谢,似乎错误已经消失了。我理解它重塑了尺寸。但不明白这条线的作用是什么?更具体地说,这里的目标形状是什么?目标形状是形状转换成的形状。它接受一个输入形状并将其转换成目标形状ormed to和输入形状必须相同。8*8*512==128*128*2,因此可以将VGG16的输出转换为128、128、2。只要乘积相同,实际数字或多或少都是任意的。
model.add(Reshape(target_shape=(128, 128, 2), input_shape=list(base_model.output.get_shape().as_list()[1:])))