首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ValueError:输入通道数与滤波器的对应维数不匹配,512 != 3

ValueError:输入通道数与滤波器的对应维数不匹配,512 != 3
EN

Stack Overflow用户
提问于 2018-04-29 04:13:15
回答 1查看 3.2K关注 0票数 2

similar problem似乎尝试了它的解决方案,但是

代码语言:javascript
运行
复制
AttributeError: 'Tensor' object has no attribute 'reshape'

我正在使用keras构建一个基于VGG16的模型,下面的代码如下所示

代码语言:javascript
运行
复制
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)

这是基本模型输入输出。

代码语言:javascript
运行
复制
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>

在这里我们可以看到,输入通道是3,但它返回输出通道为512。(不确定是否与引发的异常有关。)据我所知,它与CNN输入层中的频道不匹配。我不想把它修好吗?

以下是CNN的图层:

代码语言:javascript
运行
复制
model = Sequential()
model.add(Conv2D(32, (5, 5), input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
#model.add(Activation('softmax'))
model = Model(inputs=base_model.input, outputs=model(base_model.output))
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

Model()方法在错误下面抛出:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 04:00:08

由于您不能对VGG16的输出做任何事情,所以我想您可以只修改输入层:

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

代码语言:javascript
运行
复制
model.add(Reshape(target_shape=(128, 128, 2), input_shape=list(base_model.output.get_shape().as_list()[1:])))

重塑层所做的是,它接受一个input_shape,然后将形状更改为target_shape。只要输入和目标的大小都是常量(所有数字的乘积相同),就允许进行此操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50083315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档