diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/train5.py | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/src/train5.py b/src/train5.py index 5c45564..2fc0d6f 100644 --- a/src/train5.py +++ b/src/train5.py @@ -3,7 +3,6 @@ import pandas as pd import numpy as np # Output of weights -import re from tensorflow import transpose # Custom activation function @@ -33,6 +32,16 @@ def clipped_pade_logistic(x): return clip_by_value(divide(val, k(24.0)), 0.0, 1.0) +# A cheaper version of tanh, x/6+25*x/(6*(2*x*x+5)), +# clipped between -1 and 1. +def clipped_pade_tanh(x): + val = add(divide(x, k(6.0)), + multiply(k(25.0), + divide(x, multiply(k(6.0), add(k(5.0), + multiply(k(2.0), square(x))))))) + return clip_by_value(val, -1.0, 1.0) + + def make_model(size, magic=[12, 9, 9]): # Our model for the stacks, a small CNN stack_shape = (size, size, 6) @@ -51,6 +60,8 @@ def make_model(size, magic=[12, 9, 9]): model = Model(inputs=[stack_model.input, flats_input], outputs=model) model.compile(optimizer='adam', loss='mean_squared_error', + # loss='mean_absolute_error', + # loss='mean_absolute_percentage_error', metrics=['accuracy']) model.summary() return model @@ -75,6 +86,7 @@ def load_data(size): val_outcome = val_data.iloc[:, -1:] return [(training_input, training_outcome), (val_input, val_outcome)] + def train(size, model, data, iterations=1, epochs=10): (training_input, training_outcome), (val_input, val_outcome) = data results = [] @@ -84,7 +96,7 @@ def train(size, model, data, iterations=1, epochs=10): validation_data=(val_input, val_outcome), verbose=True) v_loss, v_accuracy = model.evaluate(val_input, val_outcome, - verbose=False, batch_size=32) + verbose=False, batch_size=16) t_loss, t_accuracy = model.evaluate(training_input, training_outcome, verbose=False, batch_size=32) results += [((v_loss, t_loss), (v_accuracy, t_accuracy))] @@ -112,18 +124,21 @@ def magic_search(data): def write_weights(model): def fix(val): - string = str(val.tolist()) + string = str(np.array(val).tolist()) string = string.replace("[", "{").replace("]", "}") return string - # Prepare everything in a sane memory order - conv2d_weights = np.array(transpose(model.trainable_variables[0], perm=[3, 1, 0, 2])) - conv2d_biases = np.array(model.trainable_variables[1]) - dense1_weights = np.array(transpose(model.trainable_variables[2], perm=[1, 0])) - dense1_biases = np.array(model.trainable_variables[3]) - dense2_weights = np.array(transpose(model.trainable_variables[4], perm=[1, 0])) - dense2_biases = np.array(model.trainable_variables[5]) - output_weights = np.array(transpose(model.trainable_variables[6], perm=[1, 0])[0]) - output_bias = np.array(model.trainable_variables[7][0]) + # Prepare everything in a sane memory order This isn't exactly in + # the correct order that tensorflow uses, because memory access + # out of order is an eyesore. Compared to tensorflow, the C + # implementation has the board reflected about the diagonal. + conv2d_weights = transpose(model.trainable_variables[0], perm=[3, 0, 1, 2]) + conv2d_biases = model.trainable_variables[1] + dense1_weights = transpose(model.trainable_variables[2], perm=[1, 0]) + dense1_biases = model.trainable_variables[3]) + dense2_weights = transpose(model.trainable_variables[4], perm=[1, 0]) + dense2_biases = model.trainable_variables[5]) + output_weights = transpose(model.trainable_variables[6], perm=[1, 0])[0] + output_bias = model.trainable_variables[7][0] # Prepare formatting names = ["conv2d_weights[KERN_NUM][KERN_SIZE][KERN_SIZE][KERN_CHAN]", "conv2d_biases[KERN_NUM]", @@ -146,10 +161,12 @@ def write_weights(model): data = load_data(5) -model = make_model(5, [12, 9, 10]) -results = train(5, model, data, iterations=20, epochs=10) +model = make_model(5, [12, 11, 8]) +results = train(5, model, data, iterations=5, epochs=10) print("\nScores") for i in range(len(results)): - print("Iteration {0}: {1}".format(i+1, results[i])) + print("Iteration {0}: {1}".format(i+1, results[i])) write_weights(model) + +# results = magic_search(data) |
