ValueError: количество входных каналов не соответствует соответствующему измерению фильтра, 512! = 3 - PullRequest
0 голосов
/ 29 апреля 2018

Кажется, похожая проблема , попробовал ее решение, но получил

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>

Здесь мы видим, что входные каналы 3, но возвращает выходные каналы как 512. (Не уверен, имеет ли это какое-либо отношение к исключению.) Насколько я понимаю, он не соответствует каналам во входном слое для CNN. Мне не жарко, чтобы это исправить?

Вот слои CNN:

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() выдает ошибку ниже:

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

1 Ответ

0 голосов
/ 30 апреля 2018

Поскольку вы ничего не можете сделать с выводом VGG16, я подумал, что вы можете просто изменить входной слой:

Добавьте это как первый слой для вашей модели:

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

Что делает слой изменения формы, так это то, что он принимает input_shape, а затем меняет форму на target_shape. Эта операция разрешена, если размер входного и целевого значений постоянен (произведение всех чисел одинаково).

...