diff --git a/code/experiment.py b/code/experiment.py index 0b3ef3b..b77410f 100644 --- a/code/experiment.py +++ b/code/experiment.py @@ -13,8 +13,8 @@ class Experiment: def __init__(self, name=None, ident=None): self.experiment_id = ident or time.time() - self.experiment_name = name or 'experiment' - self.base_dir = os.path.join('experiments', self.experiment_name) + self.experiment_name = name or 'unnamed_experiment' + self.base_dir = self.experiment_name self.next_iteration = 0 self.log_messages = [] @@ -82,5 +82,6 @@ class FixpointExperiment(Experiment): class SoupExperiment(Experiment): pass + class IdentLearningExperiment(Experiment): - pass \ No newline at end of file + pass diff --git a/code/network.py b/code/network.py index 8e6b707..982ba4b 100644 --- a/code/network.py +++ b/code/network.py @@ -394,6 +394,11 @@ if __name__ == '__main__': if True: with IdentLearningExperiment() as exp: net = LearningNeuralNetwork(width=2, depth=2, features=2, )\ - .with_keras_params(activation='linear') \ + .with_keras_params(activation='sigmoid', use_bias=False, ) \ .with_params(print_all_weight_updates=False) - net.learn(1000, reduction=LearningNeuralNetwork.mean_reduction) + net.learn(1, reduction=LearningNeuralNetwork.fft_reduction) + import time + time.sleep(1) + net.print_weights() + time.sleep(1) + print(net.is_fixpoint(1, epsilon=0.9e-6)) diff --git a/code/visualization.py b/code/visualization.py new file mode 100644 index 0000000..e689185 --- /dev/null +++ b/code/visualization.py @@ -0,0 +1,125 @@ +import os +import re +from collections import defaultdict +from tqdm import tqdm +from argparse import ArgumentParser +from distutils.util import strtobool + +import numpy as np +import tensorflow as tf + +import plotly as pl +from plotly import tools +import plotly.graph_objs as go + +import dill + + +def build_args(): + arg_parser = ArgumentParser() + arg_parser.add_argument('-i', '--in_file', nargs=1, type=str) + arg_parser.add_argument('-o', '--out_file', nargs='?', default='out', type=str) + return arg_parser.parse_args() + + +def numberFromStrings(string) -> list: + numberfromstring = [int(x) for x in re.findall('\d+', string)] + return numberfromstring + + +def visulize_as_tiled_subplot(plotting_tuple, filename='plot'): + def norm(val, a=0, b=0.25): + return (val - a) / (b - a) + + data = np.asarray(plotting_tuple) + + fig = tools.make_subplots(rows=1, cols=3, + subplot_titles=('Layers: 1', 'Layers: 2', 'Layers: 3'), + horizontal_spacing=0.05) + + for x in range(1, 4): + # Only select Plots with x Layers + scatter_slice = data[np.where(data[:, 2] == x)] + # Only Select Plots with x Cells + scatter_slice = scatter_slice[np.where(scatter_slice[:, 1] <= 10)] + # Normalize colors + colors = scatter_slice[:, 4] + # colors = np.apply_along_axis(norm, 0, scatter_slice[:, 4]) + scatter = go.Scatter(x=scatter_slice[:, 3], + y=scatter_slice[:, 1], + hoverinfo='text', + text=['Absolute Loss:
{}'.format(val) for val in colors], + mode='markers', + showlegend=False, + marker=dict(size=10, color=colors, colorscale='Jet', + # Only plot the colorscale once, use one for all + showscale=True if x == 1 else False, + cmax=0.25, cmin=0, + colorbar=dict(y=0.5, x=1, tickmode='array', ticks='outside', + tickvals=[0, 0.05, 0.10, 0.15, 0.20, 0.25], + ticktext=["0.00", "0.05", "0.10", "0.15", "0.20", "0.25"] + ) + ) + ) + fig.append_trace(scatter, 1, x,) + # TODO: Layout Loop + if x == 1: + fig['layout']['yaxis{}'.format(x)].update(tickwidth=1, title='Number of Cells') + if x == 2: + fig['layout']['xaxis{}'.format(x)].update(tickwidth=1, title='Position -X') + + fig['layout'].update(title='{} - Mean Absolute Loss'.format(os.path.split('DESTINATION_OR_EXPERIMENT_NAME')[-1].upper()), + height=300, width=800, margin=dict(l=50, r=0, t=60, b=50)) + # import plotly.io as pio + # pio.write_image(fig, filename) + pl.offline.plot(fig, filename=filename) + pass + + +def visulize_as_splatter3d(plotting_tuple, filename='plot'): + # timesteps, cells, layers, positions, val + _ , cells, layers, position, val = zip(*plotting_tuple) + text = ['Cells: {}
Layers: {}
Position: {}
Mean(Min()): {}'.format(cells, layers, position, val) + for _, cells, layers, position, val in plotting_tuple] + + data = [go.Scatter3d(x=cells, y=layers, z=position, text=text, hoverinfo='text', mode='markers', + marker=dict(color=val, colorscale='Jet', opacity=0.8, + colorbar=dict(y=0.5, x=0.9, title="Mean(Min(Seeds))")) + )] + layout = go.Layout(scene=dict(aspectratio=dict(x=2, y=2, z=1), + xaxis=dict(tickwidth=1, title='Number of Cells'), + yaxis=dict(tickwidth=1, title='Number of Layers'), + zaxis=dict(tickwidth=1, title='Position -pX')), + margin=dict(l=0, r=0, b=0, t=0)) + fig = go.Figure(data=data, layout=layout) + pl.offline.plot(fig, auto_open=True, filename=filename) # filename='3d-scatter_plot' + + +def compile_run_name(path: str) -> dict: + """ + Retrieve all names, extract index positions and group by seeds. + + :param path: Path to the current TB folder of a sinle NN configuration + :return: List of foldernames to filter for. + """ + config_keys = ['run_seed', 'timesteps', 'index_position', 'cell_count', 'layers', 'cell_type'] + found_configurations = defaultdict(list) + for dname in os.listdir(path): + if os.path.isdir(os.path.join(path, dname)): + this_config = {key: value for key, value in zip(config_keys, dname.split("_"))} + found_configurations[this_config['index_position']].append(dname) + + return found_configurations + + + +if __name__ == '__main__': + raise NotImplementedError() + args = build_args() + in_file = args.in_file[0] + out_file = args.out_file + + with open(in_file, 'rb') as dill_file: + experiment = dill.load(dill_file) + + print('hi')