Brian2学习笔记二 Introduction to Brian part 2:Synapses

本文是Brian2神经网络模拟库的教程,深入讲解突触连接,包括最简单的突触模型、加入权重、时滞效应、复杂连接以及STDP(脉冲时间依赖可塑性)模型。示例代码展示了如何创建和配置这些突触模型,以模拟神经元间的互动。
摘要由CSDN通过智能技术生成

1. 前言

推荐几个CSDN上不错的类似教程:
1、链接: https://blog.csdn.net/u013751642/article/details/80932308.
2、链接: https://blog.csdn.net/lemonade_117/article/details/81145881.
3、链接: https://blog.csdn.net/xiaoqu001/article/details/80422546#_Tutorial_84.
上一篇文章介绍了神经元,在生物中,神经元是通过突触连接的,前向神经元通过突触将电流信息传递给后向神经元,突触的类型又分为电突触和化学突触,不同类型的突触可以改变神经元的发放电状态,这也是神经网络的基础。
那么在本次教程中,我们就主要来介绍突触相关的内容,本文是根据Brian2官网提供的英文教程进行翻译整理总结的。
Brian2的官方安装教程链接:
链接: https://brian2.readthedocs.io/en/stable/introduction/install.html.
官方文档链接及Jupyter notebook学习资料:
链接: https://brian2.readthedocs.io/en/stable/resources/tutorials/2-intro-to-brian-synapses.html.
(注意:本文所有代码运行环境为Anaconda 的 Spyder(python 3.6), 注意运行代码首先要通过如下代码来导入 Brian2的包)
在这里插入图片描述

2. 正文

2.1 最简单的突触(The simplest Synapse)

首先,我们定义了神经元以后,接下来就要通过突触来连接它们,那么,我们将会介绍一个最简单的突触,它在一个脉冲之后会产生变量的瞬时改变,代码如下:

from brian2 import *
start_scope()
eqs = '''
dv/dt = (I-v)/tau : 1
I : 1
tau : second
'''
G = NeuronGroup(2, eqs, threshold='v>1', reset='v = 0', method='exact')
G.I = [2, 0]
G.tau = [10, 100]*ms
# Comment these two lines out to see what happens without Synapses
S = Synapses(G, G, on_pre='v_post += 0.2')
S.connect(i=0, j=1)
M = StateMonitor(G, 'v', record=True)
run(100*ms)
plot(M.t/ms, M.v[0], label='Neuron 0')
plot(M.t/ms, M.v[1], label='Neuron 1')
xlabel('Time (ms)')
ylabel('v')
legend()

运行结果如下:
在这里插入图片描述
在这里我们需要说明以下几点:首先,在本例中,我们再来看NeuronGroup做了什么,它创建了两个神经元,它们用相同的微分方程来表示,但是变量 I I I t a u tau tau 的值不同。神经元Neuron0的变量 I = 2 , t a u = 10 ∗ m s I=2,tau=10*ms I=2,tau=10ms, 这表示它可以以一个更高的比率重复发放脉冲。神经元Neuron1的变量 I = 0 , t a u = 100 ∗ m s I=0,tau=100*ms I=0tau=100ms 意味着如果没有与它相连的突触,它将永远不会发放脉冲(刺激电流 I I I 0 0 0),你可以通过注释掉突触的两行代码来自己验证一下。
接下来,我们定义了突触:Synapses(source,target,…)意味着我们定义了一个从source到target的突触模型。在本例中,source和target相同,都是G。代码中 on_pre=’v_post+=0.2’意味着当一个脉冲在突触前神经元中产生时,它会瞬时使得后一个神经元产生变化, v_post+=0.2 。符号 _post 意味着v的值是指突触后神经元的值,它会增加0.2 。
所以总的来说,该模型的作用就是:G中的两个神经元通过突触连接时,当source神经元发放一个脉冲时,target神经元的v值将增加0.2。然而,前面我们只是定义了突触的模型,还没有真正地创建任何突触。S.connect(i=0,j=1) 则意味着创建了一个从神经元Neuron0到神经元Neuron1的突触连接。

