【ディープラーニング】【keras】排他論理和をkerasで作ったmodelに解かせてみた

kerasの入門として、
排他論理和をkerasで作ったmodelに解かせてみました。

排他論理和

ちなみに排他論理和の復習を簡単にしておきます。

x1x2y
000
101
011
110

両方が真、または両方が偽であれば、0。それぞれ異なる場合には1となるようなものが排他論理和になります。
グラフにプロットすると以下のようになります。

赤が1、青が0になります。これらは直線ではうまく分類できないことがわかります。これを線形分離不可能と言います。

今回はこの排他論理和を分類できるモデル(ニューラルネットワーク)をKerasを使って実装してみます。

実装

※以下のgithubにソースコードはあげてあります。
https://github.com/tocom242242/aifx_blog_codes/blob/master/nn_tf2/exclusiveOR.ipynb

では、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)を使って実装してみました。簡単に実装できるのでありがたいです。

ちなみに学習処理の理論的なところは、以下の記事等で紹介しています。

コメント

タイトルとURLをコピーしました