fixed some stuff in the code

This commit is contained in:
Thomas Gabor
2019-03-06 03:27:31 +01:00
parent 604ad6204d
commit 2966b41baf
2 changed files with 814 additions and 802 deletions

View File

@ -61,11 +61,13 @@ class NeuralNetwork(PrintingObject):
def __init__(self, **params): def __init__(self, **params):
super().__init__() super().__init__()
self.model = Sequential()
self.params = dict(epsilon=0.00000000000001) self.params = dict(epsilon=0.00000000000001)
self.params.update(params) self.params.update(params)
self.keras_params = dict(activation='linear', use_bias=False) self.keras_params = dict(activation='linear', use_bias=False)
def get_model(self):
raise NotImplementedError
def get_params(self): def get_params(self):
return self.params return self.params
@ -81,13 +83,13 @@ class NeuralNetwork(PrintingObject):
return self return self
def get_weights(self): def get_weights(self):
return self.model.get_weights() return self.get_model().get_weights()
def get_weights_flat(self): def get_weights_flat(self):
return np.hstack([weight.flatten() for weight in self.get_weights()]) return np.hstack([weight.flatten() for weight in self.get_weights()])
def set_weights(self, new_weights): def set_weights(self, new_weights):
return self.model.set_weights(new_weights) return self.get_model().set_weights(new_weights)
def apply_to_weights(self, old_weights): def apply_to_weights(self, old_weights):
raise NotImplementedError raise NotImplementedError
@ -117,7 +119,7 @@ class NeuralNetwork(PrintingObject):
return NeuralNetwork.are_weights_diverged(self.get_weights()) return NeuralNetwork.are_weights_diverged(self.get_weights())
def is_zero(self, epsilon=None): def is_zero(self, epsilon=None):
epsilon = epsilon or self.params.get('epsilon') epsilon = epsilon or self.get_params().get('epsilon')
return NeuralNetwork.are_weights_within(self.get_weights(), -epsilon, epsilon) return NeuralNetwork.are_weights_within(self.get_weights(), -epsilon, epsilon)
def is_fixpoint(self, degree=1, epsilon=None): def is_fixpoint(self, degree=1, epsilon=None):
@ -159,11 +161,15 @@ class WeightwiseNeuralNetwork(NeuralNetwork):
super().__init__(**kwargs) super().__init__(**kwargs)
self.width = width self.width = width
self.depth = depth self.depth = depth
self.model = Sequential()
self.model.add(Dense(units=self.width, input_dim=4, **self.keras_params)) self.model.add(Dense(units=self.width, input_dim=4, **self.keras_params))
for _ in range(self.depth-1): for _ in range(self.depth-1):
self.model.add(Dense(units=self.width, **self.keras_params)) self.model.add(Dense(units=self.width, **self.keras_params))
self.model.add(Dense(units=1, **self.keras_params)) self.model.add(Dense(units=1, **self.keras_params))
def get_model(self):
return self.model
def apply(self, *inputs): def apply(self, *inputs):
stuff = np.transpose(np.array([[inputs[0]], [inputs[1]], [inputs[2]], [inputs[3]]])) stuff = np.transpose(np.array([[inputs[0]], [inputs[1]], [inputs[2]], [inputs[3]]]))
return self.model.predict(stuff)[0][0] return self.model.predict(stuff)[0][0]
@ -258,11 +264,15 @@ class AggregatingNeuralNetwork(NeuralNetwork):
self.aggregates = aggregates self.aggregates = aggregates
self.width = width self.width = width
self.depth = depth self.depth = depth
self.model = Sequential()
self.model.add(Dense(units=width, input_dim=self.aggregates, **self.keras_params)) self.model.add(Dense(units=width, input_dim=self.aggregates, **self.keras_params))
for _ in range(depth-1): for _ in range(depth-1):
self.model.add(Dense(units=width, **self.keras_params)) self.model.add(Dense(units=width, **self.keras_params))
self.model.add(Dense(units=self.aggregates, **self.keras_params)) self.model.add(Dense(units=self.aggregates, **self.keras_params))
def get_model(self):
return self.model
def get_aggregator(self): def get_aggregator(self):
return self.params.get('aggregator', self.aggregate_average) return self.params.get('aggregator', self.aggregate_average)
@ -395,11 +405,15 @@ class FFTNeuralNetwork(NeuralNetwork):
self.aggregates = aggregates self.aggregates = aggregates
self.width = width self.width = width
self.depth = depth self.depth = depth
self.model = Sequential()
self.model.add(Dense(units=width, input_dim=self.aggregates, **self.keras_params)) self.model.add(Dense(units=width, input_dim=self.aggregates, **self.keras_params))
for _ in range(depth-1): for _ in range(depth-1):
self.model.add(Dense(units=width, **self.keras_params)) self.model.add(Dense(units=width, **self.keras_params))
self.model.add(Dense(units=self.aggregates, **self.keras_params)) self.model.add(Dense(units=self.aggregates, **self.keras_params))
def get_model(self):
return self.model
def get_shuffler(self): def get_shuffler(self):
return self.params.get('shuffler', self.shuffle_not) return self.params.get('shuffler', self.shuffle_not)
@ -452,11 +466,15 @@ class RecurrentNeuralNetwork(NeuralNetwork):
self.features = 1 self.features = 1
self.width = width self.width = width
self.depth = depth self.depth = depth
self.model = Sequential()
self.model.add(SimpleRNN(units=width, input_dim=self.features, return_sequences=True, **self.keras_params)) self.model.add(SimpleRNN(units=width, input_dim=self.features, return_sequences=True, **self.keras_params))
for _ in range(depth-1): for _ in range(depth-1):
self.model.add(SimpleRNN(units=width, return_sequences=True, **self.keras_params)) self.model.add(SimpleRNN(units=width, return_sequences=True, **self.keras_params))
self.model.add(SimpleRNN(units=self.features, return_sequences=True, **self.keras_params)) self.model.add(SimpleRNN(units=self.features, return_sequences=True, **self.keras_params))
def get_model(self):
return self.model
def apply(self, *inputs): def apply(self, *inputs):
stuff = np.transpose(np.array([[[inputs[i]] for i in range(len(inputs))]])) stuff = np.transpose(np.array([[[inputs[i]] for i in range(len(inputs))]]))
return self.model.predict(stuff)[0].flatten() return self.model.predict(stuff)[0].flatten()
@ -545,22 +563,15 @@ class LearningNeuralNetwork(NeuralNetwork):
bar.update() bar.update()
class TrainingNeuralNetworkDecorator(NeuralNetwork): class TrainingNeuralNetworkDecorator():
def __init__(self, net, **kwargs): def __init__(self, net, **kwargs):
super().__init__(**kwargs)
self.net = net self.net = net
self.compile_params = dict(loss='mse', optimizer='sgd') self.compile_params = dict(loss='mse', optimizer='sgd')
self.model_compiled = False self.model_compiled = False
def get_params(self): def __getattr__(self, name):
return self.net.get_params() return getattr(self.net, name)
def get_keras_params(self):
return self.net.get_keras_params()
def get_compile_params(self):
return self.net.get_compile_params()
def with_params(self, **kwargs): def with_params(self, **kwargs):
self.net.with_params(**kwargs) self.net.with_params(**kwargs)
@ -570,16 +581,13 @@ class TrainingNeuralNetworkDecorator(NeuralNetwork):
self.net.with_keras_params(**kwargs) self.net.with_keras_params(**kwargs)
return self return self
def get_compile_params(self):
return self.compile_params
def with_compile_params(self, **kwargs): def with_compile_params(self, **kwargs):
self.compile_params.update(kwargs) self.compile_params.update(kwargs)
return self return self
def get_model(self):
return self.net.model
def apply_to_weights(self, old_weights):
return self.net.apply_to_weights(old_weights)
def compile_model(self, **kwargs): def compile_model(self, **kwargs):
compile_params = copy.deepcopy(self.compile_params) compile_params = copy.deepcopy(self.compile_params)
compile_params.update(kwargs) compile_params.update(kwargs)
@ -639,7 +647,7 @@ if __name__ == '__main__':
if True: if True:
# ok so this works quite realiably # ok so this works quite realiably
with FixpointExperiment() as exp: with FixpointExperiment() as exp:
run_count = 100 run_count = 1000
net = TrainingNeuralNetworkDecorator(WeightwiseNeuralNetwork(width=2, depth=2))\ net = TrainingNeuralNetworkDecorator(WeightwiseNeuralNetwork(width=2, depth=2))\
.with_params(epsilon=0.0001).with_keras_params(optimizer='sgd') .with_params(epsilon=0.0001).with_keras_params(optimizer='sgd')
for run_id in tqdm(range(run_count+1)): for run_id in tqdm(range(run_count+1)):

