aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xextract.sh19
-rw-r--r--src/pptdb.c21
-rw-r--r--src/train5.py102
3 files changed, 75 insertions, 67 deletions
diff --git a/extract.sh b/extract.sh
index 89518dd..b36ae02 100755
--- a/extract.sh
+++ b/extract.sh
@@ -5,8 +5,8 @@ db_file=games_anon.db
query() {
query="(size == $1) and (result != '1-0') and (result != '0-1') and (result != '0-0')"
selct=""
- # for player in rabbitboy84 fwwwwibib archvenison Simmon AaaarghBot; do
- for player in; do
+ for player in rabbitboy84 fwwwwibib archvenison Simmon AaaarghBot; do
+ # for player in; do
selct="$selct(player_black == '$player') or (player_white == '$player') or "
done;
if [ -n "$selct" ]; then
@@ -30,14 +30,13 @@ process() {
num_games=$2
./pptdb "$size" "data/playtak-$size" > "data/check-$size"
tail -n22 "data/check-$size"
- echo -ne "\tStripping overflows and illegal games..."
+ echo -ne "\tStripping overflows and illegal games... "
grep -Fvxf "data/check-$size" "data/playtak-$size" > "data/good-playtak-$size"
- echo -e "Done\n\tChoosing $num_games from what remains ..."
+ echo -en "Done.\n\tChoosing $num_games from what remains... "
shuf -n $num_games "data/good-playtak-$size" > "data/smalltak-$size"
- echo -en "Done\n\tGenerating training data... "
+ echo -en "Done.\n\tGenerating training data... "
./pptdb "$size" "data/smalltak-$size" generate
- echo -e "\tDone, $(wc -l data/training-$size.csv | cut -d\ -f1) samples."
- echo -en "\tShuffling... "
+ echo -en "\tShuffling $(wc -l data/training-$size.csv | cut -d\ -f1) samples... "
head -n 1 "data/training-$size.csv" > "data/shuf-$size.csv"
tail -n+2 "data/training-$size.csv" | shuf >> "data/shuf-$size.csv"
mv "data/shuf-$size.csv" "data/training-$size.csv"
@@ -46,14 +45,14 @@ process() {
rm "data/training-$size.csv.gz"
fi
gzip "data/training-$size.csv"
- echo -e "Done!\n\tCompressed version available in data/training-$size.csv.gz"
+ echo "Done, available in data/training-$size.csv.gz"
}
make pptdb
for size in 5 6; do
- extract $size notation,result
- process $size 20000
echo
+ extract $size notation,result
+ process $size 30000
done
diff --git a/src/pptdb.c b/src/pptdb.c
index e681735..8e8285a 100644
--- a/src/pptdb.c
+++ b/src/pptdb.c
@@ -17,12 +17,11 @@ write_input(void) {
/* fprintf(training_fh,"%d,",current_colour == C_BLACK); */
// Two numbers for flats remaining
- /*
- * fprintf(training_fh,"%.6f,%.6f,",
- * (float)(white_count & 127)/max_flats,
- * (float)(black_count & 127)/max_flats);
- */
+ fprintf(training_fh,"%.8f,%.8f,",
+ (float)(white_count & 127)/max_flats,
+ (float)(black_count & 127)/max_flats);
+ // Top layer of stacks is handled differently to indicate stone type
float val;
uint16_t mask = 1;
for (int k = 0; k < board_size * board_size; k++) {
@@ -38,7 +37,7 @@ write_input(void) {
}
fprintf(training_fh,"%.2f,", val);
}
-
+ // Layers underneath
for (int depth = 1; depth < max_depth; depth++) {
for (int k = 0; k < board_size * board_size; k++) {
val = 0;
@@ -48,7 +47,6 @@ write_input(void) {
mask <<= 1;
}
-
/*
* float t;
* for (int k = 0; k < board_size * board_size; k++) {
@@ -165,19 +163,12 @@ main(int argc, char **argv) {
if (training_fh == NULL) exit(EXIT_FAILURE);
// Write header
- /* fputs("\"Player\",\"White flats\",\"Black flats\",",training_fh); */
+ fputs("\"White flats\",\"Black flats\",",training_fh);
for (int depth = 0; depth < max_depth; depth++) {
for (int k = 0; k < size*size; k++) {
fprintf(training_fh,"\"Stack %d %d\",",depth,k);
}
}
-
- /*
- * for (int k = 0; k < size*size; k++) {
- * fprintf(training_fh,"\"BT %d\",",k);
- * }
- */
-
fputs("\"White win\",\"Black win\"\n",training_fh);
} else generate=0;
diff --git a/src/train5.py b/src/train5.py
index dd02df7..99ebd68 100644
--- a/src/train5.py
+++ b/src/train5.py
@@ -1,10 +1,8 @@
import pandas as pd
import numpy as np
-import tensorflow.keras.losses
-
-from tensorflow.keras.models import Sequential
-from tensorflow.keras.layers import Dropout
+from tensorflow.keras.models import Model
+from tensorflow.keras.layers import Concatenate
from tensorflow.keras.layers import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Convolution2D
@@ -13,48 +11,68 @@ from tensorflow.keras.layers import Flatten
# 30 10(11) 5
# 27 17 4
-size = 6
-magic = int(size*3/2.0)
-shape = (-1, size, size, 8)
+def make_model(size, magic=6):
+ # Our model for the stacks, a small CNN
+ stack_shape = (size, size, 8)
+ stack_input = Input(shape=stack_shape)
+ stack_model = Convolution2D(magic, kernel_size=(3, 3), strides=(1, 1),
+ padding='valid', activation="relu",
+ use_bias=True)(stack_input)
+ stack_model = Flatten()(stack_model)
+ # stack_model = Dense(magic, activation="relu", use_bias=True)(stack_model)
+ stack_model = Model(inputs=stack_input, outputs=stack_model)
+
+ # The overall model
+ flats_input = Input(shape=(2,))
+ combn_input = Concatenate()([stack_model.output, flats_input])
+ model = Dense(magic+2, activation="relu", use_bias=True)(combn_input)
+ model = Dense(magic, activation="relu", use_bias=True)(model)
+ model = Dense(2, activation="sigmoid", use_bias=True)(model)
+ model = Model(inputs=[stack_model.input, flats_input], outputs=model)
+
+ model.compile(optimizer='adam',
+ loss='binary_crossentropy',
+ # loss='categorical_crossentropy',
+ # loss='mean_squared_error',
+ metrics=['accuracy'])
+
+ model.summary()
+ return model
-model = Sequential([
- Input(shape[1:]),
- Convolution2D(magic, kernel_size=(3, 3), strides=(1, 1),
- padding='valid',
- activation="relu", use_bias=True),
- Flatten(),
- Dropout(0.2),
- Dense(magic, activation="relu", use_bias=True),
- Dense(2, activation="softmax")
-])
+def train(size, model, reps):
+ shape = (-1, size, size, 8)
-model.compile(loss='categorical_crossentropy',
- optimizer='adam',
- metrics=['accuracy'])
+ tr_fn = "training-"+str(size)+".csv"
+ training_csv = pd.read_csv(tr_fn) # .head(80000)
+ training_data = training_csv
+ training_stack_input = np.array(training_data.iloc[:, 2:-2]).reshape(shape)
+ training_flats_input = np.array(training_data.iloc[:, 0:2])
+ training_input = [training_stack_input, training_flats_input]
+ training_outcome = training_data.iloc[:, -2:]
-model.summary()
+ val_fn = "validation-"+str(size)+".csv"
+ val_data = pd.read_csv(val_fn).tail(20000)
+ val_stack_input = np.array(val_data.iloc[:, 2:-2]).reshape(shape)
+ val_flats_input = np.array(val_data.iloc[:, 0:2])
+ val_input = [val_stack_input, val_flats_input]
+ val_outcome = val_data.iloc[:, -2:]
-tr_fn = "validation-"+str(size)+".csv"
-training_csv = pd.read_csv(tr_fn).head(80000)
-training_data = training_csv
-training_input = np.array(training_data.iloc[:, :-2]).reshape(shape)
-training_outcome = training_data.iloc[:, -2:]
+ results = []
+ for i in range(0, reps):
+ print("Iteration {0}/{1}".format(i+1, reps))
+ model.fit(training_input, training_outcome, epochs=5,
+ validation_data=(val_input, val_outcome),
+ verbose=True)
+ v_loss, v_accuracy = model.evaluate(val_input, val_outcome, verbose=False)
+ t_loss, t_accuracy = model.evaluate(training_input, training_outcome,
+ verbose=False)
+ results += [((v_loss, t_loss), (v_accuracy, t_accuracy))]
-val_fn = "validation-"+str(size)+".csv"
-val_data = pd.read_csv(val_fn).tail(20000)
-val_input = np.array(val_data.iloc[:, :-2]).reshape(shape)
-val_outcome = val_data.iloc[:, -2:]
+ print("\n\n")
+ for i in range(0, reps):
+ print("Iteration {0}/{1}: {2}".format(i+1, reps, results[i]))
-results = []
-reps = 10
-for i in range(0, reps):
- print("Iteration ", i)
- history = model.fit(training_input, training_outcome, epochs=1,
- validation_data=(val_input, val_outcome),
- verbose=False)
- loss, accuracy = model.evaluate(val_input, val_outcome, verbose=False)
- results += [(loss, accuracy)]
+ return model
-print("\n\n")
-for i in range(0, reps):
- print("Iteration ", i, ": ", results[i])
+# model = train(5, make_model(5), 50)
+# print(model.trainable_variables)