【问题标题】:Keras AttributeError: 'Functional' object has no attribute 'shape'Keras AttributeError:“功能”对象没有属性“形状”
【发布时间】:2021-01-31 22:30:59
【问题描述】:

尝试将 Densenet121 功能块添加到模型中。 我需要 Keras 模型以这种格式编写,而不是使用

model=Sequential() 
model.add()

方法 函数有什么问题,build_img_encod

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-62-69dd207148e0> in <module>()
----> 1 x = build_img_encod()

3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name)
    164         spec.min_ndim is not None or
    165         spec.max_ndim is not None):
--> 166       if x.shape.ndims is None:
    167         raise ValueError('Input ' + str(input_index) + ' of layer ' +
    168                          layer_name + ' is incompatible with the layer: '

AttributeError: 'Functional' object has no attribute 'shape'
def build_img_encod( ):
    base_model = DenseNet121(input_shape=(150,150,3),
                                 include_top=False,
                                 weights='imagenet')
    for layer in base_model.layers:
            layer.trainable = False
    flatten = Flatten(name="flatten")(base_model)
    img_dense_encoder = Dense(1024, activation='relu',name="img_dense_encoder", kernel_regularizer=regularizers.l2(0.0001))(flatten)
    model = keras.models.Model(inputs=base_model, outputs = img_dense_encoder)
    return model

【问题讨论】:

    标签: tensorflow keras deep-learning transfer-learning


    【解决方案1】:

    您收到该错误的原因是您需要提供base_modelinput_shape,而不是base_model

    替换此行:model = keras.models.Model(inputs=base_model, outputs = img_dense_encoder)

    与:model = keras.models.Model(inputs=base_model.input, outputs = img_dense_encoder)

    【讨论】:

      【解决方案2】:
      def build_img_encod( ):
          dense = DenseNet121(input_shape=(150,150,3),
                                       include_top=False,
                                       weights='imagenet')
          for layer in dense.layers:
                  layer.trainable = False
          img_input = Input(shape=(150,150,3))
          base_model = dense(img_input)
          flatten = Flatten(name="flatten")(base_model)
          img_dense_encoder = Dense(1024, activation='relu',name="img_dense_encoder", kernel_regularizer=regularizers.l2(0.0001))(flatten)
          model = keras.models.Model(inputs=img_input, outputs = img_dense_encoder)
          return model
      

      这行得通..

      【讨论】:

      • 如果您检查我的答案,则无需像在此答案中那样强制提供输入。
      • 实际上,您以这种方式提供两次输入密集 = DenseNet121(input_shape=(150,150,3), include_top=False, weights='imagenet') for layer in dense.layers: layer.trainable = 假 img_input = 输入(形状=(150,150,3))
      猜你喜欢
      • 2021-09-05
      • 2016-05-09
      • 2015-05-07
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2022-01-14
      相关资源
      最近更新 更多