こんにちは、ヒガシです。
前回の記事にて、学習済のAIモデルから重み&バイアスを取り出すことによって、ニューラルネットワーク内部の計算を行列計算のみで実施する方法をご紹介しました。
【AI】学習済みのニューラルネットワーク計算を行列計算のみで実行する方法
このとき使用したモデルは以下の画像通りで、単純な三層のMLPモデルになっていました。
今回はこのモデルに以下のように活性化関数(activation)を加えたモデルを作成し、そのモデルを再度行列計算のみで再現する方法をご紹介していこうと思います。
※なお、今回使用する活性化関数は一番よく使われるReluを適用して実施していきます。
それではやっていきましょう!
活性化関数つきのモデルを作成する
モデルがないと話になりませんので、まずはモデル構築からです。
※使用するデータは前回と同じなので気になる方は前回記事からご覧ください。
Kerasでのモデル構築コードは以下の通りです。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam
#ニューラルネットワーク構成⇒学習まで
model = Sequential()
model.add(Dense(20, input_dim=4))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('relu'))
model.add(Dense(1))
model.compile(loss="mean_absolute_error", optimizer=Adam(lr=0.001))
model.summary()
history=model.fit(Xdata,Ydata,batch_size=16,epochs=100,validation_split=0.2)
これで各層の間にReluが挟まったMLPモデルを構築できます。
各層から重み&バイアスを取り出す
モデルができたら次は重みとバイアスを取り出しましょう。
今回のモデルは以下の通りなので、重みとバイアスは0層目、2層目、4層目に格納されていることになります。(1層目、3層目は活性化関数なので)
ということで以下のコードで重み&バイアスを取り出します。
#1層目の係数を取得
layer1 = model.layers[0]
L1_weights=layer1.get_weights()[0]
L1_bias=layer1.get_weights()[1]
#2層目の係数を取得
layer2 = model.layers[2]
L2_weights=layer2.get_weights()[0]
L2_bias=layer2.get_weights()[1]
#3層目の係数を取得
layer3 = model.layers[4]
L3_weights=layer3.get_weights()[0]
L3_bias=layer3.get_weights()[1]
これで各変数に各層の重み、バイアスを格納されています。
取り出した重み、バイアスを使って行列計算を実施する
それでは取り出し重み&バイアスを使って先ほど紹介した活性化関数付きのMLPモデルを行列計算で再現してみましょう。
そのコードは以下の通りです。
Pred_mat=[]
for i in range(len(X_validation)):
input_data=X_validation[i,:].reshape(1,4)
L1P=np.dot(input_data,L1_weights)+L1_bias
L1P=np.where(L1P<0,0,L1P)
L2P=np.dot(L1P,L2_weights)+L2_bias
L2P=np.where(L2P<0,0,L2P)
L3P=np.dot(L2P,L3_weights)+L3_bias
Pred_mat.append(L3P)
Pred_mat=np.array(Pred_mat)
活性化関数「Relu」では0未満は0に、0以上はそのままに、という関数なのでnumpyのwhereを使って簡単に再現できます。
※numpy.whereの詳細は以下で解説で解説していますので興味があればあわせてご覧ください。
【python-numpy】条件に応じて配列の数値を変換!np.whereの解説
行列計算モデルの精度確認
それでは先ほどのコードで計算した値がKeras(AI計算用ライブラリ)を使って算出した値と問題なく一致しているか確認してみましょう。
そのコードは以下の通りです。
Predictdata = model.predict(X_validation)
plt.scatter(Predictdata,Pred_mat, color="b")
plt.xlabel('Keras_Predict')
plt.ylabel('numpy_Predict')
plt.show()
以下のグラフが出力されました。
完璧に一致していますね。
単純な行列計算だけで高度なAIライブラリ内部で行われている計算を再現できることが確認できました。
おわりに
というわけで今回は活性化関数付きのMLPモデルの内部計算をnumpyのみで再現する方法をご紹介しました。
Kerasなどのライブラリを準備できない環境下でAI計算を実施する際などにぜひご活用ください。
このように、私のブログでは様々なスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村
それではまた!
Follow @HigashiSalary
コメント