Kerasでget_weights , set_weights。もうちょっと複雑なモデルで動作確認する。
import tensorflow as tf import numpy as np # Define the model. model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(1,)), tf.keras.layers.Dense(3, activation='linear'), tf.keras.layers.Dense(2, activation='linear'), tf.keras.layers.Dense(1, activation='linear') ]) print("----------------")
# レイヤー0の重み取得 L0w = model.layers[0].get_weights() L1w = model.layers[1].get_weights() L2w = model.layers[2].get_weights()
# 取得時の重みを表示 print("default weight 0", L0w ) print("default weight 1", L1w ) print("default weight 2", L2w )
# 重みを書き換え L0w[0][0][0] = 1.0 L0w[0][0][1] = 2.0 L0w[0][0][2] = 3.0 L1w[0][0][0] = 4.0 L1w[0][0][1] = 5.0 L1w[0][1][0] = 6.0 L1w[0][1][1] = 7.0 L1w[0][2][0] = 8.0 L1w[0][2][1] = 9.0 L2w[0][0][0] = 10.0 L2w[0][1][0] = 11.0
print("----------------") # 重みをモデルにセット model.layers[0].set_weights(L0w) model.layers[1].set_weights(L1w) model.layers[2].set_weights(L2w) # モデルの重みが更新されていることを確認 print("edited weight 0", model.layers[0].get_weights() ) print("edited weight 1", model.layers[1].get_weights() ) print("edited weight 2", model.layers[2].get_weights() ) print("----------------") print( " 0番 output の値" ) for n in range(0,5): predict_y = model.predict( np.array( [[n]] ) ) print( n , predict_y[0][0] )
model.layers[].get_weights()はレイヤーごと、ノードごとに重みを取ってくる。ノードとノードを繋ぐ線をエッジというが、重みはいわばエッジが持っているので、「現在のノード」→「次のノード」のペアで対象の重みの位置を表せる。
[0][そのレイヤーのノード番号][次のレイヤーのノード番号]
以下のように重みを書き換えてみる。
# 重みを書き換え L0w[0][0][0] = 1.0 L0w[0][0][1] = 2.0 L0w[0][0][2] = 3.0 L1w[0][0][0] = 0.0 L1w[0][0][1] = 1.0 L1w[0][1][0] = 0.0 L1w[0][1][1] = 0.0 L1w[0][2][0] = 0.0 L1w[0][2][1] = 1.0 L2w[0][0][0] = 3.0 L2w[0][1][0] = 4.0
結果、重みは以下のように設定されている。
バイアスは今回は0ということにして、伝達関数はLinearにしているので、入力値はノードに入ったら重みを掛けられてそのまま次のノードへ行く。重みが0だと0になるので以下のような足し算になり、結果値が16倍される関数になる。