Невозможно добавить слои в сохраненную модель Keras. Объект 'Model' не имеет атрибута 'add'
Я сохранил модель, используя model.save()
, Я пытаюсь перезагрузить модель и добавить несколько слоев и настроить некоторые гиперпараметры, однако она выдает AttributeError.
Модель загружается с помощью load_model()
,
Думаю, мне не хватает понимания, как добавить слои в сохраненные слои. Если кто-то может направить меня сюда, это будет здорово. Я новичок в углубленном изучении и использовании керас, поэтому, вероятно, моя просьба была бы глупой.
Snippet:
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 ответа
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(...)
Это связано с тем, что загруженная модель имеет функциональный тип, а не последовательную модель. Поэтому вам придется использовать функциональный 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)