Keras添加层和非类型:类型错误,不可下标

2024-04-25 13:37:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用预训练的VGG16模型作为编码器部分,为Keras中的分段创建一个FCN。现在在解码器部分,我尝试将转置卷积层的输出添加到VGG模型早期层的输出中

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

但是它在Add层的构建函数中抛出了一个TypeError: 'NoneType' object is not subscriptable

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

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出于某种原因不喜欢使用Keras层

不管怎样,解决这个问题的最佳方法是什么?我可以使输入形状固定,但我认为FCN的优点是它可以接受可变的输入形状


Tags: 模型noneaddlayerinputoutputkerasshape