-Last time, using the created learning model, I actually played against AI in the ○ ✕ game. ――The first move is fixed to AI, and it seems that they are randomly placed. ―― ○ ✕ You can win the game if you hit it in the middle later, so it seems that it is not an AI that will definitely win.
ticktacktoo.py
#Please add at the bottom.
# Remove old model
if os.path.exists("model"):
shutil.rmtree("model")
# Save model for deployment on ML Engine
input_key = tf.placeholder(tf.int64, [None, ], name="key")
output_key = tf.identity(input_key)
input_signatures = {
"key": tf.saved_model.utils.build_tensor_info(input_key),
"squares": tf.saved_model.utils.build_tensor_info(squares_placeholder)
}
output_signatures = {
"key": tf.saved_model.utils.build_tensor_info(output_key),
"labels": tf.saved_model.utils.build_tensor_info(logits)
}
predict_signature_def = tf.saved_model.signature_def_utils.build_signature_def(
input_signatures,
output_signatures,
tf.saved_model.signature_constants.PREDICT_METHOD_NAME
)
builder = tf.saved_model.builder.SavedModelBuilder(os.path.join("model"))
builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.tag_constants.SERVING],
signature_def_map={
tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: predict_signature_def
},
assets_collection=tf.get_collection(tf.GraphKeys.ASSET_FILEPATHS)
)
builder.save()
game.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import numpy as np
class Setting:
def __init__(self):
self.board = None
self.current_player = None
self.result = None
self.reset()
def reset(self):
self.board = np.zeros(9, dtype=np.int32)
self.current_player = "x"
def step(self, index):
if self.board[index] != 0:
print("Invalid move!!")
return None, None, None, {"valid": False}
elif self.current_player == "x":
self.board[index] = 1
self.current_player = "o"
else:
self.board[index] = -1
self.current_player = "x"
observation = np.array(self.board)
done, info = self.check_game_result()
reward = 0
return observation, reward, done, info
def render(self):
markers = []
for i in self.board:
if i == 0:
markers.append("_")
elif i == 1:
markers.append("x")
else:
markers.append("o")
print("{} is thinking...".format(self.current_player))
print("{0}\t{1}\t{2}".format(markers[0], markers[1], markers[2]))
print("{0}\t{1}\t{2}".format(markers[3], markers[4], markers[5]))
print("{0}\t{1}\t{2}\n".format(markers[6], markers[7], markers[8]))
def check_game_result(self):
x_win, o_win, is_full = False, False, False
# Check rows and cols
for i in range(3):
row = self.board[(i * 3):(i * 3 + 3)]
col = self.board[i::3]
if np.sum(row) == 3 or np.sum(col) == 3:
x_win = True
if np.sum(row) == -3 or np.sum(col) == -3:
o_win = True
# Check diag
if np.sum(self.board[[0, 4, 8]]) == 3 or np.sum(self.board[[2, 4, 6]]) == 3:
x_win = True
if np.sum(self.board[[0, 4, 8]]) == -3 or np.sum(self.board[[2, 4, 6]]) == -3:
o_win = True
if 0 not in self.board:
is_full = True
done = x_win or o_win or is_full
info = {"x": x_win, "o": o_win, "full": is_full, "valid": True}
return done, info
play.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import sys
import numpy as np
import tensorflow as tf
import game
if __name__ == '__main__':
with tf.Graph().as_default() as graph:
sess = tf.Session()
meta_graph = tf.saved_model.loader.load(
sess=sess,
tags=[tf.saved_model.tag_constants.SERVING],
export_dir='model'
)
model_signature = meta_graph.signature_def[tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
input_signature = model_signature.inputs
output_signature = model_signature.outputs
# Get names of input and output tensors
input_tensor_name = input_signature['squares'].name
output_tensor_name = output_signature['labels'].name
# Get input and output tensors
squares = sess.graph.get_tensor_by_name(input_tensor_name)
labels = sess.graph.get_tensor_by_name(output_tensor_name)
env = game.Setting()
observation = env.reset()
done = False
info = None
rule = """
Input your move!
[0] top-left-square
[1] top-middle-square
[2] top-right-square
[3] middle-left-square
[4] middle-middle-square
[5] middle-right-square
[6] bottom-left-square
[7] bottom-middle-square
[8] bottom-right-square
"""
print(rule)
for _ in range(9):
env.render()
if done:
if info["x"]:
print("x win!")
elif info["o"]:
print("o win!")
else:
print("Draw!")
break
# Compute scores
prob_x_win = -np.ones(9)
prob_o_win = np.ones(9)
# prob_draw = np.zeros(9)
for i in range(9):
if env.board[i] == 0:
board_copy = np.array([env.board])
board_copy[0][i] = 1
prob = sess.run(labels, feed_dict={squares: board_copy})
# print i, prob
prob_x_win[i] = prob[0][0]
prob_o_win[i] = prob[0][1]
# prob_draw = prob[0][2]
# Decide CPU's move
if max(prob_x_win) >= 0.05:
cpu_move = prob_x_win.argmax()
else:
cpu_move = prob_o_win.argmin()
_, _, done, info = env.step(cpu_move)
env.render()
if done:
if info["x"]:
print("x win!")
elif info["o"]:
print("o win!")
else:
print("Draw!")
break
while True:
sys.stdout.write("Input your move: ")
player_move = input()
_, _, done, info = env.step(player_move)
if info["valid"]:
break
--Save again in SavedModel format. --Just re-execute the learning script again.
python ticktacktoo.py
The following files are created under the model directory.
saved_model.pb variables
--The following game board is not output. ――As mentioned above, the AI side randomly inputs the first move. --Players can type by entering numbers on the keyboard with reference to Input your move !.
2017-07-05 14:03:59.615507: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
2017-07-05 14:03:59.615531: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-07-05 14:03:59.615536: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-07-05 14:03:59.615540: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use FMA instructions, but these are available on your machine and could speed up CPU computations.
Input your move!
[0] top-left-square
[1] top-middle-square
[2] top-right-square
[3] middle-left-square
[4] middle-middle-square
[5] middle-right-square
[6] bottom-left-square
[7] bottom-middle-square
[8] bottom-right-square
x is thinking...
_ _ _
_ _ _
_ _ _
o is thinking...
_ _ x
_ _ _
_ _ _
x is thinking...
_ _ _
_ _ _
_ _ _
o is thinking...
_ _ x
_ _ _
_ _ _
Input your move: 4
x is thinking...
_ _ x
_ o _
_ _ _
o is thinking...
x _ x
_ o _
_ _ _
Input your move: 1
x is thinking...
x o x
_ o _
_ _ _
o is thinking...
x o x
_ o _
_ x _
Input your move: 5
x is thinking...
x o x
_ o o
_ x _
o is thinking...
x o x
x o o
_ x _
Input your move: 6
x is thinking...
x o x
x o o
o x _
o is thinking...
x o x
x o o
o x x
Draw!
x is thinking...
_ _ _
_ _ _
_ _ _
o is thinking...
x _ _
_ _ _
_ _ _
Input your move: 4
x is thinking...
x _ _
_ o _
_ _ _
o is thinking...
x _ x
_ o _
_ _ _
Input your move: 1
x is thinking...
x o x
_ o _
_ _ _
o is thinking...
x o x
_ o _
x _ _
Input your move: 3
x is thinking...
x o x
o o _
x _ _
o is thinking...
x o x
o o x
x _ _
Input your move: 7
x is thinking...
x o x
o o x
x o _
o win!
――It was the most suitable algorithm ever. (Maybe it's easy) ――Imagine that there are multiple boards and methods such as AlphaGo and Shogi, and I heard that it would not be an ordinary effort. ――I wonder if you haven't done it later. Per sentiment analysis? ――It may be time to buy a book and read it carefully.
-I made a ○ ✕ game using TensorFlow -I tried playing a game using TensorFlow
Recommended Posts