PythonとKerasでXOR


更新日から1年以上経過しています。情報が古い可能性がございます。

社内勉強会ネタその4

MXNetでXORをやったので、Kerasでも同じことをしてみようの回。
KerasはTensorFlowやTheanoなどをバックエンドとして使えるDeepLearningライブラリです。
Kerasのバックエンドとして、前回の記事のMXNetも使えるようになりました。

では早速XORをやっていきましょう。
KerasのバックエンドはTensorFlowを使用しています。
使用バージョンは以下の通り。
・Python 3.6.3
・numpy 1.13.3
・Keras 2.0.6
・TensorFlow 1.3.0

下準備

相変わらずJupyter上で動かしているので、Jupyterのセルの中身を記載していきます。
まずは各種ライブラリのインポート。

import numpy as np

from keras.models import Sequential, model_from_json
from keras.layers.core import Dense
from keras.optimizers import RMSprop

kerasのインポートを行うと、バックエンドに使っているフレームワークの名前が出力されます。
以下の様な出力が私の環境では表示されています。

Using TensorFlow backend.

これでバックエンドにTensorFlowが使われているのが分かります。

続いてモデルを作成していきます。

model = Sequential()
model.add(Dense(2, input_shape=(2,), activation='sigmoid'))
model.add(Dense(2, activation='sigmoid'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='mean_squared_error', optimizer=RMSprop(), metrics=['accuracy'])

Denseと言うのは全結合層です。
compileまで行ってモデルの準備ができました。

データ準備

MXNetの時と同じXORのデータとラベルを用意します。

x_train = np.array([[0, 0],
                    [1, 0],
                    [0, 1],
                    [1, 1]], np.float32)

y_train = np.array([[1, 0],
                    [0, 1],
                    [0, 1],
                    [1, 0]], np.int32)

Kerasではラベルをone hot表現で記述するので、y_trainが上記の書き方になっています。

学習

学習データの加工は特に必要ないので、これをそのまま学習データに用いていきます。

model.fit(x_train, y_train, batch_size=4, epochs=10000, verbose=1)

verbose=1を指定しているので、途中の結果が出力されます。
以下の様な出力が出ます。

Epoch 1/10000
4/4 [==============================] - 0s - loss: 0.2511 - acc: 0.5000
Epoch 2/10000
4/4 [==============================] - 0s - loss: 0.2509 - acc: 0.5000
Epoch 3/10000
4/4 [==============================] - 0s - loss: 0.2508 - acc: 0.5000
Epoch 4/10000
4/4 [==============================] - 0s - loss: 0.2507 - acc: 0.5000
        ...中略...
Epoch 9997/10000
4/4 [==============================] - 0s - loss: 7.5198e-10 - acc: 1.0000
Epoch 9998/10000
4/4 [==============================] - 0s - loss: 7.5188e-10 - acc: 1.0000
Epoch 9999/10000
4/4 [==============================] - 0s - loss: 7.5178e-10 - acc: 1.0000
Epoch 10000/10000
4/4 [==============================] - 0s - loss: 7.5168e-10 - acc: 1.0000

学習できてそうですね。

確認

学習したモデルができたので、確認をしていきます。

y = model.predict(np.array([[0, 0],
                            [1, 0],
                            [0, 1],
                            [1, 1]]))
print(list(map(lambda a: a.argmax(), y)))

結果は以下の様になりました。

[0, 1, 1, 0]

ちゃんとXORになっています。

こんな感じでKerasも使う事ができました。


コメントを残す

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