-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDeepDomineeringAugmentation.py
122 lines (100 loc) · 3.77 KB
/
DeepDomineeringAugmentation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D
def get_model(board_size):
model = Sequential()
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', input_shape=(board_size, board_size, 3), padding="same"))
model.add(Conv2D(64, (3, 3), activation='relu', padding="same"))
model.add(Conv2D(64, (3, 3), activation='relu', padding="same"))
model.add(Conv2D(64, (3, 3), activation='relu', padding="same"))
model.add(Conv2D(64, (3, 3), activation='relu', padding="same"))
model.add(Conv2D(1, (3, 3), activation='relu', padding="same"))
model.add(Flatten())
model.add(Dense(board_size**2, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy'])
return model
def prepare_data(row, board_size):
board = row[:board_size**2]
flipped_board = row[board_size**2:2*board_size**2]
turn = row[2*board_size**2:3*board_size**2]
output = row[3*board_size**2:]
board = np.array(board).reshape((board_size, board_size)).T
flipped_board = np.array(flipped_board).reshape((board_size, board_size)).T
turn = np.array(turn).reshape((board_size, board_size)).T
output = np.array(output)
state = np.zeros((board_size, board_size, 3))
state[:,:,0] = board
state[:,:,1] = flipped_board
state[:,:,2] = turn
return state, output
def prepare_data_lr(row, board_size):
data = prepare_data(row, board_size)
state = data[0]
state = np.fliplr(state)
output = data[1]
output = np.array(output).reshape((board_size, board_size)).T
output = np.fliplr(output)
player = int(state[:, :, 2][0][0])
if player == 0: # vertical
output = output.T
output = output.ravel()
return state, output
if player == 1: # horizental
permutation = [7, 0, 1, 2, 3, 4, 5, 6]
i = np.argsort(permutation)
output_moved = output[:, i]
output_moved = output_moved.T
output_moved = output_moved.ravel()
return state, output_moved
def prepare_data_ud(row, board_size):
data = prepare_data(row, board_size)
state = data[0]
state = np.flipud(state)
output = data[1]
output = np.array(output).reshape((board_size, board_size)).T
output = np.flipud(output)
player = int(state[:, :, 2][0][0])
if player == 1: # horizental
output = output.T
output = output.ravel()
return state, output
if player == 0: # vertical
output_moved = np.roll(output, 7, axis=0)
output_moved = output_moved.T
output_moved = output_moved.ravel()
return state, output_moved
filename = 'domineering.csv'
df = pd.read_csv(filename, sep=',', na_values=[""], header=None)
board_size = 8
data = df.values.tolist()
train = data[:int(0.7*len(data))]
test = data[int(0.7*len(data)):]
X = []
for t in train:
row = prepare_data(t, board_size)
X.append(row)
row_lr = prepare_data_lr(t, board_size)
X.append(row_lr)
row_ud = prepare_data_ud(t, board_size)
X.append(row_ud)
X_train = np.array([k[0] for k in X])
Y_train = np.array([k[1] for k in X])
XT = []
for t in test:
row = prepare_data(t, board_size)
XT.append(row)
row_lr = prepare_data_lr(t, board_size)
XT.append(row_lr)
row_ud = prepare_data_ud(t, board_size)
X.append(row_ud)
X_test = np.array([k[0] for k in XT])
Y_test = np.array([k[1] for k in XT])
model = get_model(board_size)
model.fit(X_train, Y_train, validation_split=0.1, epochs=20)
pred_test = model.predict(X_test)
acc = accuracy_score(np.argmax(Y_test, axis=1), np.argmax(pred_test, axis=1))
print("Accuracy : %s " %acc)