From 475746ad418fa77dbc750b1e0e5ec3bf5c569725 Mon Sep 17 00:00:00 2001 From: katharinakorb <62990236+katharinakorb@users.noreply.github.com> Date: Mon, 31 Jul 2023 11:48:17 +0200 Subject: [PATCH] Add files via upload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ordner beinhaltet den momentanen Stand des Codes, wie ich ihn auf den GPUs ausführe (d.h. ohne Softmax, etc) und angepasst auf die jeweilige Stimuluskondition. --- Classic_contour_net_shallow/LICENSE | 21 + Classic_contour_net_shallow/classic_loop.sh | 11 + Classic_contour_net_shallow/cnn_training.py | 405 ++++++++++++++++++ Classic_contour_net_shallow/config.json | 52 +++ .../alicorn_data_loader.cpython-310.pyc | Bin 0 -> 2378 bytes .../analyse_network.cpython-310.pyc | Bin 0 -> 2138 bytes .../__pycache__/create_logger.cpython-310.pyc | Bin 0 -> 1161 bytes .../__pycache__/make_cnn.cpython-310.pyc | Bin 0 -> 2340 bytes .../plot_intermediate.cpython-310.pyc | Bin 0 -> 2243 bytes .../__pycache__/set_seed.cpython-310.pyc | Bin 0 -> 510 bytes .../__pycache__/test.cpython-310.pyc | Bin 0 -> 1450 bytes .../__pycache__/train.cpython-310.pyc | Bin 0 -> 1984 bytes .../functions/alicorn_data_loader.py | 107 +++++ .../functions/analyse_network.py | 103 +++++ .../functions/create_logger.py | 40 ++ .../functions/fisher_exact.py | 39 ++ .../functions/make_cnn.py | 114 +++++ .../functions/plot_intermediate.py | 82 ++++ .../functions/set_seed.py | 11 + Classic_contour_net_shallow/functions/test.py | 58 +++ .../functions/train.py | 80 ++++ .../__pycache__/plot_as_grid.cpython-310.pyc | Bin 0 -> 3384 bytes .../inspect/optimal_stimulus.py | 164 +++++++ .../performance_plots/feature_perf_[].pdf | Bin 0 -> 129676 bytes ...ay([24, 8, 8]), array([32, 8, 8])].pdf | Bin 0 -> 99637 bytes .../inspect/plot_as_grid.py | 182 ++++++++ .../inspect/plot_perf_across_channels.py | 72 ++++ .../inspect/plot_weights.py | 49 +++ .../inspect_weights_conv_0.py | 47 ++ .../inspect_weights_conv_x.py | 62 +++ .../performance_pfinkel_plots.py | 223 ++++++++++ .../plot_performance_data.py | 81 ++++ 32 files changed, 2003 insertions(+) create mode 100644 Classic_contour_net_shallow/LICENSE create mode 100644 Classic_contour_net_shallow/classic_loop.sh create mode 100644 Classic_contour_net_shallow/cnn_training.py create mode 100644 Classic_contour_net_shallow/config.json create mode 100644 Classic_contour_net_shallow/functions/__pycache__/alicorn_data_loader.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/analyse_network.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/create_logger.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/make_cnn.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/plot_intermediate.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/set_seed.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/test.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/__pycache__/train.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/functions/alicorn_data_loader.py create mode 100644 Classic_contour_net_shallow/functions/analyse_network.py create mode 100644 Classic_contour_net_shallow/functions/create_logger.py create mode 100644 Classic_contour_net_shallow/functions/fisher_exact.py create mode 100644 Classic_contour_net_shallow/functions/make_cnn.py create mode 100644 Classic_contour_net_shallow/functions/plot_intermediate.py create mode 100644 Classic_contour_net_shallow/functions/set_seed.py create mode 100644 Classic_contour_net_shallow/functions/test.py create mode 100644 Classic_contour_net_shallow/functions/train.py create mode 100644 Classic_contour_net_shallow/inspect/__pycache__/plot_as_grid.cpython-310.pyc create mode 100644 Classic_contour_net_shallow/inspect/optimal_stimulus.py create mode 100644 Classic_contour_net_shallow/inspect/performance_plots/feature_perf_[].pdf create mode 100644 Classic_contour_net_shallow/inspect/performance_plots/feature_perf_[array([4, 8, 8]), array([6, 8, 8]), array([8, 8, 8]), array([12, 8, 8]), array([16, 8, 8]), array([24, 8, 8]), array([32, 8, 8])].pdf create mode 100644 Classic_contour_net_shallow/inspect/plot_as_grid.py create mode 100644 Classic_contour_net_shallow/inspect/plot_perf_across_channels.py create mode 100644 Classic_contour_net_shallow/inspect/plot_weights.py create mode 100644 Classic_contour_net_shallow/inspect_weights_conv_0.py create mode 100644 Classic_contour_net_shallow/inspect_weights_conv_x.py create mode 100644 Classic_contour_net_shallow/performance_pfinkel_plots.py create mode 100644 Classic_contour_net_shallow/plot_performance_data.py diff --git a/Classic_contour_net_shallow/LICENSE b/Classic_contour_net_shallow/LICENSE new file mode 100644 index 0000000..f6adf89 --- /dev/null +++ b/Classic_contour_net_shallow/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 David Rotermund + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Classic_contour_net_shallow/classic_loop.sh b/Classic_contour_net_shallow/classic_loop.sh new file mode 100644 index 0000000..b5aff3c --- /dev/null +++ b/Classic_contour_net_shallow/classic_loop.sh @@ -0,0 +1,11 @@ +Directory="/home/kk/Documents/Semester4/code/Classic_contour_net_shallow" +Priority="-500" +echo $Directory +mkdir $Directory/argh_log_classic +for out_channels_idx in {0..0}; do + for kernel_size_idx in {0..0}; do + for stride_idx in {0..0}; do + echo "hostname; cd $Directory ; /home/kk/P3.10/bin/python3 cnn_training.py --idx-conv-out-channels-list $out_channels_idx --idx-conv-kernel-sizes $kernel_size_idx --idx-conv-stride-sizes $stride_idx -s \$JOB_ID" | qsub -o $Directory/argh_log_classic -j y -p $Priority -q gp4u,gp3u -N ClassicTraining + done + done +done \ No newline at end of file diff --git a/Classic_contour_net_shallow/cnn_training.py b/Classic_contour_net_shallow/cnn_training.py new file mode 100644 index 0000000..953f7b9 --- /dev/null +++ b/Classic_contour_net_shallow/cnn_training.py @@ -0,0 +1,405 @@ +import torch +import numpy as np +import datetime +import argh +import time +import os +import json +from jsmin import jsmin + +from functions.alicorn_data_loader import alicorn_data_loader +from functions.train import train +from functions.test import test +from functions.make_cnn import make_cnn +from functions.set_seed import set_seed +from functions.plot_intermediate import plot_intermediate +from functions.create_logger import create_logger + + +# to disable logging output from Tensorflow +os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" +from torch.utils.tensorboard import SummaryWriter + + +def main( + idx_conv_out_channels_list: int = 0, + idx_conv_kernel_sizes: int = 0, + idx_conv_stride_sizes: int = 0, + seed_counter: int = 0, +) -> None: + config_filenname = "config.json" + with open(config_filenname, "r") as file_handle: + config = json.loads(jsmin(file_handle.read())) + + # get model information: + output_channels = config["conv_out_channels_list"][idx_conv_out_channels_list] + + logger = create_logger( + save_logging_messages=bool(config["save_logging_messages"]), + display_logging_messages=bool(config["display_logging_messages"]), + model_name=str(output_channels), + ) + + # network settings: + conv_out_channels_list: list[list[int]] = config["conv_out_channels_list"] + conv_kernel_sizes: list[list[int]] = config["conv_kernel_sizes"] + conv_stride_sizes: list[int] = config["conv_stride_sizes"] + + num_pfinkel: list = np.arange( + int(config["num_pfinkel_start"]), + int(config["num_pfinkel_stop"]), + int(config["num_pfinkel_step"]), + ).tolist() + + run_network( + out_channels=conv_out_channels_list[int(idx_conv_out_channels_list)], + kernel_size=conv_kernel_sizes[int(idx_conv_kernel_sizes)], + stride=conv_stride_sizes[int(idx_conv_stride_sizes)], + activation_function=str(config["activation_function"]), + train_first_layer=bool(config["train_first_layer"]), + seed_counter=seed_counter, + minimum_learning_rate=float(config["minimum_learning_rate"]), + conv_0_kernel_size=int(config["conv_0_kernel_size"]), + mp_1_kernel_size=int(config["mp_1_kernel_size"]), + mp_1_stride=int(config["mp_1_stride"]), + batch_size_train=int(config["batch_size_train"]), + batch_size_test=int(config["batch_size_test"]), + learning_rate=float(config["learning_rate"]), + max_epochs=int(config["max_epochs"]), + save_model=bool(config["save_model"]), + stimuli_per_pfinkel=int(config["stimuli_per_pfinkel"]), + num_pfinkel=num_pfinkel, + logger=logger, + save_ever_x_epochs=int(config["save_ever_x_epochs"]), + scheduler_patience=int(config["scheduler_patience"]), + condition=str(config["condition"]), + data_path=str(config["data_path"]), + pooling_type=str(config["pooling_type"]), + conv_0_enable_softmax=bool(config["conv_0_enable_softmax"]), + scale_data=int(config["scale_data"]), + use_scheduler=bool(config["use_scheduler"]), + use_adam=bool(config["use_adam"]), + use_plot_intermediate=bool(config["use_plot_intermediate"]), + leak_relu_negative_slope=float(config["leak_relu_negative_slope"]), + scheduler_verbose=bool(config["scheduler_verbose"]), + scheduler_factor=float(config["scheduler_factor"]), + precision_100_percent=int(config["precision_100_percent"]), + scheduler_threshold=float(config["scheduler_threshold"]), + ) + + +def run_network( + out_channels: list[int], + kernel_size: list[int], + num_pfinkel: list, + logger, + stride: int, + activation_function: str, + train_first_layer: bool, + seed_counter: int, + minimum_learning_rate: float, + conv_0_kernel_size: int, + mp_1_kernel_size: int, + mp_1_stride: int, + scheduler_patience: int, + batch_size_train: int, + batch_size_test: int, + learning_rate: float, + max_epochs: int, + save_model: bool, + stimuli_per_pfinkel: int, + save_ever_x_epochs: int, + condition: str, + data_path: str, + pooling_type: str, + conv_0_enable_softmax: bool, + scale_data: float, + use_scheduler: bool, + use_adam: bool, + use_plot_intermediate: bool, + leak_relu_negative_slope: float, + scheduler_verbose: bool, + scheduler_factor: float, + precision_100_percent: int, + scheduler_threshold: float, +) -> None: + # define device: + device_str: str = "cuda:0" if torch.cuda.is_available() else "cpu" + logger.info(f"Using {device_str} device") + device: torch.device = torch.device(device_str) + torch.set_default_dtype(torch.float32) + + # ------------------------------------------------------------------- + logger.info("-==- START -==-") + + train_accuracy: list[float] = [] + train_losses: list[float] = [] + train_loss: list[float] = [] + test_accuracy: list[float] = [] + test_losses: list[float] = [] + + # prepare data: + + logger.info(num_pfinkel) + logger.info(condition) + + logger.info("Loading training data") + data_train = alicorn_data_loader( + num_pfinkel=num_pfinkel, + load_stimuli_per_pfinkel=stimuli_per_pfinkel, + condition=condition, + logger=logger, + data_path=data_path, + ) + + logger.info("Loading test data") + data_test = alicorn_data_loader( + num_pfinkel=num_pfinkel, + load_stimuli_per_pfinkel=stimuli_per_pfinkel, + condition=condition, + logger=logger, + data_path=data_path, + ) + + logger.info("Loading done!") + + # data loader + loader_train = torch.utils.data.DataLoader( + data_train, shuffle=True, batch_size=batch_size_train + ) + loader_test = torch.utils.data.DataLoader( + data_test, shuffle=False, batch_size=batch_size_test + ) + + previous_test_acc: float = -1 + + # set seed for reproducibility + set_seed(seed=int(seed_counter), logger=logger) + + # number conv layer: + if train_first_layer: + num_conv_layers = len(out_channels) + else: + num_conv_layers = len(out_channels) if len(out_channels) >= 2 else 1 + + # determine num conv layers + model_name = ( + f"ArghCNN_numConvLayers{num_conv_layers}" + f"_outChannels{out_channels}_kernelSize{kernel_size}_" + f"{activation_function}_stride{stride}_" + f"trainFirstConvLayer{train_first_layer}_" + f"seed{seed_counter}_{condition}" + ) + current = datetime.datetime.now().strftime("%d%m-%H%M") + + # new tb session + os.makedirs("tb_runs", exist_ok=True) + path: str = os.path.join("tb_runs", f"{model_name}") + tb = SummaryWriter(path) + + # -------------------------------------------------------------------------- + + # print network configuration: + logger.info("----------------------------------------------------") + logger.info(f"Number conv layers: {num_conv_layers}") + logger.info(f"Output channels: {out_channels}") + logger.info(f"Kernel sizes: {kernel_size}") + logger.info(f"Stride: {stride}") + logger.info(f"Activation function: {activation_function}") + logger.info(f"Training conv 0: {train_first_layer}") + logger.info(f"Seed: {seed_counter}") + logger.info(f"LR-scheduler patience: {scheduler_patience}") + logger.info(f"Pooling layer kernel: {mp_1_kernel_size}, stride: {mp_1_stride}") + + # define model: + model = make_cnn( + conv_out_channels_list=out_channels, + conv_kernel_size=kernel_size, + conv_stride_size=stride, + conv_activation_function=activation_function, + train_conv_0=train_first_layer, + conv_0_kernel_size=conv_0_kernel_size, + mp_1_kernel_size=mp_1_kernel_size, + mp_1_stride=mp_1_stride, + logger=logger, + pooling_type=pooling_type, + conv_0_enable_softmax=conv_0_enable_softmax, + l_relu_negative_slope=leak_relu_negative_slope, + ).to(device) + + logger.info(model) + + old_params: dict = {} + for name, param in model.named_parameters(): + old_params[name] = param.data.detach().cpu().clone() + + # pararmeters for training: + param_list: list = [] + + for i in range(0, len(model)): + if (not train_first_layer) and (i == 0): + pass + else: + for name, param in model[i].named_parameters(): + logger.info(f"Learning parameter: layer: {i} name: {name}") + param_list.append(param) + + for name, param in model.named_parameters(): + assert ( + torch.isfinite(param.data).sum().cpu() + == torch.tensor(param.data.size()).prod() + ), name + + # optimizer and learning rate scheduler + if use_adam: + optimizer = torch.optim.Adam(param_list, lr=learning_rate) + else: + optimizer = torch.optim.SGD(param_list, lr=learning_rate) # type: ignore + + if use_scheduler: + scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, + patience=scheduler_patience, + eps=minimum_learning_rate / 10, + verbose=scheduler_verbose, + factor=scheduler_factor, + threshold=scheduler_threshold, + ) + + # training loop: + logger.info("-==- Data and network loader: Done -==-") + t_dis0 = time.perf_counter() + for epoch in range(1, max_epochs + 1): + # train + logger.info("-==- Training... -==-") + running_loss = train( + model=model, + loader=loader_train, + optimizer=optimizer, + epoch=epoch, + device=device, + tb=tb, + test_acc=previous_test_acc, + logger=logger, + train_accuracy=train_accuracy, + train_losses=train_losses, + train_loss=train_loss, + scale_data=scale_data, + ) + + # logging: + logger.info("") + + logger.info("Check for changes in the weights:") + for name, param in model.named_parameters(): + if isinstance(old_params[name], torch.Tensor) and isinstance( + param.data, torch.Tensor + ): + temp_torch = param.data.detach().cpu().clone() + if old_params[name].ndim == temp_torch.ndim: + if old_params[name].size() == temp_torch.size(): + abs_diff = torch.abs(old_params[name] - temp_torch).max() + logger.info(f"Parameter {name}: {abs_diff:.3e}") + + old_params[name] = temp_torch + + logger.info("") + + logger.info("-==- Testing... -==-") + previous_test_acc = test( # type: ignore + model=model, + loader=loader_test, + device=device, + tb=tb, + epoch=epoch, + logger=logger, + test_accuracy=test_accuracy, + test_losses=test_losses, + scale_data=scale_data, + ) + + logger.info(f"Time required: {time.perf_counter()-t_dis0:.2e} sec") + + # save model after every 100th epoch: + if save_model and (epoch % save_ever_x_epochs == 0): + pt_filename: str = f"{model_name}_{epoch}Epoch_{current}.pt" + logger.info("") + logger.info(f"Saved model: {pt_filename}") + os.makedirs("trained_models", exist_ok=True) + torch.save( + model, + os.path.join( + "trained_models", + pt_filename, + ), + ) + + # check nan + for name, param in model.named_parameters(): + assert ( + torch.isfinite(param.data).sum().cpu() + == torch.tensor(param.data.size()).prod() + ), name + + # update scheduler + if use_scheduler: + if scheduler_verbose and isinstance(scheduler.best, float): + logger.info( + "Step LR scheduler: " + f"Loss: {running_loss:.2e} " + f"Best: {scheduler.best:.2e} " + f"Delta: {running_loss-scheduler.best:.2e} " + f"Threshold: {scheduler.threshold:.2e} " + f"Number of bad epochs: {scheduler.num_bad_epochs} " + f"Patience: {scheduler.patience} " + ) + scheduler.step(running_loss) + + # stop learning: lr too small + if optimizer.param_groups[0]["lr"] <= minimum_learning_rate: + logger.info("Learning rate is too small. Stop training.") + break + + # stop learning: done + if round(previous_test_acc, precision_100_percent) == 100.0: + logger.info("100% test performance reached. Stop training.") + break + + if use_plot_intermediate: + plot_intermediate( + train_accuracy=train_accuracy, + test_accuracy=test_accuracy, + train_losses=train_losses, + test_losses=test_losses, + save_name=model_name, + ) + + os.makedirs("performance_data", exist_ok=True) + np.savez( + os.path.join("performance_data", f"performances_{model_name}.npz"), + output_channels=np.array(out_channels), + train_accuracy=np.array(train_accuracy), + test_accuracy=np.array(test_accuracy), + train_losses=np.array(train_losses), + test_losses=np.array(test_losses), + ) + + # end TB session: + tb.close() + + # print model name: + logger.info("") + logger.info(f"Saved model: {model_name}_{epoch}Epoch_{current}") + if save_model: + os.makedirs("trained_models", exist_ok=True) + torch.save( + model, + os.path.join( + "trained_models", + f"{model_name}_{epoch}Epoch_{current}.pt", + ), + ) + + +if __name__ == "__main__": + argh.dispatch_command(main) diff --git a/Classic_contour_net_shallow/config.json b/Classic_contour_net_shallow/config.json new file mode 100644 index 0000000..3a699fc --- /dev/null +++ b/Classic_contour_net_shallow/config.json @@ -0,0 +1,52 @@ +{ + "data_path": "/home/kk/Documents/Semester4/code/RenderStimuli/Output/", + "save_logging_messages": true, // (true), false + "display_logging_messages": true, // (true), false + "batch_size_train": 500, + "batch_size_test": 250, + "max_epochs": 2000, + "save_model": true, + "conv_0_kernel_size": 11, + "mp_1_kernel_size": 3, + "mp_1_stride": 2, + "use_plot_intermediate": true, // true, (false) + "stimuli_per_pfinkel": 10000, + "num_pfinkel_start": 0, + "num_pfinkel_stop": 100, + "num_pfinkel_step": 10, + "precision_100_percent": 4, // (4) + "train_first_layer": true, // true, (false) + "save_ever_x_epochs": 10, // (10) + "activation_function": "leaky relu", // tanh, relu, (leaky relu), none + "leak_relu_negative_slope": 0.1, // (0.1) + // LR Scheduler -> + "use_scheduler": true, // (true), false + "scheduler_verbose": true, + "scheduler_factor": 0.1, //(0.1) + "scheduler_patience": 10, // (10) + "scheduler_threshold": 1e-5, // (1e-4) + "minimum_learning_rate": 1e-8, + "learning_rate": 0.0001, + // <- LR Scheduler + "pooling_type": "max", // (max), average, none + "conv_0_enable_softmax": false, // true, (false) + "use_adam": true, // (true) => adam, false => SGD + "condition": "Coignless", + "scale_data": 255.0, // (255.0), + "conv_out_channels_list": [ + [ + 3, + 8, + 8 + ] + ], + "conv_kernel_sizes": [ + [ + 7, + 15 + ] + ], + "conv_stride_sizes": [ + 1 + ] +} \ No newline at end of file diff --git a/Classic_contour_net_shallow/functions/__pycache__/alicorn_data_loader.cpython-310.pyc b/Classic_contour_net_shallow/functions/__pycache__/alicorn_data_loader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23adb2efe4c89d1492fe607c94b4e02a927d3967 GIT binary patch literal 2378 zcmbVN&2Jk;6rY*>@Ou5Vv7MwTMeKo(T54m5RurOu3QZ5~Awq4%VI^3tJ!5B`^{%r! zTS&B)5CLvT+@nhNkt0VgaOH0papRP8Z-r9ctlcJshy!cQ^ZS}Nzj^cCOjN0u2)-@r zXL?ja=yxfc{mLNRgpoV|LJ`FQa_0ZoA-SwL3PV$MhKiULDPbDZ*TC;1L=~n}l@+K4 zLuY7c42wgvZ_)xazSfSgQ=<4jYMCbx8SRKtn2y|W-w*d#AT9)vN8N<`qcrf{F^gYV zioGbLKKG+g6sgBOckJ<9p~sA;aoE#jti`tq{|1a(Fp}R0z{e9UBb4lsxJZ?W7Fr;w zAX!ucsR)t|(kd;0L~?J9;uI&Z-9=wvj)r(jG9@F&XhtSFH711&Vx}m*!Ih~Bn>T4` zrcAXNniwI;fO0)Ec;Sd7H}eS6t4u4jyznY!I4f`?D<0vCXb;DqWO!oI@}v}&&sr{` zNeSc<{F|975ycNPbz00y$B0%Rkr~D)mramsa~YxySjXMWqcT=9n=|{00 zcwH9Q9k9>^zhNf~CU`tJurIUq!TJ^ZoaOBI?Tt>SvzZ5y+;b-|%wuj`$vyt1@3itc zJ5J%laF7OG>{K8Tl5z8VImKI%KL{aliDP!Xge}yC9S<%YFL27eC=TI{%Dw&Rw;086 z7U+aZBJbCeTr2^1XxLqk_jXxwxcmZ0o{jmyXYhLEP?P(+y=#I_|yOJKMMK-QHdg$A^wN z@VZgl_gO&Koq|iDQrvFqf*?^M)cj&qhmju&5{`xL$?^akJdzb9Oh56%gnMC+2{qR! z0Skrdhy6%sJc@g}LSv&bKM-2#hy2|b-WMb^VBfhev>dt6<}p=Sfe<<0lu*D0=5Rj% z6mqws@*uZt1D`N1ifNear;Hu4)@m&C6)TdclE@c8=s`3Xuvi#p>1rjfHS-{Q<=ru*D~zwRfWtYwzu~x1(Mck={*e%7t2C=}_R8-u=`ZHCj0yWe+u47fP za2eYQc~(_StV#_;TzT5mOiUhI*7>$FRv)j_;%fk+g?C!z_!4kJgYz06#LK|Pb*U(X zkvoVz8m~#!>r$maPUAPE_@*RpNg~7K={!T;2AwdrMiET|_JM5N#0Fv@*bLScqN{%Z Uz-NSzzlcJf5|#XE=+=|J0aqcQwg3PC literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/functions/__pycache__/analyse_network.cpython-310.pyc b/Classic_contour_net_shallow/functions/__pycache__/analyse_network.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d95c0ad7fee259e9d1be59f1c774a981c568c25 GIT binary patch literal 2138 zcmbVN&2QaA5Z^ER`T4zMXZ}+8sacpOI z-87ZorGXofkoX6ZBWJGMIPf>HS0tp~IiMaIX4X#9Ry|>BXJ>cjH#0ll85e^=OyD^? z|3m)WC*&_&JpFWG@d*s`Ef7g0&Bz*&OpzI#HI!c^ekHCF$yFc)tiow10~vlV);hA| zrIC!htgB*tr+k@!PFKdD)06Zz8TB542Xey&S+c9N6DED2T&R_;bUtAyYo89xIIh7k zw zNbCofUAM~3cBK^DlFl(BFiaPK^$%A^9gVj}b0p~ed565H>@P&Gfavks_-?VK#+#et z>&2wnQn@wb+iFW0tMux4Qb;wvmLhLryyD+5jwt&_EP6{W*n(&>*Gu!V@)4Bk znetcwFPKnY9$!ETHpra8;4lP?04^Pc>l0ci6w7L|NB7uu^4(|i4i-h-SteG@f?4Qk z$J1!ap}4-X-9}!+1>I-!sOAT89UW3iYH<+Tp6xesu!z@>A5tln32*^$P?V?%-lN$9 z?qdwwFQE-C9#=yh4$mEk$k z_}nh>tc_0V8&CZH9Q@6DRvawC7}h5k=yT);u;1A9d_09_g5wZMYu>MW5F63I)_t%C zk{^Bcyz{iD~S=67Gl;@}MEc$-ZOQwEj>FO2NMJpNx%_3J?!JH&g1Z2#$V zF~FQPIe@IOHft|K)&lry@U>6R-<+>G(;l3ZlAq{y4>BX_V9KE}behI6VyDIB=tYhF z_%VH32QZJ8G~PiMGzH5um23F55WR?Gh@$XXk>9&4UH8l6{>`Gukp1-DM#DDOJWR?` z<wP~MGk!-h4ROKkXWm77d%k9Frx+iI=XoS5ravwbtlc0T+dQt z-QuJuG<2xMs&>QwYSyu7G#hc5-iO9k86|z+Sc@8sRO)3kNK?nl!mM>uc^``(;^4qK zVbxaYJ4r)cL*>Qidch^wG`D~VE-1bcTVjl^P;oTmF|5xw9P85|TcArYpQYy*XtH-f z5`oTH3Vj1QhoHE##QUK24s;W}3T8+B(+unLu%X{Vasi3|AmP_4H-&EU8{bxtzTBos zrU#(n1m?&adg>t99JN19bOriOm8p;Mmtfum5)sBFNi~h5Nb;)QdnMvZrOEoj;5}X^? z{sL4fIr2BS@fYUGiNDYbym8VJma*pfZT{Xj%X40@I|xSh?JHp>Lf@6KJSt$kgvpD#fd*)bXK11q`cxx$h9`#5 zrv}kLGYfNS3VmSBFh&JpL7}k?Q5o3NDgnxc@fi`b&_G((=1iMdS?#Z=b*(EusZ1)w zp4fop6n0S|)hlgMh1?q8IHY!^VFXp(0xC_M!YQlP%c{<_QB+IKoZc&(Qp4;casPu@ z1B?||i(9x$2reMh?hxF$2Af+y8n1fCp_hgp3BCQ$I}E*c&^Ww2h=oY#0qizqfdRYD zrIMk<;n>&|7h=5Toix2Cr0E?uz5OlkaLa3tA9@=R?}#|1E#CAt7Kha0Eluj(RLBa6 z1O???3rm|`#9V~=aBSax-&&Qn%1{7O&+>C=bHTc$Sy`OCtoEpw^MWX-^o%Cb+fU*3Y8_#>WE4~(yigk| zW8nv;fm_=BIl*8BfPuhLys_{sGQJ?T4kT_q`29Sk{&48;=ABVWGr|2fg(CpWr+x=| z!QV+D&f`wl$up6USeQ}Z-H(zaKli(%3=S^OxZi<#V%}+#ZJu7r`X3$(ik1EBV0bha z8=8SFyoRlx4-BO@;Bm04qGe2ZY{;A2tO?(@ET+1UslNwX1tE=-JWr$!ODhw~B`t}^ YD#v~f9X(3u3k()lEo>tj+jw371qA&`>i_@% literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/functions/__pycache__/make_cnn.cpython-310.pyc b/Classic_contour_net_shallow/functions/__pycache__/make_cnn.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a8565d9724a839fac94fd1b0618da126132bb10 GIT binary patch literal 2340 zcmZuy&u<$=6rP!#UEAxmjWXcK@Th6A)Y?eQjIgd3bLBW7eh<&>G+WEQtr0memW zC1^HqW#AlMU=@z~#eQjPiB;L$r*zY1cmuU+M_?bVt41dj+ip0H-A>OFf(MZs_))BC zDL>#6C^z!=c*aDr^ckNrOR2`|#QwGy`=M~R#sVgxP);m8U%2V|idvZV?kQ`-k$dqJ zQ%;$wedUb8Fz`j!jdw>}EoKI|@a_a~c(@f0y?bgga3v4MuHaobe;XEp5Y(3B@mPwE zqi>k~=AqYtUxgMW20}4P(0$DCz>JFTp-=F14u~~-77a*LPkG!Y2gV_qIEiyWW0>_# zh7&5!Cy0?{Brr1)OEZk_n}-;q#FlU6T3BJ`KGr<5CY8iEC>)}=$O`wd9u0_mf2KVs z9imiMoK(c+Tv^JM-I=m)CuL@5R<-)2TwTu9$xMAvK4I6%l}@hwjDd}$5`C`kn|fKw zysYG!uV>c!PEtsUth!HfU(Y2o{amj9KG#>C(L1^R*oPl7AAU?@US(N6?vv~2qsgS2 z00Xgll+frAGbVGwN|5H3&@!6LONE`%D&I$@O^_K!0tfKb42$Cn1jkXm3uV@Bl}*bR6#fG~3&sgXgF=&3Mk$*gV{A zA?eWfV&WbA_BBch$dvaS`@4)?pgc&|R~BUgINA4eBgE{M_Y z5fpQ@_rm2+`dq~BrBTm|xSJ`pVDH6Sd=z*c-pt6RFPf|C>&=zsjvx1$Ekl_st#%d3 z?~Z-RBex4DD2wrJzr$P0$_ThnW*o{+PZ1%My#Ycv&G!Ojd7}{*pk9S~eu=5VMph)v zF)T=BK-d($#n(Pir8OO-bVzUOh?H)6_uhwk3)@QXZg;bxDLv8Us&FIl;usFL*Sx*m zHD7Q~s1GMI)4yT0bizL-x zYOny56@=X`m$IOlqK1+NU9x3agD&QqMn{Ovg^0(o{xpmQgX7~cWD5II$A7c2W4PV6a^>ls*o(W}cK`3K+9vJzm2E9EE z=LvX6>x);0AsYw$s(!7bHvx*Mh=~rvQ;U#)i9!A$lsq9Oc}xoAFH$6bk`noY*yMLo OCchDf{AyLIzx)S2F@h%m literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/functions/__pycache__/plot_intermediate.cpython-310.pyc b/Classic_contour_net_shallow/functions/__pycache__/plot_intermediate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d99565f6df9cede31634dab6172385d5b00d1b7 GIT binary patch literal 2243 zcmcf?O>Y}TbY}L`_S#9>G-=Z|vJjPGTGr6ZwbcZ z_Nda%Gudp1X`Bpa801t<@-WVVFp35|jE1TznULpKZ_Z9~A(&905}1oiNrYdsAPZBb zRym`CNXB^lH^ZY?Lk&dvuO2` zTn2FlpQVh(p=8beP?dL+SjZ?(`}elAuiEhqG`e+BcsI$TFcJ5f=U;FwJ=42j<^X^& zoOaw1kg=KOjGTSFknYxjVI|=qOGfrS_<1ItWys&TGvGV`;*1ynq8V}bM=bT z>U`_dejas4)ia6u&cUt5Y!$@zN7vt|>x*K|`KHD*ok)MJ&v-lMX_!SU(D4cI%Voz9 ze~|ZlZ<#$Zn|<1j??6p`OU9k9Y!Kg|{n)P@9_Gi8#;D6gV@nwc%M{^EN1jngIoE4Z zk*u%mkcU}^DWjiAWkX^HocWFz9BSLjET9!~9uAcOU8KN{Oqg#U7pd~?VS$yMunx;8 z&}AI;U~xm0BdA^m2ZZKCvjbh|dxfV#5)PrU70HEi)367{<^l}EiU%jaa45UV6y5x3 z!{Y{c%S{b*yK=qbxvnL50VoG#pCy;=kCh8O+1K?d zI(H8A|EXHL&`vr_;t;^PyN=hfX?Or#vP$3>HM~u>ajkegY~pv|HD7wRhs(HTY~#1_ zTv7vR8xxQtFNsO8ed@XV126-VrdzVHqO5F?_J@2MZfXs}(yk@(Aq+!N5qpk#UGpKn zGrls?e!?3-S$P74)Q-FX z&*GJdS75?UsnnD1yIqNjrQ{KG?^akx+w6Qqy9^#ndyYZ9V0tksKTml>To4S(#1xqa^j9^ zA}rxW!w;915|>rFAkU=YX)FQc{-pIMKQ)i&6?BtttdFg`N=3;U182qRbrYSbW_MjcA=}j%EC<+jKKfm~c{pcX{ry(AG zn?O8;RSp3##BhdAS35q%94*KaF~ZT<8q={oc9;dYJNCx@IA9d;2D5p{9FE5kb9s}u zb`bN{yU$xJ;H_bYHCXs7y}_q#hEGs0dJVqNv9>1#%E%!;z)r4Gs@&iH`EGS-gZvJ!dX8{_NGMAv|I0IPhCAwoR& z8JP#LHxyc+CBjJIL-fmc^H7D1?4Si!WQpeyP}U9_6A6(sdW+Zmrt%oMprWS$`xMQa z3aRD|p0_{_@-uc-OGV6P&aE|XtA_McGzO15=mtMQ;L}&_MX*GG`>F-mvzU8}=Nl?e z8;ejyOT37dXe|+3hRR+vnFm^pPZ0B8Q5LA+6=Dt502s1J1zV^-Yrv*)zHxiIz z^xA+P);5#ZQ?9MDngHbs&ZigY0+@F!%FV>EJdI}tI;r^@Tw)N(9&+@LY;wdadnR zPTS>q3=z^)@`-k0F`C3LHQ|>cf(!sV9~Qu#PI=CB5HmI~?===iy(-Upn}UFxuneF^ zgUB;s8wy$#3D*G60Q06#eQ6rOWJtToDi9q_V=1}F2T4)oQq#H<>?}TmzOvH^q*Oaa zC8rgf)tbQ+%8=GkX$zX_cO)BoMr!nPrxG=U-c7c)c!#h zmt~rOt6Ub9801_IApR^XUi9B(s_dIf?m>pAK};;=w*Y8JF~uJ7NE2^k&-`S|>fjLm zZA=Lv9;R;zq4#Emmh*<*2VMx$0q$5I;wETNBKlyew;?`&O}l13r1?m@c`+D?n2C>S zHVl<2gW2Gld&X%FBP2NCmlcGRLLu!+rdcUIH?o0A*LwN{hkzf|lW0{7D}{tQN2?)3 zv$T}rV^FH^Q0MFc*fZ9=uUD?WG0(r;1>hkMI~IW$$lHLBduow4#3uhyhuk?X`PcEt MKg1`0lc4?A|Br}|PXGV_ literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/functions/__pycache__/train.cpython-310.pyc b/Classic_contour_net_shallow/functions/__pycache__/train.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..310515e425c33b7e17d9dd9f388b594a233e26c7 GIT binary patch literal 1984 zcmY*a-HY2s5Z_&`WLuWxkMsGy61Y+VJsQrC1`25@Nt4o-5JE36brXzEyXTWnAHLNp z*E2E{uCIZ<9|ild^dIPdQrOo%<*5(-&Sz(3H@Qme%+6>uv-8{8+0=Dy1kb~hpV-ee zgnrS&#it9xO&Hl@APg}aq5gv7K4yfY5g8dHIx?97b8A!?RYx^OVQ!D=C3QYU%;YY! zK=N3H<57cEd6Ty`5UVY@z2tS?Vh(Q|beYS%Z)v~H@E+P}JcZcko-*T<@km)w>N74> zEgj1+4ks`*`8W*@mBskuFyPu^I0UsPg&!sZKL~Q+2dBze$WfYQJX7{tN!eN8M|{A1 z=_^ZcnTsTFbkyau1-t{}HjL~N0Vwd)VPxt8_kcGFG(&TQQGxHEM?X%RMU&wTG{Xg* z<7o>dV*{X)02QN8@KWC{>I@%I@qPib%V^pz$jmIgprU<-rz>DzLRzd8EoL(7i81XI zoms84Av3$=j;t50k)z|C;SbT&DH_uKpQcf`py`xf-NK%E3u%sFy(_RC2CF>5)78Q& zR%gwkHOI5o9L?Hu1l~MZmn#K6gZE;b4w`n0%B;hxg>eoW3EvuL7-n|S1zKmYiViBe zTZp;ml<9~rcyJ5n41=x#x+d6oVB;)pT7^~G0t%y5oef)o(K)BzH}y)7y|?z$wW2!n zinTHWw`gpk>3UHE&3dUZXI-`mI6(%5F*hJft?5c*wx<8Npj#_--Wwg7trk+p_XLJQ8Nw)^r&`*< z%4G6%%$1SlF-SGRSsutRO+YYM7*E^>x?Z>9E zU)gzdb^9)qF<2S9*ZHJ!b^BHjfK=apz%#iNDp$bjiyPaDL_+_`C-x$O{&mt?%Xqk{HQvt`XasVe& zesE3I;7q22q41d^Nuun7JSp?^BjpAHVh?yCMLIrJ)qOuWI`IWlG?RR+j4+YP%np5k z$t>L|%O8(BYKNbzZQ_)cJSQ!ydV457H${G8@k0EZFkKuUxj1Ba$_Jy(} zPqI{~X5z=34N5yMxybsiwmJ+mnZj~oMavFg22q-n3&^v>ohmDO2T3^)!Iw=ymv5Gp7ek;l2K?xd!mJl~lj>wZFOojv9jQW*e0d?P9ejfyB z4iN3a-^z^qeIE7AF!qPg+tOT)bJ&dXM|%uK6qexj*JLXFXaKQb^9Jd`n^*=cu5Xtu zvJ9uFhC!Jn3_l=o1EM^;-#biW-a9(#-ARKyh7HPkdpw5RxVYX6p!4=_M}C%t0jw>N zX)Xo{mjl?UC`wOy|7~&BEA!kPp9+0-XsEIX2=yq|ZUe!^E=`laJ?u9>+a&_p%IjncvtH+3?;-D$VYlD)sGj8`9ybz>>7|N ss$yc;n7p6`g)c^nh literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/functions/alicorn_data_loader.py b/Classic_contour_net_shallow/functions/alicorn_data_loader.py new file mode 100644 index 0000000..e8b0ee4 --- /dev/null +++ b/Classic_contour_net_shallow/functions/alicorn_data_loader.py @@ -0,0 +1,107 @@ +import torch +import numpy as np +import os + + +@torch.no_grad() +def alicorn_data_loader( + num_pfinkel: list[int] | None, + load_stimuli_per_pfinkel: int, + condition: str, + data_path: str, + logger=None, +) -> torch.utils.data.TensorDataset: + """ + - num_pfinkel: list of the angles that should be loaded (ranging from + 0-90). If None: all pfinkels loaded + - stimuli_per_pfinkel: defines amount of stimuli per path angle but + for label 0 and label 1 seperatly (e.g., stimuli_per_pfinkel = 1000: + 1000 stimuli = label 1, 1000 stimuli = label 0) + """ + filename: str | None = None + if condition == "Angular": + filename = "angular_angle" + elif condition == "Coignless": + filename = "base_angle" + elif condition == "Natural": + filename = "corner_angle" + else: + filename = None + assert filename is not None + filepaths: str = os.path.join(data_path, f"{condition}") + + stimuli_per_pfinkel: int = 100000 + + # ---------------------------- + + # for angles and batches + if num_pfinkel is None: + angle: list[int] = np.arange(0, 100, 10).tolist() + else: + angle = num_pfinkel + + assert isinstance(angle, list) + + batch: list[int] = np.arange(1, 11, 1).tolist() + + if load_stimuli_per_pfinkel <= (stimuli_per_pfinkel // len(batch)): + num_img_per_pfinkel: int = load_stimuli_per_pfinkel + num_batches: int = 1 + else: + # handle case where more than 10,000 stimuli per pfinkel needed + num_batches = load_stimuli_per_pfinkel // (stimuli_per_pfinkel // len(batch)) + num_img_per_pfinkel = load_stimuli_per_pfinkel // num_batches + + if logger is not None: + logger.info(f"{num_batches} batches") + logger.info(f"{num_img_per_pfinkel} stimuli per pfinkel.") + + # initialize data and label tensors: + num_stimuli: int = len(angle) * num_batches * num_img_per_pfinkel * 2 + data_tensor: torch.Tensor = torch.empty( + (num_stimuli, 200, 200), dtype=torch.uint8, device=torch.device("cpu") + ) + label_tensor: torch.Tensor = torch.empty( + (num_stimuli), dtype=torch.int64, device=torch.device("cpu") + ) + + if logger is not None: + logger.info(f"data tensor shape: {data_tensor.shape}") + logger.info(f"label tensor shape: {label_tensor.shape}") + + # append data + idx: int = 0 + for i in range(len(angle)): + for j in range(num_batches): + # load contour + temp_filename: str = ( + f"{filename}_{angle[i]:03}_b{batch[j]:03}_n10000_RENDERED.npz" + ) + contour_filename: str = os.path.join(filepaths, temp_filename) + c_data = np.load(contour_filename) + data_tensor[idx : idx + num_img_per_pfinkel, ...] = torch.tensor( + c_data["gaborfield"][:num_img_per_pfinkel, ...], + dtype=torch.uint8, + device=torch.device("cpu"), + ) + label_tensor[idx : idx + num_img_per_pfinkel] = int(1) + idx += num_img_per_pfinkel + + # next append distractor stimuli + for i in range(len(angle)): + for j in range(num_batches): + # load distractor + temp_filename = ( + f"{filename}_{angle[i]:03}_dist_b{batch[j]:03}_n10000_RENDERED.npz" + ) + distractor_filename: str = os.path.join(filepaths, temp_filename) + nc_data = np.load(distractor_filename) + data_tensor[idx : idx + num_img_per_pfinkel, ...] = torch.tensor( + nc_data["gaborfield"][:num_img_per_pfinkel, ...], + dtype=torch.uint8, + device=torch.device("cpu"), + ) + label_tensor[idx : idx + num_img_per_pfinkel] = int(0) + idx += num_img_per_pfinkel + + return torch.utils.data.TensorDataset(label_tensor, data_tensor.unsqueeze(1)) diff --git a/Classic_contour_net_shallow/functions/analyse_network.py b/Classic_contour_net_shallow/functions/analyse_network.py new file mode 100644 index 0000000..937affe --- /dev/null +++ b/Classic_contour_net_shallow/functions/analyse_network.py @@ -0,0 +1,103 @@ +import torch + + +def unfold( + layer: torch.nn.Conv2d | torch.nn.MaxPool2d | torch.nn.AvgPool2d, size: int +) -> torch.Tensor: + if isinstance(layer.kernel_size, tuple): + assert layer.kernel_size[0] == layer.kernel_size[1] + kernel_size: int = int(layer.kernel_size[0]) + else: + kernel_size = int(layer.kernel_size) + + if isinstance(layer.dilation, tuple): + assert layer.dilation[0] == layer.dilation[1] + dilation: int = int(layer.dilation[0]) + else: + dilation = int(layer.dilation) # type: ignore + + if isinstance(layer.padding, tuple): + assert layer.padding[0] == layer.padding[1] + padding: int = int(layer.padding[0]) + else: + padding = int(layer.padding) + + if isinstance(layer.stride, tuple): + assert layer.stride[0] == layer.stride[1] + stride: int = int(layer.stride[0]) + else: + stride = int(layer.stride) + + out = ( + torch.nn.functional.unfold( + torch.arange(0, size, dtype=torch.float32) + .unsqueeze(0) + .unsqueeze(0) + .unsqueeze(-1), + kernel_size=(kernel_size, 1), + dilation=(dilation, 1), + padding=(padding, 0), + stride=(stride, 1), + ) + .squeeze(0) + .type(torch.int64) + ) + + return out + + +def analyse_network( + model: torch.nn.Sequential, input_shape: int +) -> tuple[list, list, list]: + combined_list: list = [] + coordinate_list: list = [] + layer_type_list: list = [] + pixel_used: list[int] = [] + + size: int = int(input_shape) + + for layer_id in range(0, len(model)): + if isinstance( + model[layer_id], (torch.nn.Conv2d, torch.nn.MaxPool2d, torch.nn.AvgPool2d) + ): + out = unfold(layer=model[layer_id], size=size) + coordinate_list.append(out) + layer_type_list.append( + str(type(model[layer_id])).split(".")[-1].split("'")[0] + ) + size = int(out.shape[-1]) + else: + coordinate_list.append(None) + layer_type_list.append(None) + + assert coordinate_list[0] is not None + combined_list.append(coordinate_list[0]) + + for i in range(1, len(coordinate_list)): + if coordinate_list[i] is None: + combined_list.append(combined_list[i - 1]) + else: + for pos in range(0, coordinate_list[i].shape[-1]): + idx_shape: int | None = None + + idx = torch.unique( + torch.flatten(combined_list[i - 1][:, coordinate_list[i][:, pos]]) + ) + if idx_shape is None: + idx_shape = idx.shape[0] + assert idx_shape == idx.shape[0] + + assert idx_shape is not None + + temp = torch.zeros((idx_shape, coordinate_list[i].shape[-1])) + for pos in range(0, coordinate_list[i].shape[-1]): + idx = torch.unique( + torch.flatten(combined_list[i - 1][:, coordinate_list[i][:, pos]]) + ) + temp[:, pos] = idx + combined_list.append(temp) + + for i in range(0, len(combined_list)): + pixel_used.append(int(torch.unique(torch.flatten(combined_list[i])).shape[0])) + + return combined_list, layer_type_list, pixel_used diff --git a/Classic_contour_net_shallow/functions/create_logger.py b/Classic_contour_net_shallow/functions/create_logger.py new file mode 100644 index 0000000..8464981 --- /dev/null +++ b/Classic_contour_net_shallow/functions/create_logger.py @@ -0,0 +1,40 @@ +import logging +import datetime +import os + + +def create_logger(save_logging_messages: bool, display_logging_messages: bool, model_name: str | None): + now = datetime.datetime.now() + dt_string_filename = now.strftime("%Y_%m_%d_%H_%M_%S") + + logger = logging.getLogger("MyLittleLogger") + logger.setLevel(logging.DEBUG) + + if save_logging_messages: + if model_name: + filename = os.path.join( + "logs", f"log_{dt_string_filename}_{model_name}.txt" + ) + else: + filename = os.path.join("logs", f"log_{dt_string_filename}.txt") + + time_format = "%b %-d %Y %H:%M:%S" + logformat = "%(asctime)s %(message)s" + file_formatter = logging.Formatter(fmt=logformat, datefmt=time_format) + os.makedirs("logs", exist_ok=True) + file_handler = logging.FileHandler(filename) + file_handler.setLevel(logging.INFO) + file_handler.setFormatter(file_formatter) + logger.addHandler(file_handler) + + if display_logging_messages: + time_format = "%H:%M:%S" + logformat = "%(asctime)s %(message)s" + stream_formatter = logging.Formatter(fmt=logformat, datefmt=time_format) + + stream_handler = logging.StreamHandler() + stream_handler.setLevel(logging.INFO) + stream_handler.setFormatter(stream_formatter) + logger.addHandler(stream_handler) + + return logger diff --git a/Classic_contour_net_shallow/functions/fisher_exact.py b/Classic_contour_net_shallow/functions/fisher_exact.py new file mode 100644 index 0000000..6437458 --- /dev/null +++ b/Classic_contour_net_shallow/functions/fisher_exact.py @@ -0,0 +1,39 @@ +from scipy.stats import fisher_exact + + +def fisher_excat_upper( + correct_pattern_count: int, number_of_pattern: int, p_threshold: float = 5.0 / 100.0 +) -> float: + error_pattern_count = int(number_of_pattern - correct_pattern_count) + + bound = 100.0 + for u in range(0, correct_pattern_count): + z = int(error_pattern_count + u) + _, pvalue = fisher_exact( + [[correct_pattern_count, error_pattern_count], [number_of_pattern - z, z]], + alternative="greater", + ) + if bool(pvalue > p_threshold) is False: + bound = u * 100.0 / number_of_pattern + break + + return bound + + +def fisher_excat_lower( + correct_pattern_count: int, number_of_pattern: int, p_threshold: float = 5.0 / 100.0 +) -> float: + error_pattern_count = int(number_of_pattern - correct_pattern_count) + + bound = 0.0 + for u in range(0, error_pattern_count): + z = int(error_pattern_count - u) + _, pvalue = fisher_exact( + [[correct_pattern_count, error_pattern_count], [number_of_pattern - z, z]], + alternative="less", + ) + if bool(pvalue > p_threshold) is False: + bound = u * 100.0 / number_of_pattern + break + + return bound diff --git a/Classic_contour_net_shallow/functions/make_cnn.py b/Classic_contour_net_shallow/functions/make_cnn.py new file mode 100644 index 0000000..3f84363 --- /dev/null +++ b/Classic_contour_net_shallow/functions/make_cnn.py @@ -0,0 +1,114 @@ +import torch +import numpy as np + + +def make_cnn( + conv_out_channels_list: list[int], + conv_kernel_size: list[int], + conv_stride_size: int, + conv_activation_function: str, + train_conv_0: bool, + logger, + conv_0_kernel_size: int, + mp_1_kernel_size: int, + mp_1_stride: int, + pooling_type: str, + conv_0_enable_softmax: bool, + l_relu_negative_slope: float, +) -> torch.nn.Sequential: + assert len(conv_out_channels_list) >= 1 + assert len(conv_out_channels_list) == len(conv_kernel_size) + 1 + + cnn = torch.nn.Sequential() + + # Fixed structure + cnn.append( + torch.nn.Conv2d( + in_channels=1, + out_channels=conv_out_channels_list[0] if train_conv_0 else 32, + kernel_size=conv_0_kernel_size, + stride=1, + bias=train_conv_0, + ) + ) + + if conv_0_enable_softmax: + cnn.append(torch.nn.Softmax(dim=1)) + + setting_understood: bool = False + if conv_activation_function.upper() == str("relu").upper(): + cnn.append(torch.nn.ReLU()) + setting_understood = True + elif conv_activation_function.upper() == str("leaky relu").upper(): + cnn.append(torch.nn.LeakyReLU(negative_slope=l_relu_negative_slope)) + setting_understood = True + elif conv_activation_function.upper() == str("tanh").upper(): + cnn.append(torch.nn.Tanh()) + setting_understood = True + elif conv_activation_function.upper() == str("none").upper(): + setting_understood = True + assert setting_understood + + setting_understood = False + if pooling_type.upper() == str("max").upper(): + cnn.append(torch.nn.MaxPool2d(kernel_size=mp_1_kernel_size, stride=mp_1_stride)) + setting_understood = True + elif pooling_type.upper() == str("average").upper(): + cnn.append(torch.nn.AvgPool2d(kernel_size=mp_1_kernel_size, stride=mp_1_stride)) + setting_understood = True + elif pooling_type.upper() == str("none").upper(): + setting_understood = True + assert setting_understood + + # Changing structure + for i in range(1, len(conv_out_channels_list)): + if i == 1 and not train_conv_0: + in_channels = 32 + else: + in_channels = conv_out_channels_list[i - 1] + cnn.append( + torch.nn.Conv2d( + in_channels=in_channels, + out_channels=conv_out_channels_list[i], + kernel_size=conv_kernel_size[i - 1], + stride=conv_stride_size, + bias=True, + ) + ) + setting_understood = False + if conv_activation_function.upper() == str("relu").upper(): + cnn.append(torch.nn.ReLU()) + setting_understood = True + elif conv_activation_function.upper() == str("leaky relu").upper(): + cnn.append(torch.nn.LeakyReLU(negative_slope=l_relu_negative_slope)) + setting_understood = True + elif conv_activation_function.upper() == str("tanh").upper(): + cnn.append(torch.nn.Tanh()) + setting_understood = True + elif conv_activation_function.upper() == str("none").upper(): + setting_understood = True + + assert setting_understood + + # Fixed structure + # define fully connected layer: + cnn.append(torch.nn.Flatten(start_dim=1)) + cnn.append(torch.nn.LazyLinear(2, bias=True)) + + # if conv1 not trained: + filename_load_weight_0: str | None = None + if train_conv_0 is False and cnn[0]._parameters["weight"].shape[0] == 32: + filename_load_weight_0 = "weights_radius10.npy" + if train_conv_0 is False and cnn[0]._parameters["weight"].shape[0] == 16: + filename_load_weight_0 = "8orient_2phase_weights.npy" + + if filename_load_weight_0 is not None: + logger.info(f"Replace weights in CNN 0 with {filename_load_weight_0}") + cnn[0]._parameters["weight"] = torch.tensor( + np.load(filename_load_weight_0), + dtype=cnn[0]._parameters["weight"].dtype, + requires_grad=False, + device=cnn[0]._parameters["weight"].device, + ) + + return cnn diff --git a/Classic_contour_net_shallow/functions/plot_intermediate.py b/Classic_contour_net_shallow/functions/plot_intermediate.py new file mode 100644 index 0000000..14220a9 --- /dev/null +++ b/Classic_contour_net_shallow/functions/plot_intermediate.py @@ -0,0 +1,82 @@ +import numpy as np +import matplotlib.pyplot as plt +import matplotlib as mpl +import os +import re + +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + + +def plot_intermediate( + train_accuracy: list[float], + test_accuracy: list[float], + train_losses: list[float], + test_losses: list[float], + save_name: str, + reduction_factor: int = 1, +) -> None: + assert len(train_accuracy) == len(test_accuracy) + assert len(train_accuracy) == len(train_losses) + assert len(train_accuracy) == len(test_losses) + + # legend: + pattern = r"(outChannels\[\d+(?:, \d+)*\]_kernelSize\[\d+(?:, \d+)*\]_)(\w+)(?=_stride)" + matches = re.findall(pattern, save_name) + legend_label = "".join(["".join(match) for match in matches]) + + max_epochs: int = len(train_accuracy) + # set stepsize + x = np.arange(1, max_epochs + 1) + + stepsize = max_epochs // reduction_factor + + # accuracies + plt.figure(figsize=[12, 7]) + plt.subplot(2, 1, 1) + + plt.plot(x, np.array(train_accuracy), label="Train: " + str(legend_label)) + plt.plot(x, np.array(test_accuracy), label="Test: " + str(legend_label)) + plt.title("Training and Testing Accuracy", fontsize=18) + plt.xlabel("Epoch", fontsize=18) + plt.ylabel("Accuracy (\\%)", fontsize=18) + plt.legend(fontsize=12) + plt.xticks( + np.concatenate((np.array([1]), np.arange(stepsize, max_epochs + 1, stepsize))), + np.concatenate((np.array([1]), np.arange(stepsize, max_epochs + 1, stepsize))), + ) + + # Increase tick label font size + plt.xticks(fontsize=16) + plt.yticks(fontsize=16) + plt.grid(True) + + # losses + plt.subplot(2, 1, 2) + plt.plot(x, np.array(train_losses), label="Train: " + str(legend_label)) + plt.plot(x, np.array(test_losses), label="Test: " + str(legend_label)) + plt.title("Training and Testing Losses", fontsize=18) + plt.xlabel("Epoch", fontsize=18) + plt.ylabel("Loss", fontsize=18) + plt.legend(fontsize=14) + plt.xticks( + np.concatenate((np.array([1]), np.arange(stepsize, max_epochs + 1, stepsize))), + np.concatenate((np.array([1]), np.arange(stepsize, max_epochs + 1, stepsize))), + ) + + # Increase tick label font size + plt.xticks(fontsize=16) + plt.yticks(fontsize=16) + plt.grid(True) + + plt.tight_layout() + os.makedirs("performance_plots", exist_ok=True) + plt.savefig( + os.path.join( + "performance_plots", + f"performance_{save_name}.pdf", + ), + dpi=300, + bbox_inches="tight", + ) + plt.show() diff --git a/Classic_contour_net_shallow/functions/set_seed.py b/Classic_contour_net_shallow/functions/set_seed.py new file mode 100644 index 0000000..bc15cbd --- /dev/null +++ b/Classic_contour_net_shallow/functions/set_seed.py @@ -0,0 +1,11 @@ +import torch +import numpy as np + + +def set_seed(seed: int, logger) -> None: + # set seed for all used modules + logger.info(f"set seed to {seed}") + torch.manual_seed(seed=seed) + if torch.cuda.is_available(): + torch.cuda.manual_seed(seed=seed) + np.random.seed(seed=seed) diff --git a/Classic_contour_net_shallow/functions/test.py b/Classic_contour_net_shallow/functions/test.py new file mode 100644 index 0000000..344630d --- /dev/null +++ b/Classic_contour_net_shallow/functions/test.py @@ -0,0 +1,58 @@ +import torch +import logging + + +@torch.no_grad() +def test( + model: torch.nn.modules.container.Sequential, + loader: torch.utils.data.dataloader.DataLoader, + device: torch.device, + tb, + epoch: int, + logger: logging.Logger, + test_accuracy: list[float], + test_losses: list[float], + scale_data: float, +) -> float: + test_loss: float = 0.0 + correct: int = 0 + pattern_count: float = 0.0 + + model.eval() + + for data in loader: + label = data[0].to(device) + image = data[1].type(dtype=torch.float32).to(device) + if scale_data > 0: + image /= scale_data + + output = model(image) + + # loss and optimization + loss = torch.nn.functional.cross_entropy(output, label, reduction="sum") + pattern_count += float(label.shape[0]) + test_loss += loss.item() + prediction = output.argmax(dim=1) + correct += prediction.eq(label).sum().item() + + logger.info( + ( + "Test set:" + f" Average loss: {test_loss / pattern_count:.3e}," + f" Accuracy: {correct}/{pattern_count}," + f"({100.0 * correct / pattern_count:.2f}%)" + ) + ) + logger.info("") + + acc = 100.0 * correct / pattern_count + test_losses.append(test_loss / pattern_count) + test_accuracy.append(acc) + + # add to tb: + tb.add_scalar("Test Loss", (test_loss / pattern_count), epoch) + tb.add_scalar("Test Performance", 100.0 * correct / pattern_count, epoch) + tb.add_scalar("Test Number Correct", correct, epoch) + tb.flush() + + return acc diff --git a/Classic_contour_net_shallow/functions/train.py b/Classic_contour_net_shallow/functions/train.py new file mode 100644 index 0000000..6f13d84 --- /dev/null +++ b/Classic_contour_net_shallow/functions/train.py @@ -0,0 +1,80 @@ +import torch +import logging + + +def train( + model: torch.nn.modules.container.Sequential, + loader: torch.utils.data.dataloader.DataLoader, + optimizer: torch.optim.Adam | torch.optim.SGD, + epoch: int, + device: torch.device, + tb, + test_acc, + logger: logging.Logger, + train_accuracy: list[float], + train_losses: list[float], + train_loss: list[float], + scale_data: float, +) -> float: + num_train_pattern: int = 0 + running_loss: float = 0.0 + correct: int = 0 + pattern_count: float = 0.0 + + model.train() + for data in loader: + label = data[0].to(device) + image = data[1].type(dtype=torch.float32).to(device) + if scale_data > 0: + image /= scale_data + + optimizer.zero_grad() + output = model(image) + loss = torch.nn.functional.cross_entropy(output, label, reduction="sum") + loss.backward() + + optimizer.step() + + # for loss and accuracy plotting: + num_train_pattern += int(label.shape[0]) + pattern_count += float(label.shape[0]) + running_loss += float(loss) + train_loss.append(float(loss)) + prediction = output.argmax(dim=1) + correct += prediction.eq(label).sum().item() + + total_number_of_pattern: int = int(len(loader)) * int(label.shape[0]) + + # infos: + logger.info( + ( + "Train Epoch:" + f" {epoch}" + f" [{int(pattern_count)}/{total_number_of_pattern}" + f" ({100.0 * pattern_count / total_number_of_pattern:.2f}%)]," + f" Loss: {float(running_loss) / float(num_train_pattern):.4e}," + f" Acc: {(100.0 * correct / num_train_pattern):.2f}" + f" Test Acc: {test_acc:.2f}%," + f" LR: {optimizer.param_groups[0]['lr']:.2e}" + ) + ) + + acc = 100.0 * correct / num_train_pattern + train_accuracy.append(acc) + + epoch_loss = running_loss / pattern_count + train_losses.append(epoch_loss) + + # add to tb: + tb.add_scalar("Train Loss", loss.item(), epoch) + tb.add_scalar("Train Performance", torch.tensor(acc), epoch) + tb.add_scalar("Train Number Correct", torch.tensor(correct), epoch) + + # for parameters: + for name, param in model.named_parameters(): + if "weight" in name or "bias" in name: + tb.add_histogram(f"{name}", param.data.clone(), epoch) + + tb.flush() + + return epoch_loss diff --git a/Classic_contour_net_shallow/inspect/__pycache__/plot_as_grid.cpython-310.pyc b/Classic_contour_net_shallow/inspect/__pycache__/plot_as_grid.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7977761567c05c91e67cd51476da15e6584e9d20 GIT binary patch literal 3384 zcmb7G%Wot{8SkooOwZHf8L#bq2$Dbo1B%VUMsQfMOE&T$hZWMAOA9n=PqoKA?#HCM z#~!b0B%}>TONd*Dg6!i;T=)w(aOMx7PDnX`50N6}27>VWs%O3470aW0>Z_`+zWQEW z_4_7ow;L9oUyc4CI@c`gQ<_|T98B(`6-OY#5-hO-W_q65fy0Q$6F2n&&x~183w&Wm z{-iFPyOwax$it{6{12_5QLonB2*C2(p6=w2Vj3?YXdL*3Rt>>zoiH*U)9UCCw$RWUGmNFtg~yXZuT~oyxnqLwV$xXs#=|Fh&6Fdtc#6Pd(p!wftP33 z&n?P?>WR%$zUYhVi#64s+?e##nz(U_?r;!8XixDVFO?!^i^TsNOC zQ4v3m0(g54Dp6C z%*K&+i-T|)1>QjtXHgM&N2b@#NfM`lGbh>rE)3^oJUT3@@kupax#U+C1H&+jOGYcs zjv`qOPbk{Jotv&l+l;_)nip{y=ULDsjl(H?N(<+ z-p1KDsEPO}7T7{qi33I+c1(zL9)|R7o?7y4EdK2$+Xs0XZ66+Pzn70@X@ujl{U}PK zqKxF7?NKhG?FUI%6!8clWMw{+!wjL~t0g$V+ep+j8kO4=>@X~b6zkUXM7Ip%IHI#t z_%KxLf~>Fj{1&^#-oV?#yT!MdXY(&T&i`qe&HvGHZ?G=gG|f=H$$Zx0YplT=%)H#k z>N<0v!TGz~hT^CEf~ugr4YH%z;a||>`RhF#K(Vju#+$u3EJodG#n3fSx+tcS{2ZTG zFyMeSK|wsU<@xJKBY{mAHo<^Rhz$zR&OYFTw&w3Ds= z_h?jOnTtE{WnDB?<6}#-RQqG=6X&Y0Wee5B7VT#hV$gZGb3uRDb`AE+8iuk-gsu>9 zwzeOS4YIc78^rz^k*^bZlgL{{zCq-hLGN>;%XyzfNnTG20_&%!RJPyFu%A5@qrhZKf!K7OWf)fS=^E5}U%K z2ntY+P+9VQLLV!M_W<`a(q7e@j~Z;G(_~oYd2$$+#g_TMPo?3uDWbaZ ze7CkCseL*6u_?ah<0IkNY5b~k`%;$uyJ;?FN%TYdZ&Z-8zSTkweUlrX^ZT!kn=|Kg I-tBz;FJsL^bN~PV literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/inspect/optimal_stimulus.py b/Classic_contour_net_shallow/inspect/optimal_stimulus.py new file mode 100644 index 0000000..e47f7d7 --- /dev/null +++ b/Classic_contour_net_shallow/inspect/optimal_stimulus.py @@ -0,0 +1,164 @@ +import torch +import matplotlib.pyplot as plt +import matplotlib.patches as patch +import matplotlib as mpl + +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + +import os +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +sys.path.append(parent_dir) +from functions.analyse_network import analyse_network + + +# define parameters +num_iterations: int = 100000 +learning_rate: float = 0.1 +apply_input_mask: bool = True +mark_region_in_plot: bool = False +sheduler_patience: int = 500 +sheduler_factor: float = 0.9 +sheduler_eps = 1e-08 +target_image_active: float = 1e4 + +# path to NN +nn = "ArghCNN_numConvLayers3_outChannels[6, 8, 8]_kernelSize[7, 15]_leaky relu_stride1_trainFirstConvLayerTrue_seed287302_Coignless_801Epoch_2807-0857" +PATH = f"./trained_models/{nn}.pt" +device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") + + +# load and eval model +model = torch.load(PATH).to(device) +model.eval() +print("Full network:") +print(model) +print("") + +# enter index to plot: +idx = int(input("Please select layer: ")) +print(f"Selected layer {idx}:") +assert idx < len(model) +model = model[: idx + 1] + +# random input +input_img = torch.randn(1, 200, 200).to(device) +input_img = input_img.unsqueeze(0) +input_img.requires_grad_(True) # type: ignore + +input_shape = input_img.shape +assert input_shape[-2] == input_shape[-1] +coordinate_list, layer_type_list, pixel_used = analyse_network( + model=model, input_shape=int(input_shape[-1]) +) + +output_shape = model(input_img).shape +target_image = torch.zeros( + (*output_shape,), dtype=input_img.dtype, device=input_img.device +) + +input_parameter = torch.nn.Parameter(input_img) + + +print( + ( + f"Available max positions: f:{target_image.shape[1]} " + f"x:{target_image.shape[2]} y:{target_image.shape[3]}" + ) +) + +# select neuron and plot for all feature maps (?) +neuron_f = int(input("Please select neuron_f: ")) +neuron_x = target_image.shape[2] // 2 +neuron_y = target_image.shape[3] // 2 +print(f"Selected neuron {neuron_f}, {neuron_x}, {neuron_y}") + +# Input mask -> +active_input_x = coordinate_list[-1][:, neuron_x].clone() +active_input_y = coordinate_list[-1][:, neuron_y].clone() + +input_mask: torch.Tensor = torch.zeros_like(input_img) + +input_mask[ + :, + :, + active_input_x.type(torch.int64).unsqueeze(-1), + active_input_y.type(torch.int64).unsqueeze(0), +] = 1 + +rect_x = [int(active_input_x.min()), int(active_input_x.max())] +rect_y = [int(active_input_y.min()), int(active_input_y.max())] +# <- Input mask + +if apply_input_mask: + with torch.no_grad(): + input_img *= input_mask + + +optimizer = torch.optim.Adam([{"params": input_parameter}], lr=learning_rate) + +scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau( + optimizer, + patience=sheduler_patience, + factor=sheduler_factor, + eps=sheduler_eps * 0.1, +) + +target_image[0, neuron_f, neuron_x, neuron_y] = target_image_active + +counter: int = 0 +while (optimizer.param_groups[0]["lr"] > sheduler_eps) and (counter < num_iterations): + optimizer.zero_grad() + + output = model(input_parameter) + + loss = torch.nn.functional.mse_loss(output, target_image) + loss.backward() + + if counter % 1000 == 0: + print( + f"{counter} : loss={float(loss):.3e} lr={optimizer.param_groups[0]['lr']:.3e}" + ) + + optimizer.step() + + if apply_input_mask: + with torch.no_grad(): + input_parameter.data[torch.where(input_mask == 0)] = 0.0 + + with torch.no_grad(): + max_data = torch.abs(input_parameter.data).max() + if max_data > 1.0: + input_parameter.data /= max_data + + if ( + torch.isfinite(input_parameter.data).sum().cpu() + != torch.tensor(input_parameter.data.size()).prod() + ): + print(f"Found NaN in step: {counter}, use a smaller initial lr") + exit() + + scheduler.step(float(loss)) + counter += 1 + +# plot image: +_, ax = plt.subplots() + +ax.imshow(input_img.squeeze().detach().cpu().numpy(), cmap="gray") + +if mark_region_in_plot: + edgecolor = "sienna" + kernel = patch.Rectangle( + (rect_y[0], rect_x[0]), + int(rect_y[1] - rect_y[0]), + int(rect_x[1] - rect_x[0]), + linewidth=1.2, + edgecolor=edgecolor, + facecolor="none", + ) + ax.add_patch(kernel) + + +plt.show(block=True) diff --git a/Classic_contour_net_shallow/inspect/performance_plots/feature_perf_[].pdf b/Classic_contour_net_shallow/inspect/performance_plots/feature_perf_[].pdf new file mode 100644 index 0000000000000000000000000000000000000000..96eeb084ec6277c6c66ac02edf33d9afdb62b2e2 GIT binary patch literal 129676 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 z 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

