3目並べを利用したAlphaGoの学習 tensorflow-2編 学習
1.概要
AlphaGoの勉強過程で3目並べを学んでいます。前回までTensorflow-1.15を利用しました。今回からTensorflow-2.9に実行環境を変更して、tensorflow-1.15と同じことを実行します。tensorflow-1.xとtensorflow-2.xの比較をするために、できるだけtensorflow-1.15の設定やコードを変更せずに、実行するために必要な最低限の変更に留めます。
2.詳細
(1) 概要
3目並べのフィールドを3☓3のイメージと考えて、手書き文字認識の手法を利用します。利用する環境はtensorflow-2.9環境です。入力データはminimax法で活用したすべての手順(9!=362880)の組み合わせの中から勝負が決まった時点の3目並べのフィールド情報と結果(勝ち、負け、引き分け)を利用します。
tensorflowで利用できる形式に変換し、学習をしてモデルを作成し、モデルを利用して3目並べの対戦をします。元情報がminimax法で解析した情報なので、tensorflowによる学習結果がminimax法まで到達できると最高の結果です。大まかな手順は以下の通りです。
(1) minimax法の解析を利用して学習用入力データを作成
(2) 作成した学習用入力データを利用して、tensorflowでモデル作成
(3) tensorflowのモデルを利用して実際に対戦
(1)の学習用入力データ作成部分に変わりはないので、(2)(3)を2回に分割して記述します。
(2) 詳細
(2) 作成した学習用入力データを利用して、tensorflowでモデル作成
dl2tensorflow.pyを作成します。動作環境はtensorflow-2.9の環境です。
学習用データは、tensorflow-1.15と同じものを利用します。r1_data.npy(フィールドデータ)、r2_data.npy(結果データ)で、件数は、255,168件です。結果を知っているので、100%のデータを利用して、トレーニングをしてモデルを作成、保存します。完成したモデルは、dl2model.h5で保存します。
tensorflow-1.15では、epochは100に設定していました。しかし、tensorflow-1.15のように収束しません。600回以上に設定するとTensorflow-1.15のように収束します。また、グラフパラメータをlossに変更しました。tensorflow-1.15側のコードをlossに変更すると比較できます。
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
images = np.load('dl1_data.npy')
labels = np.load('dl2_data.npy')
print(images.shape, labels.shape)
count = int(images.shape[0] * 0.75)
train_images, test_images = np.split(images, [count])
print(train_images.shape, test_images.shape)
train_labels, test_labels = np.split(labels, [count])
print(train_labels.shape, test_labels.shape)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(64, activation='sigmoid', input_shape=(9,)),
tf.keras.layers.Dense(32, activation='sigmoid'),
tf.keras.layers.Dropout(rate=0.5),
tf.keras.layers.Dense(3, activation='softmax')
])
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
model.compile(optimizer='SGD',
loss=loss_fn,
metrics=['accuracy'])
history = model.fit(images, labels, batch_size=500,
epochs=600, validation_split=0.2)
plt.plot(history.history['accuracy'], label='accuracy')
plt.plot(history.history['loss'], label='loss')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(loc='best')
plt.show()
model.save('dl2model.h5')
model = tf.keras.models.load_model("dl2model.h5")
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('loss: {:.3f}\nacc: {:.3f}'.format(test_loss, test_acc))
参考
[外部サイト参照]
・ミニマックス法で最強の3目並べAIを実装する話
コメント
コメントを投稿