无法向已保存的Keras模型添加层。'Model'对象没有属性'add'。

14

我使用model.save()保存了一个模型。现在我想重新加载该模型并添加一些层以及调整一些超参数,但是它会抛出AttributeError。

我使用load_model()函数来加载模型。

我猜我不清楚如何向已保存的模型中添加新的层。如果有人能在这方面给我指导,那就太好了。我是深度学习和keras的新手,所以我的请求可能很傻。

片段:

prev_model = load_model('final_model.h5') # loading the previously saved model.

prev_model.add(Dense(256,activation='relu'))
prev_model.add(Dropout(0.5))
prev_model.add(Dense(1,activation='sigmoid'))

model = Model(inputs=prev_model.input, outputs=prev_model(prev_model.output))

并且它抛出的错误:

Traceback (most recent call last):
  File "image_classifier_3.py", line 39, in <module>
    prev_model.add(Dense(256,activation='relu'))
AttributeError: 'Model' object has no attribute 'add'

我知道如何在新的Sequential()模型中添加图层,但是如何向现有的已保存模型添加图层呢?

2个回答

24
add 方法仅适用于 序贯模型Sequential),这是一个更简单的接口,用于更强大但更复杂的函数模型Model)。load_model 始终会返回一个最通用的类别 Model 实例。
您可以查看示例以了解如何组合不同的模型,但基本思想是,最终的 Model 表现几乎像任何其他层。因此,您应该能够执行以下操作:
prev_model = load_model('final_model.h5') # loading the previously saved model.

new_model = Sequential()
new_model.add(prev_model)
new_model.add(Dense(256,activation='relu'))
new_model.add(Dropout(0.5))
new_model.add(Dense(1,activation='sigmoid'))

new_model.compile(...)

11

这是因为所加载的模型是函数式模型而不是序列模型。因此,您需要使用功能API,如此处所述:(https://keras.io/getting-started/functional-api-guide/)。

最终,正确的函数大致如下:

fc = Dense(256,activation='relu')(prev_model)
drop = Dropout(0.5)(fc)
fc2 = Dense(1,activation='sigmoid')(drop)

model = Model(inputs=prev_model.input, outputs=fc2)

10
感谢你出色的解决方法!但我认为fc = Dense(256,activation='relu')(prev_model) 应该改成 fc = Dense(256,activation='relu')(prev_model.output),否则会出现 ValueError: Layer conv2d_308 was called with an input that isn't a symbolic tensor. Received type: <class 'keras.engine.training.Model'>. Full input: [<keras.engine.training.Model object at 0x2282c7c50>]. All inputs to the layer should be tensors. 的错误。 - keineahnung2345
@keineahnung2345 真的是太感谢了,我为寻找这个解决方案搜索了好几个小时。 - Cabal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接