kerasの入門として、
排他論理和をkerasで作ったmodelに解かせてみました。
排他論理和
ちなみに排他論理和の復習を簡単にしておきます。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
両方が真、または両方が偽であれば、0。それぞれ異なる場合には1となるようなものが排他論理和になります。
グラフにプロットすると以下のようになります。
赤が1、青が0になります。これらは直線ではうまく分類できないことがわかります。これを線形分離不可能と言います。
今回はこの排他論理和を分類できるモデル(ニューラルネットワーク)をKerasを使って実装してみます。
実装
では、tensorflowとkerasを使って、排他論理和を解くモデルを作ってみます。
まず必要なモジュールをimportします。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
import numpy as np
import matplotlib.pyplot as plt
次にモデルを構築します。今回は以下のような簡単なモデルにします。
model = Sequential()
model.add(Dense(3, input_dim=2))
model.add(Activation("relu"))
model.add(Dense(5))
model.add(Activation("relu"))
model.add(Dense(2))
model.add(Activation("sigmoid"))
model.compile(loss="binary_crossentropy",
optimizer="adam")
出力層の素子数は2にしています。今回はone_hotエンコーディングしているためです。
つまり、0->[1., 0.],1->[0., 1.]となるように変換しています。活性化関数はsigmoid関数を使います。
次に学習用データを作ります。先程の表と同じです。
x_list = np.array([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])
y_list = np.array([0, 1, 1, 0])
one_hot_y_list = tf.one_hot(y_list, depth=2)
学習前の予測結果を見てみます。
print("---------------------------------------------")
print("学習前の予測結果")
print("---------------------------------------------")
for x,y in zip(x_list,y_list):
x = tf.expand_dims(x, 0)
print(f"x:{x}, y:{y}, pred:{tf.argmax(model.predict(x)[0])}")
---------------------------------------------
学習前の予測結果
---------------------------------------------
x:[[0. 0.]], y:0, pred:0
x:[[0. 1.]], y:1, pred:0
x:[[1. 0.]], y:1, pred:1
x:[[1. 1.]], y:0, pred:1
xが入力,yが正解,predが予測結果です。いくつか間違っている出力があることがわかります。
では、学習させてみます。
history = model.fit(x_list, one_hot_y_list, epochs=5000,verbose=0)
fit関数を使ってあげるだけなので、とても簡単に実行できます。
予測結果
では、もう一度先程と同じソースコードで予測させてみます。
print("---------------------------------------------")
print("学習後の予測結果")
print("---------------------------------------------")
for x,y in zip(x_list,y_list):
x = tf.expand_dims(x, 0)
print(f"x:{x}, y:{y}, pred:{tf.argmax(model.predict(x)[0])}")
---------------------------------------------
学習後の予測結果
---------------------------------------------
x:[[0. 0.]], y:0, pred:0
x:[[0. 1.]], y:1, pred:1
x:[[1. 0.]], y:1, pred:1
x:[[1. 1.]], y:0, pred:0
先程と違って、今回はちゃんと正解できていることがわかります。
終わりに
今回は、排他論理和を解かせるモデルをtensorflow(keras)を使って実装してみました。簡単に実装できるのでありがたいです。
ちなみに学習処理の理論的なところは、以下の記事等で紹介しています。
コメント
[…] https://www.tcom242242.net […]