I’m trying to replace a connection between neuron populations with a Learning Node. I’m hoping to start off with just replacing a basic neuron-to-neuron connection with a nengo.Node
, however I’m getting magnitude mismatches. Do I need to normalize the weights or something?
import nengo
import matplotlib.pyplot as plt
import numpy as np
def base_func(ww):
def f(t, x):
return np.dot(ww, x)
return f
n_neurons = 100
seed = 0
with nengo.Network(seed=seed) as tmp_model:
in_nd = nengo.Node(lambda t: np.sin(10 * t))
pre = nengo.Ensemble(n_neurons, 1, seed=seed)
post = nengo.Ensemble(n_neurons, 1, seed=seed)
nengo.Connection(in_nd, pre)
conn = nengo.Connection(pre, post, solver=nengo.solvers.LstsqL2(weights=True), seed=seed)
p_in = nengo.Probe(pre, synapse=0.01)
p_out = nengo.Probe(post, synapse=0.01)
with nengo.Simulator(tmp_model) as tmp_sim:
tmp_sim.run(2)
plt.plot(tmp_sim.trange(), tmp_sim.data[p_in])
plt.plot(tmp_sim.trange(), tmp_sim.data[p_out])
plt.legend(["in", "out"])
plt.show()
weights = tmp_sim.data[conn].weights
with nengo.Network(seed=seed) as model:
in_nd = nengo.Node(lambda t: np.sin(10 * t))
conn_nd = nengo.Node(base_func(np.linalg.norm(weights)), size_in=n_neurons, size_out=n_neurons)
pre = nengo.Ensemble(n_neurons, 1, seed=seed)
post = nengo.Ensemble(n_neurons, 1, seed=seed)
nengo.Connection(in_nd, pre)
nengo.Connection(pre.neurons, conn_nd)
nengo.Connection(conn_nd, post.neurons)
p_in = nengo.Probe(pre, synapse=0.01)
p_out = nengo.Probe(post, synapse=0.01)
with nengo.Simulator(model) as sim:
sim.run(2)
plt.plot(sim.trange(), sim.data[p_in])
plt.plot(sim.trange(), sim.data[p_out])
plt.legend(["in", "out"])
plt.show()