add: as service

This commit is contained in:
h z
2025-01-26 16:13:49 +00:00
parent 1e6d11ebcf
commit 4f440e7e20
3 changed files with 145 additions and 11 deletions

View File

@@ -2,21 +2,23 @@ import numpy as np
import tensorflow as tf
from tensorflow import keras
from Board import Board
import random
class NeuralSolver:
def __init__(self, width, height, quotientX=False, quotientY=False):
def __init__(self, width, height, quotient_x=False, quotient_y=False):
self.Width = width
self.Height = height
self.QuotientX = quotientX
self.QuotientY = quotientY
self.QuotientX = quotient_x
self.QuotientY = quotient_y
self._build_forward_model()
self._build_reverse_model()
def _build_forward_model(self):
inputs = keras.Input(shape=(self.Width, self.Height, 1), name="InitialState")
hidden = keras.Conv2D(32, 3, padding="same", activation="relu")(inputs)
hidden = keras.layers.Conv2D(32, 3, padding="same", activation="relu")(inputs)
hidden = keras.layers.Conv2D(32, 3, padding="same", activation="relu")(hidden)
outputs = keras.Conv2D(1, 1, padding="same", activation="sigmoid")(hidden)
outputs = keras.layers.Conv2D(1, 1, padding="same", activation="sigmoid")(hidden)
self.ForwardModel = keras.Model(inputs, outputs, name="ForwardModel")
self.ForwardModel.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
@@ -26,14 +28,14 @@ class NeuralSolver:
def _build_reverse_model(self):
inputs = keras.Input(shape=(self.Width, self.Height, 1), name="FinalState")
hidden = keras.Conv2D(32, 3, padding="same", activation="relu")(inputs)
hidden = keras.layers.Conv2D(32, 3, padding="same", activation="relu")(inputs)
hidden = keras.layers.Conv2D(32, 3, padding="same", activation="relu")(hidden)
outputs = keras.Conv2D(1, 1, padding="same", activation="sigmoid")(hidden)
outputs = keras.layers.Conv2D(1, 1, padding="same", activation="sigmoid")(hidden)
self.ReverseModel = keras.Model(inputs, outputs, name="ReverseModel")
def train_forward(self, dataset, batch_size=8, epochs=10):
x, y = dataset
def train_forward(self, dataset_size, batch_size=8, epochs=10):
x, y = self.generate_training_data(dataset_size)
self.ForwardModel.fit(
x=x,
y=y,
@@ -42,12 +44,19 @@ class NeuralSolver:
verbose=1
)
def train_backward(self, dataset, batch_size=8, epochs=10):
x, y = dataset
def train_backward(self, dataset_size, batch_size=8, epochs=10):
x, y = self.generate_training_data(dataset_size)
self.ForwardModel.trainable = False
self.ForwardModel.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
loss=keras.losses.BinaryCrossentropy(),
metrics=["accuracy"],
)
reverse_inputs = self.ReverseModel.inputs
reverse_outputs = self.ReverseModel.outputs
forward_outputs = self.ForwardModel(reverse_outputs)
composite_model = keras.Model(reverse_inputs, forward_outputs, name="CompositeModel")
composite_model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
loss=keras.losses.BinaryCrossentropy(),
@@ -72,3 +81,20 @@ class NeuralSolver:
b = b[None, ..., None]
preds = self.ReverseModel.predict(b)
return preds > 0.5
def generate_training_data(self, dataset_size=1000):
x = np.zeros((dataset_size, self.Width, self.Height, 1), dtype=np.float32)
y = np.zeros((dataset_size, self.Width, self.Height, 1), dtype=np.float32)
for i in range(dataset_size):
board = Board(self.Width, self.Height, self.QuotientX, self.QuotientY)
ops = random.randint(self.Width * self.Height // 16, self.Width * self.Height)
for _ in range(ops):
x_ = random.randint(0, self.Width - 1)
y_ = random.randint(0, self.Height - 1)
board.toggle(x_, y_)
for (cx, cy) in board.lives:
x[i, cx, cy, 0] = 1.0
board.evaluate()
for (cx, cy) in board.lives:
y[i, cx, cy, 0] = 1.0
return x, y