aboutsummaryrefslogtreecommitdiff
path: root/src/train5.py
diff options
context:
space:
mode:
authortslil <tslil@posteo.de>2021-01-09 17:16:13 -0500
committertslil <tslil@posteo.de>2026-08-28 19:37:41 +0100
commit81948394f575f682700edee57626f784f6397dcc (patch)
treec5e235544655c06a809a2dc94050587144aa15f4 /src/train5.py
parent08db5599e3a9ba94b26916a88002361606a98353 (diff)
Two inputs to model, stacks and flat counts
Diffstat (limited to 'src/train5.py')
-rw-r--r--src/train5.py116
1 files changed, 67 insertions, 49 deletions
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)
-
-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")
-])
-
-model.compile(loss='categorical_crossentropy',
- optimizer='adam',
- metrics=['accuracy'])
-
-model.summary()
-
-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:]
-
-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:]
-
-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)]
-
-print("\n\n")
-for i in range(0, reps):
- print("Iteration ", i, ": ", results[i])
+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)