Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
类脑计算
(section)
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
= 实操部分:Python 模拟 SNN 基本神经元模型 = 纸上得来终觉浅,要真正理解类脑计算的奥妙,动手实验一下简单的模型是非常有帮助的。下面我们通过一个使用 '''Brian2''' 神经网络模拟库的小例子,来演示'''脉冲神经网络中基本神经元模型(LIF模型)的行为'''。Brian2 是一个专门用于模拟SNN的Python库,它允许我们用接近数学方程的形式定义神经元动力学,并进行数值模拟。 在本例中,我们将创建一个'''简单的单神经元模型''':一个''泄漏整流一体化''(Leaky Integrate-and-Fire, LIF)神经元。它具有膜电位变量 <code>v</code>,接收一个恒定输入电流 <code>I</code>。当膜电位超过阈值时,神经元产生脉冲并重置电位。我们运行100毫秒模拟,观察该神经元产生脉冲的时间。 <code># 安装并导入 Brian2(假设环境已安装) from brian2 import * <nowiki>#</nowiki> 定义神经元参数和方程 tau = 10*ms # 膜电位时间常数 Vt = -50*mV # 放电阈值 (阈值电位) Vr = -60*mV # 重置电位 (放电后膜电位重置到此值) El = -60*mV # 静息电位 (漏电平衡电位) <nowiki>#</nowiki> 定义单个LIF神经元的微分方程模型 eqs = <nowiki>'''</nowiki> dv/dt = (El - v + I) / tau : volt (unless refractory) I : volt # 输入电流作为外部驱动 (可看作常数或时变变量) <nowiki>'''</nowiki> <nowiki>#</nowiki> 创建一个包含1个神经元的NeuronGroup G = NeuronGroup(1, eqs, threshold='v > Vt', reset='v = Vr', refractory=5*ms, method='euler') <nowiki>#</nowiki> 初始化参数 G.v = El # 初始膜电位设为静息电位 G.I = 2.0*mV # 输入电流设置为2 mV, 推动膜电位升高 <nowiki>#</nowiki> 设置监视器以记录脉冲发放时间 spike_mon = SpikeMonitor(G) <nowiki>#</nowiki> 运行模拟100毫秒 run(100*ms) <nowiki>#</nowiki> 输出神经元产生脉冲的时间点 print("Spike times:", spike_mon.t[:])</code> '''代码解析:''' 我们定义了LIF模型的微分方程 <code>dv/dt = (El - v + I) / tau</code>,其中膜电位 <code>v</code> 受到漏电项 <code>(El - v)</code> 和输入电流 <code>I</code> 的影响,并具有时间常数 <code>tau</code> 控制变化速度。阈值条件 <code>threshold='v > Vt'</code> 指定了当 <code>v</code> 超过 -50 mV 时神经元放电,执行 <code>reset='v = Vr'</code> 将膜电位重置为 -60 mV,并进入5毫秒的'''不应期'''(refractory)无法再次放电。我们给神经元施加了恒定的微小电流刺激 <code>I = 2 mV</code>,这会缓慢提升膜电位并在大约50ms时触发第一次脉冲,随后重置,再过一段时间可能触发第二次脉冲,等等。 运行上述代码后,<code>SpikeMonitor</code> 将记录神经元放电的时刻并打印出来(例如可能输出类似 <code>Spike times: [50.3 ms, 97.1 ms]</code> 表示该神经元在约50ms和97ms时刻各发放了一次脉冲)。这个简单示例展示了脉冲神经元随时间演化、阈值触发放电的行为机制。读者可以尝试修改输入电流 <code>I</code> 的大小,观察神经元放电频率如何变化:更大的电流驱动将使神经元更快地达到阈值、提高放电频率,反之减小电流则可能使神经元完全不发火。 通过此练习,我们直观理解了SNN中单个神经元的工作原理。基于类似原理,研究者可以构建包含成百上千神经元的网络,并赋予不同连接权重和可塑性规则,去执行更复杂的任务。
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)