Keras Добавляет layer и NoneType: ошибка типа, не поддается подписке

#python #tensorflow #keras #computer-vision #conv-neural-network

#питон #тензорный поток #keras #компьютерное зрение #conv-нейронная сеть

Вопрос:

Я пытаюсь создать FCN для сегментации в Keras, используя предварительно подготовленную модель VGG16 в качестве части кодера. Теперь в части декодера я пытаюсь добавить выходные данные транспонированного сверточного слоя к выходным данным более раннего слоя из модели VGG.

 x = Conv2DTranspose(layer4.output_shape[-1], 4, strides=2, padding="same", activation="relu")(x)
x = Add()([x, layer4])
 

Но это выбрасывает a TypeError: 'NoneType' object is not subscriptable в функцию сборки Add слоя

 ---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-39-0915433797bf> in <module>()
      7 # add a deconvolution layer, add skip with layer 4
      8 x = Conv2DTranspose(layer4.output_shape[-1], 4, strides=2, padding="same", activation="relu")(x)
----> 9 x = Add()([x, layer4])
     10 
     11 # another deconvolution layer with layer 3

3 frames

/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/merge.py in build(self, input_shape)
     90   def build(self, input_shape):
     91     # Used purely for shape validation.
---> 92     if not isinstance(input_shape[0], tuple):
     93       raise ValueError('A merge layer should be called on a list of inputs.')
     94     if len(input_shape) < 2:
 

Я полагаю, что это связано с типом ввода исходной модели VGG, которая принимает пакеты [(None, None, None, 3)] тензоров. Но я не знаю, как мне это исправить.

Я пробовал изменить Add слой на Lambda такой, как этот:

 x = Lambda(lambda x: tf.add(x[0], x[1]))((x, layer4))
 

Но tf.add по какой-то причине не любит наносить слои Кераса.

В любом случае, каков был бы наилучший способ исправить это? Я мог бы сделать форму ввода фиксированной, но я думал, что преимущества FCN заключаются в том, что он может принимать переменную форму ввода.

Комментарии:

1. Можете ли вы поделиться определением layer4 ? Как вы получаете его из сети VGG?

2. Может быть, попробуйте shape вместо output_shape : x = Conv2DTranspose(layer4.shape[-1], 4, strides=2, padding="same", activation="relu")(x)

3. Модель, которую я прошел keras.applications.vgg16.VGG16(include_top=False) , и layer4 является слоем объединения для блока 4, который был base_model.get_layer('block4_pool')

4. layer4 не имеет свойства shape . У него есть только input_shape и output_shape .