journal_robustness.py redone, now is sensitive to seeds and plots
This commit is contained in:
@ -173,6 +173,7 @@ class SpawnExperiment:
|
|||||||
# and add to nets for plotting if they are fixpoints themselves;
|
# and add to nets for plotting if they are fixpoints themselves;
|
||||||
for _ in range(self.epochs - 1):
|
for _ in range(self.epochs - 1):
|
||||||
for _ in range(self.ST_steps):
|
for _ in range(self.ST_steps):
|
||||||
|
# soup Evolve
|
||||||
clone.self_train(1, self.log_step_size, self.net_learning_rate)
|
clone.self_train(1, self.log_step_size, self.net_learning_rate)
|
||||||
if is_identity_function(clone):
|
if is_identity_function(clone):
|
||||||
input_data = clone.input_weight_matrix()
|
input_data = clone.input_weight_matrix()
|
||||||
@ -212,19 +213,19 @@ if __name__ == "__main__":
|
|||||||
# Define number of runs & name:
|
# Define number of runs & name:
|
||||||
ST_runs = 1
|
ST_runs = 1
|
||||||
ST_runs_name = "test-27"
|
ST_runs_name = "test-27"
|
||||||
ST_steps = 2500
|
ST_steps = 2000
|
||||||
ST_epochs = 2
|
ST_epochs = 2
|
||||||
ST_log_step_size = 10
|
ST_log_step_size = 10
|
||||||
|
|
||||||
# Define number of networks & their architecture
|
# Define number of networks & their architecture
|
||||||
nr_clones = 10
|
nr_clones = 50
|
||||||
ST_population_size = 3
|
ST_population_size = 1
|
||||||
ST_net_hidden_size = 2
|
ST_net_hidden_size = 2
|
||||||
ST_net_learning_rate = 0.04
|
ST_net_learning_rate = 0.04
|
||||||
ST_name_hash = random.getrandbits(32)
|
ST_name_hash = random.getrandbits(32)
|
||||||
|
|
||||||
print(f"Running the Spawn experiment:")
|
print(f"Running the Spawn experiment:")
|
||||||
for noise_factor in [1]:
|
for noise_factor in [9]:
|
||||||
SpawnExperiment(
|
SpawnExperiment(
|
||||||
population_size=ST_population_size,
|
population_size=ST_population_size,
|
||||||
log_step_size=ST_log_step_size,
|
log_step_size=ST_log_step_size,
|
||||||
|
@ -95,7 +95,6 @@ class RobustnessComparisonExperiment:
|
|||||||
for _ in range(self.epochs):
|
for _ in range(self.epochs):
|
||||||
net.self_train(self.ST_steps, self.log_step_size, self.net_learning_rate)
|
net.self_train(self.ST_steps, self.log_step_size, self.net_learning_rate)
|
||||||
nets.append(net)
|
nets.append(net)
|
||||||
|
|
||||||
return nets
|
return nets
|
||||||
|
|
||||||
def test_robustness(self, print_it=True, noise_levels=10, seeds=10):
|
def test_robustness(self, print_it=True, noise_levels=10, seeds=10):
|
||||||
@ -110,12 +109,12 @@ class RobustnessComparisonExperiment:
|
|||||||
# This checks wether to use synthetic setting with multiple seeds
|
# This checks wether to use synthetic setting with multiple seeds
|
||||||
# or multi network settings with a singlee seed
|
# or multi network settings with a singlee seed
|
||||||
|
|
||||||
df = pd.DataFrame(columns=['seed', 'noise_level', 'application_step', 'absolute_loss'])
|
df = pd.DataFrame(columns=['setting', 'noise_level', 'application_step', 'absolute_loss', 'time_to_vergence'])
|
||||||
for i, fixpoint in enumerate(self.id_functions): #1 / n
|
for i, fixpoint in enumerate(self.id_functions): #1 / n
|
||||||
row_headers.append(fixpoint.name)
|
row_headers.append(fixpoint.name)
|
||||||
for seed in range(seeds): #n / 1
|
for seed in range(seeds): #n / 1
|
||||||
for noise_level in range(noise_levels):
|
for noise_level in range(noise_levels):
|
||||||
self_application_steps = 1
|
self_application_steps = 0
|
||||||
clone = Net(fixpoint.input_size, fixpoint.hidden_size, fixpoint.out_size,
|
clone = Net(fixpoint.input_size, fixpoint.hidden_size, fixpoint.out_size,
|
||||||
f"{fixpoint.name}_clone_noise10e-{noise_level}")
|
f"{fixpoint.name}_clone_noise10e-{noise_level}")
|
||||||
clone.load_state_dict(copy.deepcopy(fixpoint.state_dict()))
|
clone.load_state_dict(copy.deepcopy(fixpoint.state_dict()))
|
||||||
@ -123,9 +122,6 @@ class RobustnessComparisonExperiment:
|
|||||||
clone = self.apply_noise(clone, rand_noise)
|
clone = self.apply_noise(clone, rand_noise)
|
||||||
|
|
||||||
while not is_zero_fixpoint(clone) and not is_divergent(clone):
|
while not is_zero_fixpoint(clone) and not is_divergent(clone):
|
||||||
if is_identity_function(clone):
|
|
||||||
avg_time_as_fixpoint[i][noise_level] += 1
|
|
||||||
|
|
||||||
# -> before
|
# -> before
|
||||||
clone_weight_pre_application = clone.input_weight_matrix()
|
clone_weight_pre_application = clone.input_weight_matrix()
|
||||||
target_data_pre_application = clone.create_target_weights(clone_weight_pre_application)
|
target_data_pre_application = clone.create_target_weights(clone_weight_pre_application)
|
||||||
@ -140,16 +136,27 @@ class RobustnessComparisonExperiment:
|
|||||||
|
|
||||||
setting = i if is_synthetic else seed
|
setting = i if is_synthetic else seed
|
||||||
|
|
||||||
df.loc[data_pos] = [setting, noise_level, self_application_steps, absolute_loss]
|
if is_identity_function(clone):
|
||||||
data_pos += 1
|
avg_time_as_fixpoint[i][noise_level] += 1
|
||||||
self_application_steps += 1
|
# When this raises a Type Error, we found a second order fixpoint!
|
||||||
|
self_application_steps += 1
|
||||||
|
else:
|
||||||
|
self_application_steps = pd.NA # Not a Number!
|
||||||
|
|
||||||
|
df.loc[df.shape[0]] = [setting, noise_level, self_application_steps,
|
||||||
|
absolute_loss, avg_time_to_vergence[i][noise_level]]
|
||||||
|
|
||||||
|
|
||||||
# calculate the average:
|
# calculate the average:
|
||||||
df = df.replace([np.inf, -np.inf], np.nan)
|
# df = df.replace([np.inf, -np.inf], np.nan)
|
||||||
df = df.dropna()
|
# df = df.dropna()
|
||||||
|
bf = sns.boxplot(data=df, y='self_application_steps', x='noise_level', )
|
||||||
|
bf.set_title('Robustness as self application steps per noise level')
|
||||||
|
plt.tight_layout()
|
||||||
|
|
||||||
# sns.set(rc={'figure.figsize': (10, 50)})
|
# sns.set(rc={'figure.figsize': (10, 50)})
|
||||||
bx = sns.catplot(data=df[df['absolute_loss'] < 1], y='absolute_loss', x='application_step', kind='box',
|
# bx = sns.catplot(data=df[df['absolute_loss'] < 1], y='absolute_loss', x='application_step', kind='box',
|
||||||
col='noise_level', col_wrap=3, showfliers=False)
|
# col='noise_level', col_wrap=3, showfliers=False)
|
||||||
directory = Path('output') / 'robustness'
|
directory = Path('output') / 'robustness'
|
||||||
filename = f"absolute_loss_perapplication_boxplot_grid.png"
|
filename = f"absolute_loss_perapplication_boxplot_grid.png"
|
||||||
filepath = directory / filename
|
filepath = directory / filename
|
||||||
@ -167,21 +174,18 @@ class RobustnessComparisonExperiment:
|
|||||||
|
|
||||||
return avg_time_as_fixpoint, avg_time_to_vergence
|
return avg_time_as_fixpoint, avg_time_to_vergence
|
||||||
|
|
||||||
|
|
||||||
def count_fixpoints(self):
|
def count_fixpoints(self):
|
||||||
exp_details = f"ST steps: {self.ST_steps}"
|
exp_details = f"ST steps: {self.ST_steps}"
|
||||||
self.id_functions = test_for_fixpoints(self.fixpoint_counters, self.nets)
|
self.id_functions = test_for_fixpoints(self.fixpoint_counters, self.nets)
|
||||||
bar_chart_fixpoints(self.fixpoint_counters, self.population_size, self.directory, self.net_learning_rate,
|
bar_chart_fixpoints(self.fixpoint_counters, self.population_size, self.directory, self.net_learning_rate,
|
||||||
exp_details)
|
exp_details)
|
||||||
|
|
||||||
|
|
||||||
def visualize_loss(self):
|
def visualize_loss(self):
|
||||||
for i in range(len(self.nets)):
|
for i in range(len(self.nets)):
|
||||||
net_loss_history = self.nets[i].loss_history
|
net_loss_history = self.nets[i].loss_history
|
||||||
self.loss_history.append(net_loss_history)
|
self.loss_history.append(net_loss_history)
|
||||||
plot_loss(self.loss_history, self.directory)
|
plot_loss(self.loss_history, self.directory)
|
||||||
|
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
pickle.dump(self, open(f"{self.directory}/experiment_pickle.p", "wb"))
|
pickle.dump(self, open(f"{self.directory}/experiment_pickle.p", "wb"))
|
||||||
print(f"\nSaved experiment to {self.directory}.")
|
print(f"\nSaved experiment to {self.directory}.")
|
||||||
@ -211,5 +215,5 @@ if __name__ == "__main__":
|
|||||||
epochs=ST_epochs,
|
epochs=ST_epochs,
|
||||||
st_steps=ST_steps,
|
st_steps=ST_steps,
|
||||||
synthetic=ST_synthetic,
|
synthetic=ST_synthetic,
|
||||||
directory=Path('output') / 'robustness' / f'{ST_name_hash}'
|
directory=Path('output') / 'journal_robustness' / f'{ST_name_hash}'
|
||||||
)
|
)
|
||||||
|
Reference in New Issue
Block a user