View File

@ -41,11 +41,8 @@ class Soup:
other_particle_id = int(prng() * len(self.particles)) other_particle_id = int(prng() * len(self.particles))
other_particle = self.particles[other_particle_id] other_particle = self.particles[other_particle_id]
particle.train_other(other_particle) particle.train_other(other_particle)
try:
for _ in range(self.params.get('train', 0)): for _ in range(self.params.get('train', 0)):
particle.compiled().train() particle.compiled().train()
except AttributeError:
pass
if self.params.get('remove_divergent') and particle.is_diverged(): if self.params.get('remove_divergent') and particle.is_diverged():
self.particles[particle_id] = self.generator() self.particles[particle_id] = self.generator()
if self.params.get('remove_zero') and particle.is_zero(): if self.params.get('remove_zero') and particle.is_zero():
@ -67,6 +64,11 @@ class Soup:
counters['other'] += 1 counters['other'] += 1
return counters return counters
def print_all(self):
for particle in self.particles:
particle.print_weights()
print(particle.is_fixpoint())
class LearningSoup(Soup): class LearningSoup(Soup):
@ -89,16 +91,18 @@ if __name__ == '__main__':
exp.log(soup.count()) exp.log(soup.count())
if True: if True:
with SoupExperiment() as exp: with SoupExperiment("soup") as exp:
for run_id in range(1): for run_id in range(1):
net_generator = lambda: TrainingNeuralNetworkDecorator(WeightwiseNeuralNetwork(2, 2)).with_keras_params( net_generator = lambda: TrainingNeuralNetworkDecorator(WeightwiseNeuralNetwork(2, 2)).with_keras_params(
activation='linear') activation='sigmoid').with_params(epsilon=0.0001)
# net_generator = lambda: AggregatingNeuralNetwork(4, 2, 2).with_keras_params(activation='sigmoid')\ # net_generator = lambda: AggregatingNeuralNetwork(4, 2, 2).with_keras_params(activation='sigmoid')\
# .with_params(shuffler=AggregatingNeuralNetwork.shuffle_random) # .with_params(shuffler=AggregatingNeuralNetwork.shuffle_random)
# net_generator = lambda: RecurrentNeuralNetwork(2, 2).with_keras_params(activation='linear').with_params() # net_generator = lambda: RecurrentNeuralNetwork(2, 2).with_keras_params(activation='linear').with_params()
soup = Soup(10, net_generator).with_params(remove_divergent=True, remove_zero=True).with_params(train=500) soup = Soup(10, net_generator).with_params(remove_divergent=True, remove_zero=True, train=200)
soup.seed() soup.seed()
for _ in tqdm(range(10)): for _ in tqdm(range(10)):
soup.evolve() soup.evolve()
soup.print_all()
exp.log(soup.count()) exp.log(soup.count())