web-dev-qa-db-ja.com

Kerasは中間層に入力を与え、最終出力を取得します

私のモデルは、次のような単純な完全接続ネットワークです。

inp=Input(shape=(10,))
d=Dense(64, activation='relu')(inp)
d=Dense(128,activation='relu')(d)
d=Dense(256,activation='relu')(d)     #want to give input here, layer3
d=Dense(512,activation='relu')(d)
d=Dense(1024,activation='relu')(d)
d=Dense(128,activation='linear')(d)

したがって、モデルを保存した後、レイヤー3に入力を与えたいと思います。現在行っているのは次のとおりです。

model=load_model('blah.h5')    #above described network
print(temp_input.shape)        #(16,256), which is equal to what I want to give

index=3
intermediate_layer_model = Model(inputs=temp_input,
                                 outputs=model.output)

End_output = intermediate_layer_model.predict(temp_input)

しかし、それは機能していません。つまり、互換性のない入力、入力はタプルなどのエラーが発生します。エラーメッセージは次のとおりです。

raise TypeError('`inputs` should be a list or Tuple.') 
TypeError: `inputs` should be a list or Tuple.

最初に入力を与えて最後から出力を取得する代わりに、ネットワークの途中で自分の入力を渡して出力を取得する方法はありますか?どんな助けでも大歓迎です。

5
Asim

同じ結果を達成するための別の方法があります。最初に新しい入力レイヤーを作成してから、それを下位レイヤー(ウェイト付き)に接続します。

この目的のために、最初に再初期化これらのレイヤー(同じ名前)およびリロード対応する重みから親モデル使用

new_model.load_weights( "parent_model.hdf5"、by_name = True

これにより、親モデルから必要なウェイトが読み込まれます。事前にレイヤーに適切な名前を付けてください。

idx = 3  
input_shape = model.layers[idx].get_input_shape_at(0) layer

new_input = Input(shape=input_shape)

d=Dense(256,activation='relu', name='layer_3')(new_input)
d=Dense(512,activation='relu', name='layer_4'))(d)
d=Dense(1024,activation='relu', name='layer_5'))(d)
d=Dense(128,activation='linear', name='layer_6'))(d)

new_model = Model(new_input, d)
new_model.load_weights("parent_model.hdf5", by_name=True)

この方法は、複数の入力またはブランチを持つ複雑なモデルで機能します。必要なレイヤーに同じコードをコピーし、新しい入力を接続して、最後に対応するウェイトをロードする必要があります。

2
anilsathyan7