FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


KerasとMPSで同じ計算をする(1)

Kerasのコールバック関数内で係数にアクセスする
↑ここで学習時の係数を得る事はできた。この続き。

保存したKeras(Python)の係数がMetal Performance Shaders(macOSアプリ)で使えるかを確認する。単にMPS側でロードできます、だけじゃ不十分なので簡単な計算をして同じになるかを確認する。

(1)Keras側
まずはKeras側で計算する。
# モデル作成
model = Sequential()

model.add(Dense(4, activation='relu', input_shape=(2,)))
model.add(Dense(3, activation='relu'))

layer1 = model.layers[0]
layer2 = model.layers[1]

print("%s -> %s"%(layer1.input_shape , layer1.output_shape)) # (None, 2) -> (None, 4)
print("%s -> %s"%(layer2.input_shape , layer2.output_shape)) # (None, 4) -> (None, 3)
↑入力が2個で→4→出力3個になる。どちらも全結合層で構成。活性化関数はどちらもReLUにしとく。

学習は行わず単に行列の計算なので、係数の初期値を与えておく。
w1 = np.array([[-0.40,  0.96,  0.57, -0.40], [ 0.20 , -0.03, -0.09,  0.30]] )
b1 = np.array([0.1 , 0.2, 0.3,  0.4])
a1 = [w1,b1] 
layer1.set_weights(a1)

w2 = np.array([[-0.72,  0.36  , -0.34 ],
                       [ 0.18, -0.35,  0.85  ],
                       [ 0.48, -0.68, -0.48],
                       [ 0.13, -0.48,  0.64]])
b2 = np.array([0.5 , 0.6, 0.7])
a2 = [w2,b2]
layer2.set_weights(a2)
↑これで係数の初期値を与える。
# 入力を設定
x_train = [ [[0.1 , 0.2 ] ]]

# 実行
result = model.predict_on_batch(x_train)
print("resutl=%s"%result)
↑入力を設定して、実行する。

resutl=[[0.69752 0.10237998 1.01858 ]]

↑結果がこのように表示された。
w1_save = layer1.get_weights()[0].transpose(1, 0)
b1_save = layer1.get_weights()[1]

with open(fileName_w1, 'wb') as f:
    f.write(w1_save.tobytes())
with open(fileName_b1, 'wb') as f:
    f.write(b1_save.tobytes())
↑この時の係数保存部分はこんな感じでウエイトの方は転置行列にしてから保存。そういうもんらしい。TensorFlowの時もそうだったな。
二層目も同様に保存する。

続く。



<< KerasとMPSで同じ計算をする(2)  TopPage  休暇村近江八幡のキャンプ場に行ってきた >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1186-a95a174b




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad