私のモデルは、次のような単純な完全接続ネットワークです。
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.
最初に入力を与えて最後から出力を取得する代わりに、ネットワークの途中で自分の入力を渡して出力を取得する方法はありますか?どんな助けでも大歓迎です。
同じ結果を達成するための別の方法があります。最初に新しい入力レイヤーを作成してから、それを下位レイヤー(ウェイト付き)に接続します。
この目的のために、最初に再初期化これらのレイヤー(同じ名前)およびリロード対応する重みから親モデル使用
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)
この方法は、複数の入力またはブランチを持つ複雑なモデルで機能します。必要なレイヤーに同じコードをコピーし、新しい入力を接続して、最後に対応するウェイトをロードする必要があります。