1

我正在尝试在 NEST 中开发一个简单的代码:一个由 10 个相同的神经元组成的网络,它们之间连接以形成一个循环。我想使用数组来开发此代码,但我收到了与参数类型不匹配相关的错误消息。下面我复制我的代码:

# SIMPLE NET -- FIRST TRIAL
# First example of a net made by 10 exicitatory neurons
# modeled by IAF models, which are connected in a loop
# and each neuron receives a synaptic current of double
# exponential type with rise and decay times respectively
# of 0.5 s. and 3 s.

###############################################################################
# Import the necessary modules

import pylab
import nest
import nest.raster_plot
import nest.voltage_trace
import numpy as np

###############################################################################
# Create the NODES
nest.SetDefaults("iaf_psc_alpha",
{"C_m": 10.0,
"tau_m": 15.58,
"t_ref": 2.0,
"E_L": -65.0,
"V_th": -40.0,
"V_reset": -65.0})

neurons  = nest.Create("iaf_psc_alpha",10)

###############################################################################
# SYNAPTIC CURRENTS NODES
exc   = 0.5
ini   = 3.0
Istim = 0.0
Istim1 = 20.0

nest.SetStatus(neurons[:1],  {"tau_syn_ex": exc, "tau_syn_in": ini, "I_e": Istim1})
nest.SetStatus(neurons[1:],  {"tau_syn_ex": exc, "tau_syn_in": ini, "I_e": Istim})

###############################################################################
# OUTPUT DEVICE
voltmeter1 = nest.Create("voltmeter")
nest.Connect(voltmeter1, neurons[1])

voltmeter2 = nest.Create("voltmeter")
nest.Connect(voltmeter2, neurons[2])

voltmeter3 = nest.Create("voltmeter")
nest.Connect(voltmeter3, neurons[3])

spikes = nest.Create('spike_detector')
###############################################################################
# EXCITATORY CONNECTION BETWEEN NODES in a LOOP
weight = 200.0
delay  = 1.0

#'excitatory',

for i in range(1,9,1):
 nest.Connect(neurons[i], neurons[i+1], syn_spec={'weight': weight, 'delay': delay})
 
 nest.Connect(neurons[10], neurons[1], syn_spec={'weight': weight, 'delay': delay})

###############################################################################
# SPIKE DETECTOR
nest.Connect(neurons,  spikes)

###############################################################################
#SIMULATIONS AND OUTPUTS
nest.Simulate(400.0)

nest.voltage_trace.from_device(voltmeter1)
nest.voltage_trace.from_device(voltmeter2)
nest.voltage_trace.from_device(voltmeter3)
nest.voltage_trace.show()

nest.raster_plot.from_device(spikes, hist=True)
nest.raster_plot.show()
4

1 回答 1

2

在 Python 中,数组从零开始索引,因此创建的十个神经元是neurons[0]to neurons[9]。要关闭环,您需要将最后一个神经元连接neurons[9]到第一个neurons[0]neurons[10]不存在。

另请注意,您关闭了 9 次环,因为第二个Connect()调用也是缩进的,因此在for循环内。

如果您使用另一个 Python 功能,即从后面计算负索引,那么您的循环将变得非常简单。尝试这样的事情:

for i in range(10):
    print(f"connect {(i-1)%10} -> {i}")
    nest.Connect([neurons[i-1]], [neurons[i]], syn_spec={'weight': weight, 'delay': delay})

(你当然可以省略print()调用。我只是添加它来显示发生了什么。)

如您所见,这会自动关闭您的铃声,您不需要额外的Connect()通话。在 Python 列表和 numpy 数组中,约定是数组neurons[-1]的最后一个元素,是最后一个元素neurons[-2]之前的元素,等等。很好的效果是你可以看到10无处不在,并且很容易用神经元数量的变量替换。也不再需要制作range()如此复杂的东西。

附加说明:对于长环,进行数组切片可能要快得多:

nest.Connect(neurons[:-1], neurons[1:], syn_spec={'weight': weight, 'delay': delay})
nest.Connect([neurons[-1]], [neurons[0]], syn_spec={'weight': weight, 'delay': delay})

在这个变体中,您只需要两个连接调用(没有 Pythonfor循环!),因此大多数连接可以由 NEST 内核生成,而无需在每个突触之后将控制权返回给 Python。通常,调用越少,内核就可以更好地利用并行化。

于 2021-02-07T12:44:16.793 回答