web-dev-qa-db-ja.com

保存されたKerasモデルにレイヤーを追加できません。 「モデル」オブジェクトには属性「追加」がありません

model.save()を使用してモデルを保存しました。モデルをリロードしていくつかのレイヤーを追加し、いくつかのハイパーパラメーターを調整しようとしていますが、AttributeErrorがスローされます。

モデルはload_model()を使用してロードされます。

保存したレイヤーにレイヤーを追加する方法を理解できていないようです。誰かが私をここに案内してくれるなら、それは素晴らしいことです。私はディープラーニングとケラスの初心者なので、おそらく私の要求はばかげているでしょう。

スニペット:

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()モデルでレイヤーの追加が機能することはわかっていますが、既存の保存済みモデルにどのように追加しますか?

7

addメソッドは シーケンシャルモデルSequential class )にのみ存在します。これは、より強力ですが複雑なシンプルなインターフェイスです- 機能モデルModel class )。 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(...)
9
jdehesa

これは、読み込まれたモデルがシーケンシャルモデルではなく関数型であることによるものです。したがって、ここで説明するように、機能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)
8
Thomas Pinetz