更新日から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も使う事ができました。