Model trainer: initial train and visualize thread pair (total crust mass; todo: altitude instead)

[?]
Jul 5, 2021, 3:43 AM
7ML3OFE732OG2ZBZWETBMMZTATOAJGOMNUEIV4GEJI56JX3P7NJQC

Dependencies

  • [2] SJHJS463 Model trainer: main function to open sdl window and launch second thread for actual training
  • [3] 5AMZXFS5 model trainer: function to generate inputs to pass neural network for rendering equirectangular projection
  • [4] ZM2EMAZO Start doing python multi-module stuff properly
  • [5] 6AXPZL5P Try to offload tight loop to rust (for now it segfaults)
  • [6] ROQCAPZJ Begin function for showing the map (for now just opens SDL window)
  • [7] E742MTJA Fix segfault (don't pass pointers between functions in different SDL versions), minor refactor
  • [8] ZRPV3GAJ Model trainer: Add function to make tensor of cartesian coordinates for drawing the map (equirectangular projection)
  • [9] FL3C6ERZ Assume python is being run with -m switch
  • [10] IGYI5RVV Figure out how to draw on the sdl2 window
  • [*] X5U7KRUI Parse some of the data into tensors

Change contents

  • edit in trainmodel/src/__main__.py at line 3
    [2.28]
    [4.0]
    from tensorflow import keras
    from . import model
  • replacement in trainmodel/src/__main__.py at line 8
    [2.30][2.30:51]()
    def train(filename):
    [2.30]
    [2.51]
    def train(monitor, filename):
  • replacement in trainmodel/src/__main__.py at line 10
    [2.103][2.103:128]()
    print(source.seed())
    [2.103]
    [2.128]
    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
    [2.151][2.151:230]()
    bg_thread = threading.Thread(target=train, args=(sys.argv[1],), kwargs={})
    [2.151]
    [2.230]
    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
    [2.252][2.252:270]()
    drawmap.run()
    [2.252]
    [2.270]
    drawmap.run(monitor)
  • replacement in trainmodel/src/drawmap.py at line 11
    [4.54][4.54:65]()
    def run():
    [4.54]
    [4.98]
    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)
    [4.71]
    [4.225]
    inputs = tf.reshape(inputs_equirectangular(1024, 512), (1024 * 512, 3))
  • edit in trainmodel/src/drawmap.py at line 19
    [4.244][4.244:276]()
    sdl2.SDL_FreeSurface(image)
  • edit in trainmodel/src/drawmap.py at line 20
    [4.252]
    [4.252]
    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
    [4.431]
    [4.431]
    sdl2.SDL_FreeSurface(image)
  • replacement in trainmodel/src/drawmap.py at line 40
    [4.516][4.744:913]()
    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]))
    [4.516]
    [4.913]
    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 tf
    from tensorflow import keras
    import threading
    def 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 = target
    self.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.stable
    self.lock.release()
    return result