旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【Python】 KerasでXOR回路を作成する

Kerasを使ってXOR回路を作成するというのは実用性はありませんが、自分がKeras初心者のため「とにかく簡単なサンプルが欲しい」と思い作成しました。まず、XOR回路は下記のようになります。
f:id:ni4muraano:20170127114534j:plain
ここでは入力に対して出力が下記表のようになるよう、図中のwの値を調整します。

x_1 x_2 y
0 0 0
1 0 1
0 1 1
1 1 0

これをKerasを使ってプログラムを書くと以下のコードとなります(コメントを日本語で書くとエラーが出たため、英語でコメントを書きました)。

# -*- coding: utf-8 -*-
import numpy as np

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

# Input data
X_train = np.array([[0.0, 0.0],
                    [1.0, 0.0],
                    [0.0, 1.0],
                    [1.0, 1.0]])
# Teacher for input
Y_train = np.array([0.0,
                    1.0,
                    1.0,
                    0.0])

# Build model
model = Sequential()
output_count_layer0 = 2
model.add(Dense(output_count_layer0, input_shape=(2,), bias=True, activation='sigmoid')) # Need to specify input shape for input layer
output_count_layer1 = 1
model.add(Dense(output_count_layer1, bias=True, activation='linear'))
model.compile(loss='mean_squared_error', optimizer=RMSprop(), metrics=['accuracy'])

# Start training
BATCH_SIZE = 4
ITERATION = 3000
history = model.fit(X_train, Y_train, batch_size=BATCH_SIZE, nb_epoch=ITERATION, verbose=0)

# Evaluate model
X_test = X_train
Y_test = Y_train
score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy:', score[1])

# Save model
model_file_name = 'xor.json'
model_json = model.to_json()
with open(model_file_name, 'w') as file:
    file.write(model_json)
# Save weights
weight_file_name = 'xor_weights.hdf5'
model.save_weights(weight_file_name)

# Load model
with open(model_file_name, 'r') as file:
    model_json = file.read()
    model = model_from_json(model_json)
# Load weights
model.load_weights(weight_file_name)

# Predict using trained model
y = model.predict(np.array([[0, 0]]))

とても短いコードで記述することが出来ました。Kerasはこれから少しずつ勉強したいと思います。