#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
.