aboutsummaryrefslogtreecommitdiff
path: root/src/train5.py
blob: 99ebd6867733d08cddab83d8433357b9867c0d35 (plain)
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
import pandas as pd
import numpy as np

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
from tensorflow.keras.layers import Flatten

# 30 10(11) 5
# 27 17 4

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

def train(size, model, reps):
    shape = (-1, size, size, 8)

    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:]

    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:]

    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))]

    print("\n\n")
    for i in range(0, reps):
        print("Iteration {0}/{1}: {2}".format(i+1, reps, results[i]))

    return model

# model = train(5, make_model(5), 50)
# print(model.trainable_variables)