Невозможно добавить слои в сохраненную модель 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)
Другие вопросы по тегам