# Setup state and spike monitor: state_mon = StateMonitor(neuron, ['u'], record=True) spike_mon = SpikeMonitor(neuron) # Add neurons to the net: net.add([neuron, state_mon, spike_mon]) # Set simulation time and run the model: #defaultclock.dt = 0.01*ms t_sim = 5000 * ms net.run(t_sim) # Store the values: t_ = state_mon.t u_ = state_mon.u s_ = spike_mon.spike_trains() # Calculate frequencies from the simulation: f_experiment = [] for i in range(len(I_values)): f_experiment.append(1 / np.mean(np.diff(s_[i]))) f_experiment = np.array(f_experiment) f_experiment = f_experiment np.nan_to_num(f_experiment, copy=False) # Calculate theoretical frequencies (Equation from task 1a): f_theory = (-tau * np.log((u_thresh - u_rest - I_values * Rm) / (u_reset - u_rest - I_values * Rm)) + t_ref)**-1 f_theory = f_theory / Hz np.nan_to_num(f_theory, copy=False)
spikeinitial_t = array(spikemon.t) spikeinitial_out = array(spikemonout.i) spikeinitial_out_t = array(spikemonout.t) initial = 0 for pattern in range(N2): P = error(spikemonout, sd[:, pattern], pattern, so[:, pattern]) if P > 0.95: spikefinal_out = array(spikemonout.i) spikefinal_out_t = array(spikemonout.t) P_total[pattern, testindex] = P for i in range(N): spike_input = spikemon.spike_trains() si[:, pattern] = np.zeros(int(Tmax / dt) + 1) for ti in spike_input[i]: si[int(float(ti) * 1000 / 0.1), pattern] = 1 spike_trains_out = spikemonout.spike_trains() so = np.zeros((int(Tmax / dt) + 1, N2)) for ti in spike_trains_out[pattern]: so[int(float(ti) * 1000 / 0.1), pattern] = 1 conv = convolve(A * si[:, pattern], Tw) #junky=lr*(sd[:,pattern]-so[:,pattern]) junky2 = (sd[:, pattern] - so[:, pattern]) * conv dwdt[i, pattern] = sum( (1.0 / N) * (lr * (sd[:, pattern] - so[:, pattern]) + (sd[:, pattern] - so[:, pattern]) * conv))
# plots fig, axes = plt.subplots(3, figsize=(6, 8), sharex=True) # raster plot axes[0].plot(spike_monitor_exc.t / ms, spike_monitor_exc.i, ".k", ms=1) axes[0].plot(spike_monitor_inh.t / ms, spike_monitor_inh.i + len(exc_neurons), ".k", ms=1) axes[0].set_ylabel("Neuron No.") axes[0].set_ylim(0, len(exc_neurons) + len(inh_neurons)) # network activity net_activity = np.histogram( np.concatenate( list(spike_monitor_exc.spike_trains().values()) + list(spike_monitor_inh.spike_trains().values())) / ms, bins=np.arange(burnin, duration + burnin, 1))[0] / (len(exc_neurons) + len(inh_neurons)) axes[1].plot(np.arange(0, len(net_activity)) + burnin, net_activity, "k") net_activity_min = 0 net_activity_max = 0.2 axes[1].set_ylim(net_activity_min, net_activity_max) axes[1].set_ylabel("Net activity") # network activity inset axins = axes[1].inset_axes([0.05, 0.35, 0.2, 0.6]) axins.plot(np.arange(0, len(net_activity)) + burnin, net_activity, "k") inset_min = 1220 inset_max = 1260 axins.set_xlim(inset_min + burnin, inset_max + burnin)
spikeinitial_out = array(spikemonout.i) spikeinitial_out_t = array(spikemonout.t) initial = 0 for pattern in range(N2): P = error(spikemonout, sd[:, pattern], pattern, so[:, pattern]) if P > 0.95: spikefinal_out = array(spikemonout.i) spikefinal_out_t = array(spikemonout.t) P_total[pattern, testindex] = P #input spikes into bit stream for i in range(NH): spike_hidden = spikemonhidden.spike_trains() sh = np.zeros((int(Tmax / dt) + 1, N2)) for ti in spike_hidden[i]: sh[int(float(ti) * 1000 / 0.1), pattern] = 1 spike_trains_out = spikemonout.spike_trains() so = np.zeros((int(Tmax / dt) + 1, N2)) for ti in spike_trains_out[pattern]: so[int(float(ti) * 1000 / 0.1), pattern] = 1 conv = convolve(A * sh[:, pattern], Tw) dwdt[i, pattern] = sum( (1.0 / NH) * (lr * (sd[:, pattern] - so[:, pattern]) + (sd[:, pattern] - so[:, pattern]) * conv)) S.w[i, pattern] = S.w[i, pattern] + dwdt[i, pattern]