JNxdm9wO{vsaKjLN1!@vn5 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

  • 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 vDU*_|?e8ziU+ajZjfpMk8=m+d%ZHmwo83S1V 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%0A=qO5mhz2EDj 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 YM?HJTe=H+*b~;8@ND>lZSrN$p1GN&Ms{jB1 literal 0 HcmV?d00001 diff --git a/Classic_contour_net_shallow/inspect/plot_as_grid.py b/Classic_contour_net_shallow/inspect/plot_as_grid.py new file mode 100644 index 0000000..fb93041 --- /dev/null +++ b/Classic_contour_net_shallow/inspect/plot_as_grid.py @@ -0,0 +1,182 @@ +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import make_axes_locatable +import matplotlib as mpl +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + +def plot_weights( + plot, + s, + grid_color, + linewidth, + idx, + smallDim, + swap_channels, + activations, + layer, + title, + colorbar, + vmin, + vmax, +): + plt.imshow(plot.T, cmap="gray", origin="lower", vmin=vmin, vmax=vmax) + + ax = plt.gca() + a = np.arange(0, plot.shape[1] + 1, s[3]) + b = np.arange(0, plot.shape[0] + 1, s[1]) + plt.hlines(a - 0.5, -0.5, plot.shape[0] - 0.5, colors=grid_color, lw=linewidth) + plt.vlines(b - 0.5, -0.5, plot.shape[1] - 0.5, colors=grid_color, lw=linewidth) + plt.ylim(-1, plot.shape[1]) + plt.xlim(-1, plot.shape[0]) + + ax.set_xticks(s[1] / 2 + np.arange(-0.5, plot.shape[0] - 1, s[1])) + ax.set_yticks(s[3] / 2 + np.arange(-0.5, plot.shape[1] - 1, s[3])) + + if ( + idx is not None + and (smallDim is False and swap_channels is False) + or (activations is True) + ): + ax.set_xticklabels(idx, fontsize=15) + ax.set_yticklabels(np.arange(s[2]), fontsize=15) + elif idx is not None and layer == "FC1": + ax.set_xticklabels(np.arange(s[0]), fontsize=15) + ax.set_yticklabels(idx, fontsize=15) + elif idx is not None and (smallDim is True or swap_channels is True): + ax.set_xticklabels(np.arange(s[0]), fontsize=15) + ax.set_yticklabels(idx, fontsize=15) + else: + ax.set_xticklabels(np.arange(s[0]), fontsize=15) + ax.set_yticklabels(np.arange(s[2]), fontsize=15) + ax.invert_yaxis() + + ax.xaxis.set_label_position("top") + ax.tick_params(axis="x", top=True, bottom=False, labeltop=True, labelbottom=False) + + if title is not None: + is_string = isinstance(title, str) + if is_string is True: + plt.title(title) + + if colorbar is True: + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="1.5%", pad=0.05) + cbar = plt.colorbar(ax.get_images()[0], cax=cax) + tick_font_size = 14 + cbar.ax.tick_params(labelsize=tick_font_size) + + +def plot_in_grid( + plot, + fig_size=(10, 10), + swap_channels=False, + title=None, + idx=None, + colorbar=False, + vmin=None, + vmax=None, + grid_color="k", + linewidth=0.75, + savetitle=None, + activations=False, + layer=None, + format="pdf", + bias=None, + plot_bias: bool = False, +): + smallDim = False + if plot.ndim < 4: + smallDim = True + plot = np.swapaxes(plot, 0, 1) + plot = plot[:, :, np.newaxis, np.newaxis] + if vmin is None and vmax is None: + # plot_abs = np.amax(np.abs(plot)) + vmin = -(np.amax(np.abs(plot))) + vmax = np.amax(np.abs(plot)) + + if swap_channels is True: + plot = np.swapaxes(plot, 0, 1) + + # print(plot.shape) + plot = np.ascontiguousarray(np.moveaxis(plot, 1, 2)) + + for j in range(plot.shape[2]): + for i in range(plot.shape[0]): + plot[(i - 1), :, (j - 1), :] = plot[(i - 1), :, (j - 1), :].T + + s = plot.shape + plot = plot.reshape((s[0] * s[1], s[2] * s[3])) + plt.figure(figsize=fig_size) + + if plot_bias and bias is not None: + if swap_channels: + # If axes are swapped, arrange the plots side by side + plt.subplot(1, 2, 1) + plot_weights( + plot=plot, + s=s, + grid_color=grid_color, + linewidth=linewidth, + idx=idx, + smallDim=smallDim, + swap_channels=swap_channels, + activations=activations, + layer=layer, + title=title, + colorbar=colorbar, + vmin=vmin, + vmax=vmax, + ) + + plt.subplot(1, 2, 2) + plt.plot(bias, np.arange(len(bias))) + plt.ylim(len(bias) - 1, 0) + plt.title("Bias") + plt.tight_layout() + + else: + plt.subplot(2, 1, 1) + plot_weights( + plot=plot, + s=s, + grid_color=grid_color, + linewidth=linewidth, + idx=idx, + smallDim=smallDim, + swap_channels=swap_channels, + activations=activations, + layer=layer, + title=title, + colorbar=colorbar, + vmin=vmin, + vmax=vmax, + ) + + plt.subplot(2, 1, 2) + plt.plot(np.arange(len(bias)), bias) + plt.title("Bias") + + + else: + plot_weights( + plot=plot, + s=s, + grid_color=grid_color, + linewidth=linewidth, + idx=idx, + smallDim=smallDim, + swap_channels=swap_channels, + activations=activations, + layer=layer, + title=title, + colorbar=colorbar, + vmin=vmin, + vmax=vmax, + ) + + if savetitle is not None: + plt.savefig(f"plot_as_grid/{savetitle}.{format}") + + plt.tight_layout() + plt.show(block=True) diff --git a/Classic_contour_net_shallow/inspect/plot_perf_across_channels.py b/Classic_contour_net_shallow/inspect/plot_perf_across_channels.py new file mode 100644 index 0000000..3307d58 --- /dev/null +++ b/Classic_contour_net_shallow/inspect/plot_perf_across_channels.py @@ -0,0 +1,72 @@ +import numpy as np +import matplotlib.pyplot as plt +import matplotlib as mpl +import os +import glob +from natsort import natsorted + + +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + + +def plot_performance_across_channels( + filename_list: list[str], channel_idx: int, saveplot: bool +) -> None: + """ + y-axis: accuracies + x-axis: number of output channels in first layer + """ + + train_accuracy: list = [] + test_accuracy: list = [] + output_channels: list = [] + + for file in filename_list: + data = np.load(file) + output_channels.append(data["output_channels"]) + train_accuracy.append(data["train_accuracy"]) + test_accuracy.append(data["test_accuracy"]) + + # get only first output channel: + out_channel_size = [out[channel_idx] for out in output_channels] + + # get max accuracy of trained NNs + max_train_acc = [train.max() for train in train_accuracy] + max_test_acc = [test.max() for test in test_accuracy] + + plt.figure(figsize=[12, 7]) + plt.plot(out_channel_size, np.array(max_train_acc), label="Train") + plt.plot(out_channel_size, np.array(max_test_acc), label="Test") + plt.title("Training and Testing Accuracy", fontsize=18) + plt.xlabel( + f"Number of features in convolutional layer {channel_idx+1}", fontsize=18 + ) + plt.ylabel("Max. accuracy (\\%)", fontsize=18) + plt.legend(fontsize=14) + + # Increase tick label font size + plt.xticks(out_channel_size, fontsize=16) + plt.yticks(fontsize=16) + plt.grid(True) + + plt.tight_layout() + if saveplot: + os.makedirs("performance_plots", exist_ok=True) + plt.savefig( + os.path.join( + "performance_plots", + f"feature_perf_{output_channels}.pdf", + ), + dpi=300, + bbox_inches="tight", + ) + plt.show() + + +if __name__ == "__main__": + path: str = "/home/kk/Documents/Semester4/code/Classic_contour_net_shallow/performance_data/" + filename_list = natsorted(glob.glob(os.path.join(path, "performances_*.npz"))) + plot_performance_across_channels( + filename_list=filename_list, channel_idx=0, saveplot=True + ) diff --git a/Classic_contour_net_shallow/inspect/plot_weights.py b/Classic_contour_net_shallow/inspect/plot_weights.py new file mode 100644 index 0000000..34aa127 --- /dev/null +++ b/Classic_contour_net_shallow/inspect/plot_weights.py @@ -0,0 +1,49 @@ +import torch +from plot_as_grid import plot_in_grid + +import os +import sys + +parent_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +sys.path.append(parent_dir) +from functions.make_cnn import make_cnn # noqa + + +# load on cpu +device = torch.device("cpu") + +# path to NN +nn = "ArghCNN_numConvLayers3_outChannels[6, 8, 8]_kernelSize[7, 15]_leaky relu_stride1_trainFirstConvLayerTrue_seed287302_Coignless_801Epoch_2807-0857.pt" +PATH = f"../trained_models/{nn}" + +# load and evaluate model +model = torch.load(PATH).to(device) +model.eval() +print("Full network:") +print(model) +print("") + +# enter index to plot: +idx = int(input("Please select layer: ")) +print(f"Selected layer {idx}:") +print(model[idx]) + +# bias +bias_input = input("Plot bias (y/n): ") +plot_bias: bool = False +if bias_input == "y": + plot_bias = True + bias = model[idx]._parameters["bias"].data + print(bias) +else: + bias = None + +# visualize weights: +if idx > 0: + weights = model[idx].weight.cpu().detach().clone().numpy() + plot_in_grid( + weights, colorbar=True, swap_channels=True, bias=bias, plot_bias=plot_bias + ) +else: + weights = model[idx].weight.cpu().detach().clone().numpy() + plot_in_grid(weights, colorbar=True, bias=bias, plot_bias=plot_bias) diff --git a/Classic_contour_net_shallow/inspect_weights_conv_0.py b/Classic_contour_net_shallow/inspect_weights_conv_0.py new file mode 100644 index 0000000..0c64c8d --- /dev/null +++ b/Classic_contour_net_shallow/inspect_weights_conv_0.py @@ -0,0 +1,47 @@ +import torch +import torchvision as tv +import matplotlib.pyplot as plt +import os +import glob +from natsort import natsorted + +# import numpy as np + +layer_id: int = 0 +scale_each: bool = False + +model_path: str = "trained_models" +filename_list: list = natsorted(glob.glob(os.path.join(model_path, str("*.pt")))) +assert len(filename_list) > 0 +model_filename: str = filename_list[-1] +print(f"Load filename: {model_filename}") + +model = torch.load(model_filename, map_location=torch.device("cpu")) +assert layer_id < len(model) + +# --- +weights = model[layer_id]._parameters["weight"].data +bias = model[layer_id]._parameters["bias"].data + +weight_grid = tv.utils.make_grid( + weights, nrow=8, padding=2, scale_each=scale_each, pad_value=float("NaN") +) + +v_max_abs = torch.abs(weight_grid[0, ...]).max() + +plt.subplot(3, 1, (1, 2)) +plt.imshow( + weight_grid[0, ...], + vmin=-v_max_abs, + vmax=v_max_abs, + cmap="cool", +) +plt.axis("off") +plt.colorbar() +plt.title("Weights") + +plt.subplot(3, 1, 3) +plt.plot(bias) +plt.title("Bias") + +plt.show() diff --git a/Classic_contour_net_shallow/inspect_weights_conv_x.py b/Classic_contour_net_shallow/inspect_weights_conv_x.py new file mode 100644 index 0000000..cf99f67 --- /dev/null +++ b/Classic_contour_net_shallow/inspect_weights_conv_x.py @@ -0,0 +1,62 @@ +import torch +import torchvision as tv +import matplotlib.pyplot as plt +import os +import glob +from natsort import natsorted + +# import numpy as np + +layer_id: int = 3 +scale_each_inner: bool = False +scale_each_outer: bool = False + +model_path: str = "trained_models" +filename_list: list = natsorted(glob.glob(os.path.join(model_path, str("*.pt")))) +assert len(filename_list) > 0 +model_filename: str = filename_list[-1] +print(f"Load filename: {model_filename}") + +model = torch.load(model_filename, map_location=torch.device("cpu")) +assert layer_id < len(model) + +print("Full network:") +print(model) +print("") +print(f"Selected layer {layer_id}:") +print(model[layer_id]) + +# --- +weights = model[layer_id]._parameters["weight"].data +bias = model[layer_id]._parameters["bias"].data + +weight_grid = tv.utils.make_grid( + weights.movedim(0, 1), + nrow=8, + padding=2, + scale_each=scale_each_inner, + pad_value=float("NaN"), +) +weight_grid = tv.utils.make_grid( + weight_grid.unsqueeze(1), nrow=4, padding=2, scale_each=scale_each_outer +) + + +v_max_abs = torch.abs(weight_grid[0, ...]).max() + +plt.subplot(3, 1, (1, 2)) +plt.imshow( + weight_grid[0, ...], + vmin=-v_max_abs, + vmax=v_max_abs, + cmap="cool", +) +plt.axis("off") +plt.colorbar() +plt.title("Weights") + +plt.subplot(3, 1, 3) +plt.plot(bias) +plt.title("Bias") + +plt.show() diff --git a/Classic_contour_net_shallow/performance_pfinkel_plots.py b/Classic_contour_net_shallow/performance_pfinkel_plots.py new file mode 100644 index 0000000..c5c1b8b --- /dev/null +++ b/Classic_contour_net_shallow/performance_pfinkel_plots.py @@ -0,0 +1,223 @@ +import torch +import numpy as np +import matplotlib.pyplot as plt +import matplotlib as mpl +import os +import datetime +import re +import glob +from natsort import natsorted + +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + +from functions.alicorn_data_loader import alicorn_data_loader +from functions.create_logger import create_logger + + +def performance_pfinkel_plot( + performances_list: list[dict], labels: list[str], save_name: str, logger +) -> None: + figure_path: str = "performance_pfinkel" + assert len(performances_list) == len(labels) + + plt.figure(figsize=[14, 10]) + # plot accuracy + plt.subplot(2, 1, 1) + for id in range(0, len(labels)): + x_values = np.zeros((len(performances_list[id].keys()))) + y_values = np.zeros((len(performances_list[id].keys()))) + + counter = 0 + for id_key in performances_list[id].keys(): + x_values[counter] = performances_list[id][id_key]["pfinkel"] + y_values[counter] = performances_list[id][id_key]["test_accuracy"] + counter += 1 + + plt.plot(x_values, y_values, label=labels[id]) + plt.xticks(x_values) + plt.title("Average accuracy", fontsize=18) + plt.xlabel("Path angle (in °)", fontsize=17) + plt.ylabel("Accuracy (\\%)", fontsize=17) + plt.legend(fontsize=14) + + # Increase tick label font size + plt.xticks(fontsize=16) + plt.yticks(fontsize=16) + plt.grid(True) + + # plot loss + plt.subplot(2, 1, 2) + for id in range(0, len(labels)): + x_values = np.zeros((len(performances_list[id].keys()))) + y_values = np.zeros((len(performances_list[id].keys()))) + + counter = 0 + for id_key in performances_list[id].keys(): + x_values[counter] = performances_list[id][id_key]["pfinkel"] + y_values[counter] = performances_list[id][id_key]["test_losses"] + counter += 1 + + plt.plot(x_values, y_values, label=labels[id]) + + plt.xticks(x_values) + plt.title("Average loss", fontsize=18) + plt.xlabel("Path angle (in °)", fontsize=17) + plt.ylabel("Loss", fontsize=17) + plt.legend(fontsize=14) + + # Increase tick label font size + plt.xticks(fontsize=16) + plt.yticks(fontsize=16) + plt.grid(True) + + plt.tight_layout() + logger.info("") + logger.info("Saved in:") + + os.makedirs(figure_path, exist_ok=True) + print( + os.path.join( + figure_path, + f"PerformancePfinkel_{save_name}_{current}.pdf", + ) + ) + plt.savefig( + os.path.join( + figure_path, + f"PerformancePfinkel_{save_name}_{current}.pdf", + ), + dpi=300, + bbox_inches="tight", + ) + plt.show() + + +if __name__ == "__main__": + model_path: str = "trained_models" + data_path: str = "/home/kk/Documents/Semester4/code/RenderStimuli/Output/" + selection_file_id: int = 0 + + # num stimuli per Pfinkel and batch size + stim_per_pfinkel: int = 10000 + batch_size: int = 1000 + # stimulus condition: + performances_list: list = [] + condition: list[str] = ["Coignless", "Natural", "Angular"] + figure_label: list[str] = ["Classic", "Corner", "Bridge"] + # load test data: + num_pfinkel: list = np.arange(0, 100, 10).tolist() + image_scale: float = 255.0 + + # ------------------------------------------ + + # create logger: + logger = create_logger( + save_logging_messages=False, + display_logging_messages=True, + model_name="outChannels[6, 8, 8]" + ) + + device_str: str = "cuda:0" if torch.cuda.is_available() else "cpu" + logger.info(f"Using {device_str} device") + device: torch.device = torch.device(device_str) + torch.set_default_dtype(torch.float32) + + # current time: + current = datetime.datetime.now().strftime("%d%m-%H%M") + + # path to NN + list_filenames: list[str] = natsorted( + list(glob.glob(os.path.join(model_path, "*.pt"))) + ) + assert selection_file_id < len(list_filenames) + # model_filename: str = str(list_filenames[selection_file_id]) + model_filename: str = "./trained_models/ArghCNN_numConvLayers3_outChannels[6, 8, 8]_kernelSize[7, 15]_leaky relu_stride1_trainFirstConvLayerTrue_seed287302_Coignless_801Epoch_2807-0857.pt" + logger.info(f"Using model file: {model_filename}") + + # shorter saving name: + pattern = r"(outChannels\[.*?\])|(kernelSize\[.*?\])|(_relu)|(_seed\d+)" + matches = re.findall(pattern, model_filename) + save_name = "".join(["".join(match) for match in matches]) + + # load and evaluate model + model = torch.load(model_filename, map_location=device) + + # Set the model to evaluation mode + model.eval() + + for selected_condition in condition: + # save performances: + logger.info(f"Condition: {selected_condition}") + performances: dict = {} + for pfinkel in num_pfinkel: + test_loss: float = 0.0 + correct: int = 0 + pattern_count: int = 0 + + data_test = alicorn_data_loader( + num_pfinkel=[pfinkel], + load_stimuli_per_pfinkel=stim_per_pfinkel, + condition=selected_condition, + logger=logger, + data_path=data_path, + ) + loader = torch.utils.data.DataLoader( + data_test, shuffle=False, batch_size=batch_size + ) + + # start testing network on new stimuli: + logger.info("") + logger.info(f"-==- Start {selected_condition} " f"Pfinkel {pfinkel}° -==-") + with torch.no_grad(): + for batch_num, data in enumerate(loader): + label = data[0].to(device) + image = data[1].type(dtype=torch.float32).to(device) + image /= image_scale + + # compute prediction error; + output = model(image) + + # Label Typecast: + label = label.to(device) + + # loss and optimization + loss = torch.nn.functional.cross_entropy( + output, label, reduction="sum" + ) + pattern_count += int(label.shape[0]) + test_loss += float(loss) + prediction = output.argmax(dim=1) + correct += prediction.eq(label).sum().item() + + total_number_of_pattern: int = int(len(loader)) * int( + label.shape[0] + ) + + # logging: + logger.info( + ( + f"{selected_condition},{pfinkel}° " + "Pfinkel: " + f"[{int(pattern_count)}/{total_number_of_pattern} ({100.0 * pattern_count / total_number_of_pattern:.2f}%)]," + f" Average loss: {test_loss / pattern_count:.3e}, " + "Accuracy: " + f"{100.0 * correct / pattern_count:.2f}% " + ) + ) + + performances[pfinkel] = { + "pfinkel": pfinkel, + "test_accuracy": 100 * correct / pattern_count, + "test_losses": float(loss) / pattern_count, + } + + performances_list.append(performances) + + performance_pfinkel_plot( + performances_list=performances_list, + labels=figure_label, + save_name=save_name, + logger=logger, + ) + logger.info("-==- DONE -==-") diff --git a/Classic_contour_net_shallow/plot_performance_data.py b/Classic_contour_net_shallow/plot_performance_data.py new file mode 100644 index 0000000..5ae5523 --- /dev/null +++ b/Classic_contour_net_shallow/plot_performance_data.py @@ -0,0 +1,81 @@ +import numpy as np +import glob +import os +from natsort import natsorted +from functions.fisher_exact import fisher_excat_upper, fisher_excat_lower +import matplotlib.pyplot as plt +import matplotlib as mpl + +mpl.rcParams["text.usetex"] = True +mpl.rcParams["font.family"] = "serif" + +p_threshold: float = 1.0 / 100.0 +file_selection: int = 0 +number_of_pattern: int = 60000 +path: str = "performance_data" +data_source: str = "test_accuracy" +filename_list = natsorted(glob.glob(os.path.join(path, "performances_*.npz"))) +assert file_selection < len(filename_list) + +filename = filename_list[file_selection] + +data = np.load(filename) + +understand_parameter: bool = False +percentage: bool = True +if data_source.upper() == str("test_accuracy").upper(): + to_print = data["test_accuracy"] + understand_parameter = True + percentage = True +elif data_source.upper() == str("train_accuracy").upper(): + to_print = data["train_accuracy"] + understand_parameter = True + percentage = True +elif data_source.upper() == str("train_losses").upper(): + to_print = data["train_losses"] + understand_parameter = True + percentage = False +elif data_source.upper() == str("test_losses").upper(): + to_print = data["test_losses"] + understand_parameter = True + percentage = False +assert understand_parameter + +if percentage: + correct_count = np.round(to_print * number_of_pattern / 100.0).astype(np.int64) + upper = np.zeros((correct_count.shape[0])) + lower = np.zeros((correct_count.shape[0])) + + for id in range(0, correct_count.shape[0]): + upper[id] = fisher_excat_upper( + correct_pattern_count=correct_count[id], + number_of_pattern=number_of_pattern, + p_threshold=p_threshold, + ) + + lower[id] = fisher_excat_lower( + correct_pattern_count=correct_count[id], + number_of_pattern=number_of_pattern, + p_threshold=p_threshold, + ) + + x = np.arange(1, to_print.shape[0] + 1) + y = 100.0 - to_print + plt.plot(x, y + upper, "k--") + plt.plot(x, y - lower, "k--") + plt.plot(x, y, "r") + plt.ylim([0, (100.0 - to_print.min()) * 1.1]) + plt.xlim([1, to_print.shape[0]]) + plt.xlabel("Epochs") + plt.ylabel("Error [%]") + plt.title(data_source.replace("_", " ")) +else: + x = np.arange(1, to_print.shape[0] + 1) + plt.plot(x, to_print) + plt.ylim([0, to_print.max() * 1.1]) + plt.xlim([1, to_print.shape[0]]) + plt.xlabel("Epochs") + plt.ylabel("Loss") + plt.title(data_source.replace("_", " ")) + +plt.show()