スポンサーリンク

Tensorflow 2のKerasで重みの取得と設定(2)

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] )
----------------
default weight 0 [array([[ 0.8050083 , -0.3852656 , -0.80590665]], dtype=float32), array([0., 0., 0.], dtype=float32)]
default weight 1 [array([[ 0.6107633 , 0.51594055],
[-0.7214887 , -0.10213959],
[-0.45495993, 0.23035955]], dtype=float32), array([0., 0.], dtype=float32)]
default weight 2 [array([[0.20898771],
[0.69574296]], dtype=float32), array([0.], dtype=float32)]
----------------
edited weight 0 [array([[1., 2., 3.]], dtype=float32), array([0., 0., 0.], dtype=float32)]
edited weight 1 [array([[4., 5.],
[6., 7.],
[8., 9.]], dtype=float32), array([0., 0.], dtype=float32)]
edited weight 2 [array([[10.],
[11.]], dtype=float32), array([0.], dtype=float32)]
----------------
0番 output の値
0 0.0
1 906.0
2 1812.0
3 2718.0
4 3624.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倍される関数になる。

結果(最終出力のみ)

0番 output の値
0 0.0
1 16.0
2 32.0
3 48.
4 64.0

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: