From 62a58ed3bb4e6cebb7ae888d3f18d136a566089e Mon Sep 17 00:00:00 2001 From: Saran-nns Date: Sun, 1 Nov 2020 21:50:18 +0100 Subject: [PATCH] pre release 0.3.1 --- README.md | 2 +- build/lib/sorn/__init__.py | 7 + build/lib/sorn/sorn.py | 241 +++++++++++++++++++++--------- dist/sorn-0.2.10-py3-none-any.whl | Bin 20975 -> 0 bytes dist/sorn-0.2.10.tar.gz | Bin 21561 -> 0 bytes dist/sorn-0.3.1-py3-none-any.whl | Bin 0 -> 22061 bytes dist/sorn-0.3.1.tar.gz | Bin 0 -> 23081 bytes setup.py | 2 +- sorn.egg-info/PKG-INFO | 100 ++++++------- 9 files changed, 230 insertions(+), 122 deletions(-) delete mode 100644 dist/sorn-0.2.10-py3-none-any.whl delete mode 100644 dist/sorn-0.2.10.tar.gz create mode 100644 dist/sorn-0.3.1-py3-none-any.whl create mode 100644 dist/sorn-0.3.1.tar.gz diff --git a/README.md b/README.md index 206f033..55a2418 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ The network is developed as part of my Master thesis at Universität Osnabrück, [![Join the chat at https://gitter.im/Self-Organizing-Recurrent-Neural-Networks](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Self-Organizing-Recurrent-Neural-Networks?utm_source=badge&utm_medium=badge&utm_content=badge) [![PyPI version](https://badge.fury.io/py/sorn.svg)](https://badge.fury.io/py/sorn) ![PyPI - Downloads](https://img.shields.io/pypi/dw/sorn.svg) -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.2590449.svg)](https://doi.org/10.5281/zenodo.2590449) +[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4174137.svg)](https://doi.org/10.5281/zenodo.2590449) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)

SORN Reservoir and the evolution of synaptic efficacies

diff --git a/build/lib/sorn/__init__.py b/build/lib/sorn/__init__.py index e69de29..9df5ae9 100644 --- a/build/lib/sorn/__init__.py +++ b/build/lib/sorn/__init__.py @@ -0,0 +1,7 @@ +from . import sorn +import logging + +__author__ = "Saranraj Nambusubramaniyan" +__version__ = "0.2.10" + +logging.basicConfig(level=logging.INFO) \ No newline at end of file diff --git a/build/lib/sorn/sorn.py b/build/lib/sorn/sorn.py index 04a0658..fe9ef16 100644 --- a/build/lib/sorn/sorn.py +++ b/build/lib/sorn/sorn.py @@ -4,6 +4,7 @@ import numpy as np import os from sorn.utils import Initializer + from configparser import ConfigParser import random import tqdm @@ -257,11 +258,11 @@ def structural_plasticity(wee): indexes = Initializer.get_unconnected_indexes(wee) - # Choose any idx randomly - idx_rand = random.choice(indexes) - - if idx_rand[0] == idx_rand[1]: + # Choose any idx randomly such that i!=j + while True: idx_rand = random.choice(indexes) + if idx_rand[0] != idx_rand[1]: + break wee[idx_rand[0]][idx_rand[1]] = 0.001 @@ -325,14 +326,13 @@ def reorganize_network(): return NotImplementedError - class MatrixCollection(Sorn): def __init__(self, phase, matrices=None): super().__init__() self.phase = phase self.matrices = matrices - if self.phase == 'Plasticity' and self.matrices == None: + if self.phase == 'plasticity' and self.matrices == None: self.time_steps = Sorn.time_steps + 1 # Total training steps self.Wee, self.Wei, self.Wie, self.Te, self.Ti, self.X, self.Y = [0] * self.time_steps, [ @@ -353,7 +353,7 @@ def __init__(self, phase, matrices=None): self.X[0] = x self.Y[0] = y - elif self.phase == 'Plasticity' and self.matrices != None: + elif self.phase == 'plasticity' and self.matrices != None: self.time_steps = Sorn.time_steps + 1 # Total training steps self.Wee, self.Wei, self.Wie, self.Te, self.Ti, self.X, self.Y = [0] * self.time_steps, [ @@ -372,7 +372,7 @@ def __init__(self, phase, matrices=None): self.X[0] = matrices['X'] self.Y[0] = matrices['Y'] - elif self.phase == 'Training': + elif self.phase == 'training': """NOTE: time_steps here is diferent for plasticity and training phase""" @@ -425,18 +425,22 @@ def network_activity_t_1(self, x, y, i): return x_1, y_1 - class NetworkState(Plasticity): + """The evolution of network states""" - + def __init__(self, v_t): super().__init__() self.v_t = v_t - + # Check the input feature size + + assert Sorn.nu==len(self.v_t),"Input units and input size mismatch: {} != {}".format(Sorn.nu,len(self.v_t)) + if Sorn.nu!=Sorn.ne: + self.v_t = list(self.v_t) + [0.]*(Sorn.ne- Sorn.nu) + self.v_t = np.expand_dims(self.v_t, 1) + def incoming_drive(self, weights, activity_vector): - # Broadcasting weight*acivity vectors - incoming = weights * activity_vector incoming = np.array(incoming.sum(axis=0)) return incoming @@ -452,21 +456,17 @@ def excitatory_network_state(self, wee, wei, te, x, y, white_noise_e): incoming_drive_e = np.expand_dims(self.incoming_drive(weights=wee, activity_vector=xt), 1) incoming_drive_i = np.expand_dims(self.incoming_drive(weights=wei, activity_vector=yt), 1) - tot_incoming_drive = incoming_drive_e - incoming_drive_i + white_noise_e + np.asarray(self.v_t) - te """Heaviside step function""" heaviside_step = np.expand_dims([0.] * len(tot_incoming_drive),1) heaviside_step[tot_incoming_drive > 0] = 1. - xt_next = np.asarray(heaviside_step.copy()) # Additional Memory cost just for the sake of variable name - return xt_next def inhibitory_network_state(self, wie, ti, x, white_noise_i): # Activity of inhibitory neurons - wie = np.asarray(wie) xt = x[:, 1] xt = xt.reshape(Sorn.ne, 1) @@ -474,7 +474,6 @@ def inhibitory_network_state(self, wie, ti, x, white_noise_i): incoming_drive_e = np.expand_dims(self.incoming_drive(weights=wie, activity_vector=xt), 1) tot_incoming_drive = incoming_drive_e + white_noise_i - ti - heaviside_step = np.expand_dims([0.] * len(tot_incoming_drive),1) heaviside_step[tot_incoming_drive > 0] = 1. @@ -505,16 +504,31 @@ def recurrent_drive(self, wee, wei, te, x, y, white_noise_e): # Simulate / Train SORN -class RunSorn(Sorn): +class Simulator_(Sorn): - def __init__(self, phase, matrices, time_steps): + def __init__(self): super().__init__() + pass + + def simulate_sorn(self, inputs: np.array=None, phase:str='plasticity', matrices: dict=None, time_steps:int=1,noise:bool=True, **kwargs): + + assert phase == 'plasticity' or 'training',"Phase can be either 'plasticity' or 'training'" + self.time_steps = time_steps Sorn.time_steps = time_steps self.phase = phase self.matrices = matrices - - def run_sorn(self, inp): + + kwargs_ = ['ne', 'nu', 'network_type_ee', 'network_type_ei', 'network_type_ie', + 'lambda_ee','lambda_ei', 'lambda_ie', + 'eta_stdp','eta_inhib', 'eta_ip', + 'te_max', 'ti_max', 'ti_min', 'te_min', 'mu_ip','sigma_ip'] + for key, value in kwargs.items(): + if key in kwargs_: + setattr(Sorn, key, value) + # assert Sorn.nu == len(inputs[:,0]),"Size mismatch: Input != Nu " + Sorn.ni=int(0.2 * Sorn.ne) + # Initialize/Get the weight, threshold matrices and activity vectors matrix_collection = MatrixCollection(phase=self.phase, matrices=self.matrices) @@ -527,26 +541,22 @@ def run_sorn(self, inp): frac_pos_active_conn = [] # To get the last activation status of Exc and Inh neurons - for i in tqdm.tqdm(range(self.time_steps)): """ Generate white noise""" - white_noise_e = Initializer.white_gaussian_noise(mu=0., sigma=0.04, t=Sorn.ne) - white_noise_i = Initializer.white_gaussian_noise(mu=0., sigma=0.04, t=Sorn.ni) - - # Generate inputs - # inp_ = np.expand_dims(Initializer.generate_normal_inp(10), 1) - - network_state = NetworkState(inp) # Feed input and initialize network state + if noise: + white_noise_e = Initializer.white_gaussian_noise(mu=0., sigma=0.04, t=Sorn.ne) + white_noise_i = Initializer.white_gaussian_noise(mu=0., sigma=0.04, t=Sorn.ni) + else: + white_noise_e, white_noise_i = 0.,0. + + network_state = NetworkState(inputs[:,i]) # Feed input and initialize network state # Buffers to get the resulting x and y vectors at the current time step and update the master matrix - x_buffer, y_buffer = np.zeros((Sorn.ne, 2)), np.zeros((Sorn.ni, 2)) - # TODO: Return te,ti values in next version # UNUSED te_buffer, ti_buffer = np.zeros((Sorn.ne, 1)), np.zeros((Sorn.ni, 1)) # Get the matrices and rename them for ease of reading - Wee, Wei, Wie = matrix_collection.Wee, matrix_collection.Wei, matrix_collection.Wie Te, Ti = matrix_collection.Te, matrix_collection.Ti X, Y = matrix_collection.X, matrix_collection.Y @@ -555,15 +565,12 @@ def run_sorn(self, inp): frac_pos_active_conn.append((Wee[i] > 0.0).sum()) """ Recurrent drive""" - r = network_state.recurrent_drive(Wee[i], Wei[i], Te[i], X[i], Y[i], white_noise_e) """Get excitatory states and inhibitory states given the weights and thresholds""" - # x(t+1), y(t+1) excitatory_state_xt_buffer = network_state.excitatory_network_state(Wee[i], Wei[i], Te[i], X[i], Y[i], white_noise_e) - inhibitory_state_yt_buffer = network_state.inhibitory_network_state(Wie[i], Ti[i], X[i], white_noise_i) """ Update X and Y """ @@ -574,7 +581,6 @@ def run_sorn(self, inp): y_buffer[:, 1] = inhibitory_state_yt_buffer.T """Plasticity phase""" - plasticity = Plasticity() # TODO @@ -615,43 +621,144 @@ def run_sorn(self, inp): return plastic_matrices, X_all, Y_all, R_all, frac_pos_active_conn -class Generator(object): - +class Trainer_(Sorn): + + """Args: + inputs - one hot vector of inputs + + Returns: + matrix_collection - collection of all weight matrices in dictionaries + """ + def __init__(self): + super().__init__() pass + + def train_sorn(self, inputs: np.array=None, phase: str='plasticity', matrices: np.array=None, noise: bool=True,**kwargs): + """[summary] - def get_initial_matrices(self): - - return Plasticity.initialize_plasticity() - -# SAMPLE USAGE - -""" -# Start the Simulation step - -# Used only during linear output layer optimization: During simulation, use input generator from utils - -_inputs = None # Can also simulate the network without inputs else pass the input values here - -# During first batch of training; Pass matrices as None: -# SORN will initialize the matrices based on the configuration settings - -plastic_matrices, X_all, Y_all, R_all, frac_pos_active_conn = RunSorn(phase='Plasticity', matrices=None, - time_steps=10000).run_sorn(_inputs) + Args: + phase (str, optional): [description]. Defaults to 'plasticity'. + matrices (np.array, optional): [description]. Defaults to None. + inputs (np.array, optional): [description]. Defaults to None. + noise (bool, optional): [description]. Defaults to True. -# Pickle the simulaion matrices for reuse + Returns: + [type]: [description] + """ + assert phase == 'plasticity' or 'training',"Phase can be either 'plasticity' or 'training'" + + kwargs_ = ['ne', 'ni', 'network_type_ee', 'network_type_ei', 'network_type_ie', + 'lambda_ee','lambda_ei', 'lambda_ie', + 'eta_stdp','eta_inhib', 'eta_ip', + 'te_max', 'ti_max', 'ti_min', 'te_min', 'mu_ip','sigma_ip'] + for key, value in kwargs.items(): + if key in kwargs_: + setattr(Sorn, key, value) + Sorn.ni=int(0.2 * Sorn.ne) + # assert Sorn.nu == len(inputs[:,0]),"Size mismatch: Input != Nu " + + self.phase = phase + self.matrices = matrices + self.time_steps = 1 + Sorn.time_steps = 1 + self.inputs = np.asarray(inputs) + + # Collect the network activity at all time steps + X_all = [0]*self.time_steps + Y_all = [0]*self.time_steps + R_all = [0]*self.time_steps + + frac_pos_active_conn = [] + + matrix_collection = MatrixCollection(phase = self.phase, matrices = self.matrices) + + for i in range(1): + + if noise: + white_noise_e = Initializer.white_gaussian_noise(mu= 0., sigma = 0.04,t = Sorn.ne) + white_noise_i = Initializer.white_gaussian_noise(mu= 0., sigma = 0.04,t = Sorn.ni) + else: + white_noise_e = 0. + white_noise_i = 0. + + network_state = NetworkState(self.inputs) # Feed Input as an argument to the class + + # Buffers to get the resulting x and y vectors at the current time step and update the master matrix + x_buffer, y_buffer = np.zeros(( Sorn.ne, 2)), np.zeros((Sorn.ni, 2)) + te_buffer, ti_buffer = np.zeros((Sorn.ne, 1)), np.zeros((Sorn.ni, 1)) -with open('stdp2013_10k.pkl', 'wb') as f: - pickle.dump([plastic_matrices, X_all, Y_all, R_all, frac_pos_active_conn], f) + # Get the matrices and rename them for ease of reading + Wee, Wei, Wie = matrix_collection.Wee, matrix_collection.Wei, matrix_collection.Wie + Te, Ti = matrix_collection.Te, matrix_collection.Ti + X, Y = matrix_collection.X, matrix_collection.Y + + """ Fraction of active connections between E-E network""" + frac_pos_active_conn.append((Wee[i] > 0.0).sum()) + + # Recurrent drive at t+1 used to predict the next external stimuli + r = network_state.recurrent_drive(Wee[i], Wei[i], Te[i], X[i], Y[i],white_noise_e = white_noise_e) -# While re simulate the network using any already simulated/ acquired matrices + """Get excitatory states and inhibitory states given the weights and thresholds""" + # x(t+1), y(t+1) + excitatory_state_xt_buffer = network_state.excitatory_network_state(Wee[i], Wei[i], Te[i], X[i], Y[i],white_noise_e = white_noise_e) + inhibitory_state_yt_buffer = network_state.inhibitory_network_state(Wie[i], Ti[i], X[i],white_noise_i = white_noise_i) + + """ Update X and Y """ + x_buffer[:, 0] = X[i][:, 1] # xt -->xt_1 + x_buffer[:, 1] = excitatory_state_xt_buffer.T # x_buffer --> xt + y_buffer[:, 0] = Y[i][:, 1] + y_buffer[:, 1] = inhibitory_state_yt_buffer.T + + if self.phase=='plasticity': + plasticity = Plasticity() + + # STDP + Wee_t = plasticity.stdp(Wee[i],x_buffer,cutoff_weights = (0.0,1.0)) + + # Intrinsic plasticity + Te_t = plasticity.ip(Te[i],x_buffer) + + # Structural plasticity + Wee_t = plasticity.structural_plasticity(Wee_t) + + # iSTDP + Wei_t = plasticity.istdp(Wei[i],x_buffer,y_buffer,cutoff_weights = (0.0,1.0)) + + # Synaptic scaling Wee + Wee_t = Plasticity().ss(Wee_t) + + # Synaptic scaling Wei + Wei_t = Plasticity().ss(Wei_t) + else: + Wee_t, Wei_t, Te_t = Wee[i],Wei[i], Te[i] + + """Assign the matrices to the matrix collections""" + matrix_collection.weight_matrix(Wee_t, Wei_t, Wie[i], i) + matrix_collection.threshold_matrix(Te_t, Ti[i], i) + matrix_collection.network_activity_t(x_buffer, y_buffer, i) + + X_all[i] = x_buffer[:,1] + Y_all[i] = y_buffer[:,1] + R_all[i] = r + + plastic_matrices = {'Wee':matrix_collection.Wee[-1], + 'Wei': matrix_collection.Wei[-1], + 'Wie':matrix_collection.Wie[-1], + 'Te': matrix_collection.Te[-1], 'Ti': matrix_collection.Ti[-1], + 'X': X[-1], 'Y': Y[-1]} + + return plastic_matrices,X_all,Y_all,R_all,frac_pos_active_conn -with open('stdp2013_10k.pkl', 'rb') as f: - plastic_matrices, X_all, Y_all, R_all, frac_pos_active_conn = pickle.load(f) +# global Trainer +# global Simulator +Trainer = Trainer_() +Simulator = Simulator_() +if __name__ == "__main__": + pass + # Instantiate Trainer and Simulator objects while import +# Trainer = Trainer_() +# Simulator = Simulator_() -plastic_matrices1, X_all1, Y_all1, R_all1, frac_pos_active_conn1 = RunSorn(phase='Plasticity', - matrices=plastic_matrices, - time_steps=20000).run_sorn(inp=None) -""" diff --git a/dist/sorn-0.2.10-py3-none-any.whl b/dist/sorn-0.2.10-py3-none-any.whl deleted file mode 100644 index 6732620db96b20bbf70ab314d61bce3275a88836..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20975 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 PcYIPF8{?4SkEj0t*C{M( diff --git a/dist/sorn-0.2.10.tar.gz b/dist/sorn-0.2.10.tar.gz deleted file mode 100644 index ac666a44468ad4fa9f7afe118204a959a7fab142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21561 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 z�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 literal 0 HcmV?d00001 diff --git a/dist/sorn-0.3.1.tar.gz b/dist/sorn-0.3.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..72ec5a351d223acb8a4e53114ab2941fa5b1c36e GIT binary patch literal 23081 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 Lm7pN4A|w3^8E#U8 literal 0 HcmV?d00001 diff --git a/setup.py b/setup.py index e71f2fd..49c1a8a 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ def read(fname): setup( name = "sorn", - version = "0.2.10", + version = "0.3.1", author = "Saranraj Nambusubramaniyan", author_email = "saran_nns@hotmail.com", description ="Self-Organizing Recurrent Neural Networks", diff --git a/sorn.egg-info/PKG-INFO b/sorn.egg-info/PKG-INFO index ab3b77e..2334581 100644 --- a/sorn.egg-info/PKG-INFO +++ b/sorn.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: sorn -Version: 0.2.10 +Version: 0.3.1 Summary: Self-Organizing Recurrent Neural Networks Home-page: https://github.com/Saran-nns/sorn Author: Saranraj Nambusubramaniyan @@ -10,25 +10,20 @@ Description: ## Self-Organizing Recurrent Neural Networks SORN is a class of neuro-inspired artificial network build based on plasticity mechanisms in biological brain and mimic neocortical circuits ability of learning and adaptation through neuroplasticity mechanisms. - For ease of maintanance, example use cases and the API(under developement) are moved to https://github.com/Saran-nns/PySORN_0.1 + The network is developed as part of my Master thesis at Universität Osnabrück, Germany. For the ease of maintainance, the notebooks, use cases and the API(under developement) are moved to https://github.com/Saran-nns/PySORN_0.1 [![Build Status](https://travis-ci.org/Saran-nns/sorn.svg?branch=master)](https://travis-ci.org/Saran-nns/sorn) [![codecov](https://codecov.io/gh/Saran-nns/sorn/branch/master/graph/badge.svg)](https://codecov.io/gh/Saran-nns/sorn) [![Join the chat at https://gitter.im/Self-Organizing-Recurrent-Neural-Networks](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Self-Organizing-Recurrent-Neural-Networks?utm_source=badge&utm_medium=badge&utm_content=badge) [![PyPI version](https://badge.fury.io/py/sorn.svg)](https://badge.fury.io/py/sorn) ![PyPI - Downloads](https://img.shields.io/pypi/dw/sorn.svg) - [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.2593681.svg)](https://doi.org/10.5281/zenodo.2593681) + [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.2590449.svg)](https://doi.org/10.5281/zenodo.2590449) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) -

SORN Reservoir and the evolution of synaptic efficacies

-
+

SORN Reservoir and the evolution of synaptic efficacies

+ -

Neural Connectome

-

- -

- - #### To install the latest release: + ### To install the latest release: ```python pip install sorn @@ -40,17 +35,16 @@ Description: ## Self-Organizing Recurrent Neural Networks pip install git+https://github.com/Saran-nns/sorn ``` - #### Dependencies + ### Dependencies SORN supports Python 3.5+ ONLY. For older Python versions please use the official Python client - #### Usage: - - ##### Update Network configurations - - Navigate to home/conda/envs/ENVNAME/Lib/site-packages/sorn + ### Usage: - or if you are unsure about the directory of sorn + #### Update Network configurations + There are two ways to update/configure the network parameters, + 1. Navigate to home/conda/envs/ENVNAME/Lib/site-packages/sorn + ```or``` if you are unsure about the directory of ```sorn``` Run @@ -61,53 +55,61 @@ Description: ## Self-Organizing Recurrent Neural Networks ``` to find the location of the sorn package - Then, update/edit the configuration.ini + Then, update/edit arguments in ```configuration.ini``` - - ##### Plasticity Phase + 2. Pass the arguments with valid names (listed below). This will override the default values at ```configuration.ini``` + . The allowed ```kwargs``` are, + ```Python + kwargs_ = ['ne', 'nu', 'network_type_ee', 'network_type_ei', 'network_type_ie', 'lambda_ee','lambda_ei', 'lambda_ie', 'eta_stdp','eta_inhib', 'eta_ip', 'te_max', 'ti_max', 'ti_min', 'te_min', 'mu_ip','sigma_ip'] + ``` + #### Simulation: Plasticity Phase + The default ```ne, nu``` values are overriden by passing them while calling the ```simulate_sorn``` method. ```Python # Import - from sorn.sorn import RunSorn + from sorn import Simulator # Sample input - inputs = [0.] + num_features = 10 + time_steps = 200 + inputs = np.random.rand(num_features,timesteps) # To simulate the network; - matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = RunSorn(phase='Plasticity', matrices=None, - time_steps=100).run_sorn(inputs) + matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = Simulator.simulate_sorn(inputs = inputs, phase='Plasticity', matrices=None, noise = True, time_steps=time_steps, ne = 200, nu=num_features) # To resume the simulation, load the matrices_dict from previous simulation; - matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = RunSorn(phase='Plasticity', matrices=matrices_dict, - time_steps=100).run_sorn(inputs) + matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = Simulator.simulate_sorn(inputs = inputs, phase='Plasticity', matrices=matrices_dict, noise= True, time_steps=time_steps,ne = 200, nu=num_features) ``` - ##### Training phase: + #### Training phase: ```Python - matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = RunSorn(phase='Training', matrices=matrices_dict, - time_steps=100).run_sorn(inputs) + inputs = np.random.rand(num_features,1) + + # SORN network is frozen during training phase + matrices_dict, Exc_activity, Inh_activity, Rec_activity, num_active_connections = Trainer.train_sorn(inputs = inputs, phase='Training', matrices=matrices_dict,nu=num_features, time_steps=1) ``` - #### Network Output Descriptions: - matrices_dict - Dictionary of connection weights ('Wee','Wei','Wie') , Excitatory network activity ('X'), Inhibitory network activities('Y'), Threshold values ('Te','Ti') + ### Network Output Descriptions: + ```matrices_dict``` - Dictionary of connection weights ('Wee','Wei','Wie') , Excitatory network activity ('X'), Inhibitory network activities('Y'), Threshold values ('Te','Ti') + + ```Exc_activity``` - Collection of Excitatory network activity of entire simulation period - Exc_activity - Collection of Excitatory network activity of entire simulation period + ```Inh_activity``` - Collection of Inhibitory network activity of entire simulation period - Inh_activitsy - Collection of Inhibitory network activity of entire simulation period + ```Rec_activity``` - Collection of Recurrent network activity of entire simulation period - Rec_activity - Collection of Recurrent network activity of entire simulation period + ```num_active_connections``` - List of number of active connections in the Excitatory pool at each time step - num_active_connections - List of number of active connections in the Excitatory pool at each time step + ### Sample use with OpenAI gym : + #### Cartpole balance problem + Without changing the default network parameters. - #### Sample use with OpenAI gym : - ##### Cartpole balance problem ```python # Imports - import utils.InitHelper as initializer - from sorn.sorn import Sorn, Plasticity, TrainSorn, TrainSornPlasticity + from sorn.sorn import Simulator, Trainer import gym # Load the simulated network matrices @@ -116,7 +118,6 @@ Description: ## Self-Organizing Recurrent Neural Networks with open('simulation_matrices.pkl','rb') as f: sim_matrices,excit_states,inhib_states,recur_states,num_reservoir_conn = pickle.load(f) - # Training parameters NUM_EPISODES = 2e6 @@ -130,21 +131,15 @@ Description: ## Self-Organizing Recurrent Neural Networks state = env.reset()[None,:] # Play the episode - while True: - if EPISODE < NUM_PLASTICITY_EPISODE: # Plasticity phase - sim_matrices,excit_states,inhib_states,recur_states,num_reservoir_conn = TrainSornPlasticity.train_sorn(phase = 'Plasticity', - matrices = sim_matrices, - inputs = state) + sim_matrices,excit_states,inhib_states,recur_states,num_reservoir_conn = Simulator.simulate_sorn(inputs = state, phase ='Plasticity', matrices = sim_matrices, noise=False) else: # Training phase with frozen reservoir connectivity - sim_matrices,excit_states,inhib_states,recur_states,num_reservoir_conn = TrainSorn.train_sorn(phase = 'Training', - matrices = sim_matrices, - inputs = state) + sim_matrices,excit_states,inhib_states,recur_states,num_reservoir_conn = Trainer.train_sorn(inputs = state, phase = 'Training', matrices = sim_matrices, noise= False) # Feed excit_states as input states to your RL algorithm, below goes for simple policy gradient algorithm # Sample policy w.r.t excitatory states and take action in the environment @@ -157,8 +152,7 @@ Description: ## Self-Organizing Recurrent Neural Networks break ``` - - #### Sample Plotting functions + ### Sample Plotting functions ```Python from sorn.utils import Plotter @@ -172,7 +166,7 @@ Description: ## Self-Organizing Recurrent Neural Networks Plotter.raster_plot(spike_train = np.asarray(Exc_activity), savefig=False) ``` - #### Sample Statistical analysis functions + ### Sample Statistical analysis functions ```Python from sorn.utils import Statistics @@ -183,7 +177,7 @@ Description: ## Self-Organizing Recurrent Neural Networks Statistics.fanofactor(spike_train= np.asarray(Exc_activity),neuron = 10,window_size = 10) ``` - #### The network is inspired by folowing articles: + ### The network is inspired by following articles: Lazar, A. (2009). SORN: a Self-organizing Recurrent Neural Network. Frontiers in Computational Neuroscience, 3. https://doi.org/10.3389/neuro.10.023.2009