part 4: topologically structured networks
incorporating structure in networks of point neurons
如果我们使用神经元的生物学详细模型,那么很容易理解和实现拓扑的概念,因为我们已经有树突状乔木,轴突等,它们是神经系统内连接的物理先决条件。 但是,我们仍然可以通过使用点神经元网络来获得一定程度的特异性。
无论是在拓扑结构还是日常意义上,结构都可以被看作是一组规则,用于规定对象的位置以及它们之间的关系。 在点神经元的网络中,我们可以区分三种类型的特异性:
细胞类型特异性 - 那里有什么种类的细胞? 位置特异性 - 细胞在哪里? 投影特异性 - 他们投射哪些细胞,以及如何?在之前的讲义中,我们看到我们可以使用Connect()在网络之间创建确定性或随机选择的连接。 如果我们想创建融合了空间位置和空间连通性配置文件的网络模型,现在是时候转向拓扑模块。 注意:有关拓扑模块使用的完整文档在NEST拓扑用户手册(NTUM)[1]中提供,后者在以下页面中被引用为完整源代码。
the nest.topology module
nest.topology模块允许我们创建具有给定空间组织的节点群体,指定神经元如何连接的连接配置文件,并提供高级连接例程。 因此,我们可以通过设计连接配置文件来创建结构化网络,从而为细胞类型,位置和投影提供所需的特异性。
结构化网络的生成分三步进行,每个步骤将在后面的章节中进行更详细的介绍:
定义图层,在其中我们在网络的一层中分配神经元的布局和类型。
定义连接配置文件,我们在那里生成我们希望我们的连接具有的配置文件。 每个连接字典指定一个连接类的属性,并包含允许我们调整配置文件的参数。 这些与选择目标(掩码和内核)的依赖位置的可能性以及单元类型特异性有关,即层中的哪些类型的单元可以参与连接类(源和目标)。
连接图层,我们在图层之间应用连接字典,等同于群体特异性。 请注意,可以在两个图层之间应用多个字典,就像一个图层可以连接到它自己一样。
辅助,其中我们通过nest.PrintNetwork()或包含在拓扑模块中的可视化功能可视化上述步骤的结果,并查询连接以供进一步分析。
defining layers
用于定义图层的代码遵循以下模板:
import nest.topology as topp
my_layer_dict = {...} # see below for options
my_layer = topp.CreateLayer(my_layer_dict)
其中my_layer_dict将定义图层的元素及其位置。i
填充图层的节点的选择是使用元素键指定的。 目前,我们只关心创建简单图层,其中每个元素来自同质群体。 然后,该字典条目的对应值应该是神经元的模型类型,它可以是NEST集合中的现有模型,或者是我们之前使用CopyModel()定义的模型。
我们接下来必须决定节点是否应该以基于网格或自由(离网)的方式放置,这相当于要求“我们的网络元素能否定期和均匀地放置在2D网络中,或者 我们需要告诉他们他们应该在哪里?“。
1 - On-grid
我们必须明确指定网格的大小和间距,数量或行数m和列数n以及范围(图层大小)。 由此确定网格间距,并且n×m个元素对称排列。 请注意,我们也可以为网格指定一个中心,否则默认偏移量就是原点。
以下片段产生图A:
layer_dict_ex = {"extent" : [2.,2.], # the size of the layer in mm
"rows" : 10, # the number of rows in this layer ...
"columns" : 10, # ... and the number of columns
"elements" : "iaf_psc_alpha"} # the element at each (x,y) coordinate in the grid
2 - Off grid
我们只定义元素,它们的位置和范围。 创建的元素的数量等于位置列表的长度。 这个选项允许我们分配神经元的方式有更多的灵活性。 请注意,我们还应该指定范围,如果这些头寸超出了默认值(范围大小= [1,1]和原点为中心)。 有关更多详细信息,请参见NUTM中的第2.2节。
以下片段产生图B:
import numpy as np
# grid with jitter
jit = 0.03
xs = np.arange(-0.5,.501,0.1)
poss = [[x,y] for y in xs for x in xs]
poss = [[p[0]+np.random.uniform(-jit,jit),p[1]+np.random.uniform(-jit,jit)] for p in poss]
layer_dict_ex = {"positions": poss,
"extent" : [1.1,1.1],
"elements" : "iaf_psc_alpha"}
注意:拓扑模块确实支持3D图层,但这不在本讲义范围内。
以下是可以使用的所有参数以及它们主要用于基于网格还是空闲层的概述:
Advanced
复合图层也可以创建。 此图层类型扩展了基于网格的图层,并允许我们在每个网格位置定义大量神经元和其他元素,例如poisson_generators。 NTUM的第2.5节提供了完整的解释。 这种方法的优点是,如果我们想要一个图层,其中每个元素或子网络具有相同的组件组成,那么定义一个具有这些属性的图层非常容易。 举一个简单的例子,我们考虑一个元素的网格,其中每个元素包含4个锥体细胞,1个中间神经元,1个泊松生成器和1个噪声发生器。 相应的代码是:
nest.CopyModel("iaf_psc_alpha","pyr")
nest.CopyModel("iaf_psc_alpha","inh", {"V_th": -52.})
comp_layer = topp.CreateLayer({"rows":5,"columns":5,
"elements": ["pyr",4,"inh","poisson_generator","noise_generator"]})
defining connection profiles
为了定义我们想要的神经元群体之间的连接类型,我们指定了一个连接字典。
任何连接字典的唯一两个必需参数是connection_type和mask。 所有其他人都允许我们通过调整连接的可能性,突触类型,与连接相关的权重和/或延迟,或连接数量来调整我们的连接配置文件,并指定可以参与的单元类型的限制 连接类。
NTUM的第3章全面讨论了所有不同的可能性,建议您在那里了解不同的约束条件,并阅读其中列出的不同示例。 以下是设置连接配置文件的一些代表性示例,下表列出了可以使用的参数。
# Circular mask, gaussian kernel.
conn1 = { "connection_type":"divergent",
"mask": {"circular":{"radius":0.75}},
"kernel": {"gaussian":{"p_center":1.,"sigma":0.2}},
"allow_autapses":False
}
# Rectangular mask, constant kernel, non-centered anchor
conn2 = { "connection_type":"divergent",
"mask": {"rectangular":{"lower_left":[-0.5,-0.5],"upper_right":[0.5,0.5]},
"anchor": [0.5,0.5],
},
"kernel": 0.75,
"allow_autapses":False
}
# Donut mask, linear kernel that decreases with distance
# Commented out line would allow connection to target the pyr neurons (useful for composite layers)
conn3 = { "connection_type": "divergent",
"mask": {"doughnut":{"inner_radius":0.1,"outer_radius":0.95}},
"kernel": {"linear": {"c":1.,"a":-0.8}},
#"targets":"pyr"
}
# Rectangular mask, fixed number of connections, gaussian weights, linear delays
conn4 = { "connection_type":"divergent",
"mask": {"rectangular":{"lower_left":[-0.5,-0.5],"upper_right":[0.5,0.5]}},
"number_of_connections": 40,
"weights": {"gaussian":{"p_center":J,"sigma":0.25}},
"delays" : {"linear" :{"c":0.1,"a":0.2}},
"allow_autapses":False
}
connecting layers
连接图层是最简单的步骤:定义了源图层,目标图层和连接字典,我们只需使用函数topp.ConnectLayers():
ex_layer = topp.CreateLayer({"rows":5,"columns":5,"elements":"iaf_psc_alpha"})
in_layer = topp.CreateLayer({"rows":4,"columns":4,"elements":"iaf_psc_alpha"})
conn_dict_ex = {"connection_type":"divergent","mask":{"circular":{"radius":0.5}}}
# And now we connect E->I
topp.ConnectLayers(ex_layer,in_layer,conn_dict_ex)
请注意,我们可以定义多个字典,多次使用相同的字典并连接到同一个图层:
# Extending the code from above ... we add a conndict for inhibitory neurons
conn_dict_in = {"connection_type":"divergent",
"mask":{"circular":{"radius":0.75}},"weights":-4.}
# And finish connecting the rest of the layers:
topp.ConnectLayers(ex_layer,ex_layer,conn_dict_ex) # Connect E->E
topp.ConnectLayers(in_layer,in_layer,conn_dict_in) # Connect I->I
topp.ConnectLayers(in_layer,ex_layer,conn_dict_in) # Connect I->E
visualising and querying the network structure
有两种主要方法可用于检查我们的网络是否正确构建:
以文本形式打印网络中的所有神经元和子网。 这是检查复合图层层次结构的好方法;
有三种功能可以结合使用:
这使我们能够生成与NUTM和本讲义一起使用的情节。 有关更多详细信息,请参阅NTUM的4.2节。
除了已经在NTUM 4.1节中列出的功能之外,其他有用的功能可能有所帮助: