Source code for deep_bottleneck.plotter.activations_single_neuron

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
import pandas as pd


from deep_bottleneck.plotter.base import BasePlotter
from deep_bottleneck import utils


[docs]def load(run, dataset): return SingleNeuronActivityPlotter(run, dataset)
[docs]class SingleNeuronActivityPlotter(BasePlotter): plotname = 'single_neuron_activations' def __init__(self, run, dataset): self.dataset = dataset self.run = run def _grab_activations(self, measures_summary): activations_summary = measures_summary['activations_summary'] return activations_summary def _get_number_of_layers(self, all_activations): return len(all_activations["0/activations"]) def _get_number_of_neurons_in_layer(self, all_activations, layer): return all_activations["0/activations"][str(layer)].shape[1] def _create_histogram(self, all_activations, layer_number): neurons_in_layer = self._get_number_of_neurons_in_layer(all_activations, layer_number) hist = [[] for x in range(neurons_in_layer)] epochs_in_activation_summary = [int(epoch) for epoch in all_activations] epochs_in_activation_summary = np.asarray(sorted(epochs_in_activation_summary)) for epoch in epochs_in_activation_summary: activations = all_activations[str(epoch)] layer_activations = activations[f'activations/{layer_number}'] layer_activations = np.asarray(layer_activations) layer_activations = layer_activations.transpose() for neuron_number in range(neurons_in_layer): activations_min, activations_max = utils.get_min_max(all_activations, layer_number, neuron_number) bins = np.linspace(activations_min, activations_max, 30) histogram_per_neuron, _ = np.histogram(layer_activations[neuron_number], bins=bins) hist[neuron_number].append(histogram_per_neuron) return hist
[docs] def plot(self, measures_summary): all_activations = self._grab_activations(measures_summary) neurons_in_first_layer = self._get_number_of_neurons_in_layer(all_activations, 0) num_layers = self._get_number_of_layers(all_activations) fig = plt.figure() gs = gridspec.GridSpec(neurons_in_first_layer * 2, num_layers) for layer_number in range(num_layers): neurons_in_layer = self._get_number_of_neurons_in_layer(all_activations, layer_number) hist = self._create_histogram(all_activations, layer_number) for neuron_number in range(neurons_in_layer): hist_df = pd.DataFrame(hist[neuron_number]) # vertical offset for plotting optic plotting_offset = (neurons_in_first_layer - neurons_in_layer) / 2 gs_y_index = int((neuron_number + plotting_offset) * 2) ax = fig.add_subplot(gs[gs_y_index:gs_y_index + 2, layer_number]) ax.set_ylabel("bins") yticks = np.arange(0, hist_df.shape[1], 5) ax.set_yticks(yticks) ax.set_yticklabels(yticks) ax.set_xlabel("epoch") xticks = np.arange(0, hist_df.shape[0], 5) epochs_in_activation_summary = [int(epoch) for epoch in all_activations] epochs_in_activation_summary = np.asarray(sorted(epochs_in_activation_summary)) ax.set_xticks(xticks) ax.set_xticklabels(epochs_in_activation_summary[xticks], rotation=90) activity_map = ax.imshow(hist_df.transpose(), cmap="viridis", interpolation='nearest') counts_colorbar = fig.colorbar(activity_map) counts_colorbar.set_label("Absolute frequency") ax.set_title(f"Layer {layer_number}, Neuron {neuron_number}") fig.set_figheight(24) fig.set_figwidth(48) fig.tight_layout() return fig