トレーニングされたネットワークから新しいモデルへの最後の層(出力層)の重みをロードします
Aug 18 2020
set_weightsおよびget_weightsスキームを使用して、トレーニング済みネットワークから新しいモデルの最後のレイヤーに重みをロードすることは可能ですか?重要なのは、Matlabで計算を行うために、各レイヤーの重みをマットファイルとして(トレーニング後に)保存し、最後のレイヤーの変更された重みだけを新しいモデルと他のレイヤーの最後のレイヤーにロードすることです。トレーニング済みモデルと同じ重みを取得します。保存されたフォーマットはマットなので、少し注意が必要です。
weights1 = lstm_model1.layers[0].get_weights()[0]
biases1 = lstm_model1.layers[0].get_weights()[1]
weights2 = lstm_model1.layers[2].get_weights()[0]
biases2 = lstm_model1.layers[2].get_weights()[1]
weights3 = lstm_model1.layers[4].get_weights()[0]
biases3 = lstm_model1.layers[4].get_weights()[1]
# Save the weights and biases for adaptation algorithm
savemat("weights1.mat", mdict={'weights1': weights1})
savemat("biases1.mat", mdict={'biases1': biases1})
savemat("weights2.mat", mdict={'weights2': weights2})
savemat("biases2.mat", mdict={'biases2': biases2})
savemat("weights3.mat", mdict={'weights3': weights3})
savemat("biases3.mat", mdict={'biases3': biases3})
他のレイヤーの古いウェイトだけを新しいモデル(最後のレイヤーなし)にロードし、最後のレイヤーの変更されたウェイトを新しいモデルの最後のレイヤーにロードするにはどうすればよいですか?
回答
1 RyanRudes Aug 24 2020 at 13:41
.h5ファイル形式で保存されている場合、これは機能します。ただし、.matについてはよくわかりません。
簡単に言うget_weights
と、目的のレイヤーを呼び出すだけで、同様set_weights
に、他のモデルの対応するレイヤーを呼び出す必要があります。
last_layer_weights = old_model.layers[-1].get_weights()
new_model.layers[-1].set_weights(last_layer_weights)
より完全なコードサンプルについては、次を参照してください。
# Create an arbitrary model with some weights, for example
model = Sequential(layers = [
Dense(70, input_shape = (100,)),
Dense(60),
Dense(50),
Dense(5)])
# Save the weights of the model
model.save_weights(“model.h5”)
# Later, load in the model (we only really need the layer in question)
old_model = Sequential(layers = [
Dense(70, input_shape = (100,)),
Dense(60),
Dense(50),
Dense(5)])
old_model.load_weights(“model.h5”)
# Create a new model with slightly different architecture (except for the layer in question, at least)
new_model = Sequential(layers = [
Dense(80, input_shape = (100,)),
Dense(60),
Dense(50),
Dense(5)])
# Set the weights of the final layer of the new model to the weights of the final layer of the old model, but leaving other layers unchanged.
new_model.layers[-1].set_weights(old_model.layers[-1].get_weights())
# Assert that the weights of the final layer is the same, but other are not.
print (np.all(new_model.layers[-1].get_weights()[0] == old_model.layers[-1].get_weights()[0]))
>> True
print (np.all(new_model.layers[-2].get_weights()[0] == old_model.layers[-2].get_weights()[0]))
>> False