Невозможно добавить слои в сохраненную модель Keras. Объект «Модель» не имеет атрибута «добавить»

Я сохранил модель, используя 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(), но как нам добавить их в существующие сохраненные модели?


person Abhijit Nathwani    schedule 18.08.2017    source источник


Ответы (2)



Это связано с тем, что загруженная модель относится к функциональному типу, а не к последовательной модели. Поэтому вам придется использовать функциональный 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)
person Thomas Pinetz    schedule 18.08.2017
comment
Спасибо за ваш блестящий обходной путь! Но я думаю, что 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. - person keineahnung2345; 15.01.2019
comment
@keineahnung2345 действительно искал это решение часами - person Cabal; 03.06.2021