2.2 加入权重(Adding a weight)

在前文中,我们将突触的权重固定为0.2,但是,通常我们期望不同的突触有不同的权重。接下来我们来引入突触方程。
代码如下:

from brian2 import *
start_scope()
eqs = '''
dv/dt = (I-v)/tau : 1
I : 1
tau : second
'''
G = NeuronGroup(3, eqs, threshold='v>1', reset='v = 0', method='exact')
G.I = [2, 0, 0]
G.tau = [10, 100, 100]*ms
# Comment these two lines out to see what happens without Synapses
S = Synapses(G, G, 'w : 1', on_pre='v_post += w')
S.connect(i=0, j=[1, 2])
S.w = 'j*0.2'
M = StateMonitor(G, 'v', record=True)
run(50*ms)
plot(M.t/ms, M.v[0], label='Neuron 0')
plot(M.t/ms, M.v[1], label='Neuron 1')
plot(M.t/ms, M.v[2], label='Neuron 2')
xlabel('Time (ms)')
ylabel('v')
legend()

在这里插入图片描述
这个例子与前面的例子非常相似,但是多了一个突触权重变量w。字符‘w : 1’也是一个方程,它表示为所有的神经元定义了一个无量纲的参数,我们通过on_pre=’v_post += w’来改变脉冲的行为,使得每个突触基于w的不同而不同。为了说明这一点,我们同时创建了第三个神经元,它的行为与第二个神经元完全相同,并将神经元0分别与神经元1和神经元2连接起来。其中,i 指的是source神经元索引,j指的是target神经元索引,我们也通过S.w = ‘j * 0.2’来设置权重,使得从 0 到 1(j=1)的突触连接权重为 0.2=0.2 * 1,从0 到 2(j=2)的突触连接权重为 0.4=0.2 * 2

2.3 引入时滞(Introducing a delay)

到目前为止,突触都是即时发生的,但是我们也可以加入一些时滞的延迟:

from brian2 import *
start_scope()
eqs = '''
dv/dt = (I-v)/tau : 1
I : 1
tau : second
'''
G = NeuronGroup(3, eqs, threshold='v>1', reset='v = 0', method='exact')
G.I = [2, 0, 0]
G.tau = [10, 100, 100]*ms
S = Synapses(G, G, 'w : 1', on_pre='v_post += w')
S.connect(i=0, j=[1, 2])
S.w = 'j*0.2'
S.delay = 'j*2*ms'
M = StateMonitor(G, 'v', record=True)
run(50*ms)
plot(M.t/ms, M.v[0], label='Neuron 0')
plot(M.t/ms, M.v[1], label='Neuron 1')
plot(M.t/ms, M.v[2], label='Neuron 2')
xlabel('Time (ms)')
ylabel('v')
legend()

在这里插入图片描述
通过上面结果图,我们通过添加了一行S.delay = ‘j * 2 * ms’使得突触从0到1(j=1),S.delay = ‘1* 2 * ms’有2ms的延迟,从0到2(j=2) S.delay = ‘2 * 2 * ms’有4ms的延迟。

2.4 更复杂的连接(More complex connectivity)

到目前为止,我们介绍的突触的连接都是明确的,但是对于更大的网络来说,这通常是无法实现的。基于此,我们通常需要指定一些条件。

start_scope()
N = 10
G = NeuronGroup(N, 'v:1')
S = Synapses(G, G)
S.connect(condition='i!=j', p=0.2)

这里我们创建了含有N个仿真的神经元和一个突触仿真的模型。实际上并没有做任何事情,只是用来说明这种连接。
代码行S.connect(condition=’i!j’, p=0.2)表示只有当 i!j 的条件满足时,就会以 p=0.2 的概率将神经元 i 和神经元 j 相连。那么,我们如何才能看到这种连接呢?这里提供了一个小函数可以让我们将这种连接可视化。执行如下代码。


from brian2 import *
prefs.codegen.target = "numpy"  //#use the Python fallback
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值