本文主要是介绍Brian2学习笔记二 Introduction to Brian part 2:Synapses,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Brian2学习笔记二 Introduction to Brian part 2 :Synapses
- 1. 前言
- 2. 正文
- 2.1 最简单的突触(The simplest Synapse)
- 2.2 加入权重(Adding a weight)
- 2.3 引入时滞(Introducing a delay)
- 2.4 更复杂的连接(More complex connectivity)
- 2.1 更复杂的突触模型:STDP(More complex synapse models: STDP)
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=10∗ms, 这表示它可以以一个更高的比率重复发放脉冲。神经元Neuron1的变量 I = 0 , t a u = 100 ∗ m s I=0,tau=100*ms I=0,tau=100∗ms 意味着如果没有与它相连的突触,它将永远不会发放脉冲(刺激电流 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=
这篇关于Brian2学习笔记二 Introduction to Brian part 2:Synapses的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!