Model trainer: initial train and visualize thread pair (total crust mass; todo: altitude instead)
[?]
Jul 5, 2021, 3:43 AM
7ML3OFE732OG2ZBZWETBMMZTATOAJGOMNUEIV4GEJI56JX3P7NJQCDependencies
- [2]
SJHJS463Model trainer: main function to open sdl window and launch second thread for actual training - [3]
5AMZXFS5model trainer: function to generate inputs to pass neural network for rendering equirectangular projection - [4]
ZM2EMAZOStart doing python multi-module stuff properly - [5]
6AXPZL5PTry to offload tight loop to rust (for now it segfaults) - [6]
ROQCAPZJBegin function for showing the map (for now just opens SDL window) - [7]
E742MTJAFix segfault (don't pass pointers between functions in different SDL versions), minor refactor - [8]
ZRPV3GAJModel trainer: Add function to make tensor of cartesian coordinates for drawing the map (equirectangular projection) - [9]
FL3C6ERZAssume python is being run with -m switch - [10]
IGYI5RVVFigure out how to draw on the sdl2 window - [*]
X5U7KRUIParse some of the data into tensors
Change contents
- edit in trainmodel/src/__main__.py at line 3
from tensorflow import kerasfrom . import model - replacement in trainmodel/src/__main__.py at line 8
def train(filename):def train(monitor, filename): - replacement in trainmodel/src/__main__.py at line 10
print(source.seed())training_data = model.training_data(source)monitor.target.fit(x=training_data[0], y=training_data[1], batch_size=100, epochs=250, callbacks=monitor) - replacement in trainmodel/src/__main__.py at line 14
bg_thread = threading.Thread(target=train, args=(sys.argv[1],), kwargs={})m = model.model()m.compile(optimizer=keras.optimizers.RMSprop(),loss=keras.losses.MeanSquaredError())monitor = model.Monitor(m)bg_thread = threading.Thread(target=train, args=(monitor, sys.argv[1]), kwargs={}) - replacement in trainmodel/src/__main__.py at line 22
drawmap.run()drawmap.run(monitor) - replacement in trainmodel/src/drawmap.py at line 11
def run():def run(monitor): - replacement in trainmodel/src/drawmap.py at line 17[4.71]→[3.14:119](∅→∅),[3.119]→[4.127:168](∅→∅),[4.127]→[4.127:168](∅→∅),[4.459]→[4.168:225](∅→∅),[4.168]→[4.168:225](∅→∅)
test_tensor = tf.math.scalar_mul(255, tf.keras.activations.sigmoid(inputs_equirectangular(1024, 512)))image = tensor_to_surface(test_tensor)sdl2.SDL_BlitSurface(image, None, windowsurface, None)inputs = tf.reshape(inputs_equirectangular(1024, 512), (1024 * 512, 3)) - edit in trainmodel/src/drawmap.py at line 19
sdl2.SDL_FreeSurface(image) - edit in trainmodel/src/drawmap.py at line 20
outputs = monitor.snapshot()(inputs)outputs = tf.math.multiply(255, tf.reshape(outputs, (512, 1024, outputs.shape[1])))image = tensor_to_surface(outputs)sdl2.SDL_BlitSurface(image, None, windowsurface, None) - edit in trainmodel/src/drawmap.py at line 30
sdl2.SDL_FreeSurface(image) - replacement in trainmodel/src/drawmap.py at line 40
return helpers.render_tensor(ctypes.c_void_p(tf.cast(source, tf.uint8).numpy().ctypes.data), ctypes.c_int(shape[1]), ctypes.c_int(shape[0]), ctypes.c_int(shape[2]))source = tf.cast(source, tf.uint8).numpy()return helpers.render_tensor(ctypes.c_void_p(source.ctypes.data), ctypes.c_int(shape[1]), ctypes.c_int(shape[0]), ctypes.c_int(shape[2])) - file addition: model.py[12.6]
import tensorflow as tffrom tensorflow import kerasimport threadingdef model():inputs = keras.Input(shape=(3,))layer = keras.layers.Dense(9, activation=tf.math.asinh)(inputs)layer = keras.layers.Dense(24, activation=tf.math.asinh)(layer)layer = keras.layers.Dense(240, activation=tf.math.asinh)(layer)layer = keras.layers.Dense(240, activation=tf.math.asinh)(layer)layer = keras.layers.Dense(24, activation=tf.math.asinh)(layer)outputs = keras.layers.Dense(1, activation=keras.activations.sigmoid)(layer)return keras.Model(inputs=inputs, outputs=outputs, name="geology_model")def training_data(simresult):return (simresult.vertices, tf.math.multiply(1/700000000, simresult.crust_layers['total']))def clone_my_model(source):custom_objects = {"asinh": tf.math.asinh}with keras.utils.custom_object_scope(custom_objects):return keras.models.clone_model(source)class Monitor(keras.callbacks.Callback):def __init__(self, target):self.lock = threading.Lock()self.target = targetself.stable = clone_my_model(target)def on_epoch_end(self, epoch, logs=None):self.lock.acquire()self.stable.set_weights(self.target.get_weights())self.lock.release()def snapshot(self):self.lock.acquire()result = self.stableself.lock.release()return result