在SNN中,脉冲神经网络有很多的神经元类型,包括HH、LIF和izhikevich等,所以在我的设计中,我希望所有的神经元都继承于一个Neuron的总类,这样在创建和使用时比较方便。
但是存在的一个问题就是这些神经元的超参数相同,在创建的过程中,我暂时不清楚用什么方法完成。比如在LIF神经元中,其更新方程为
-
膜电位更新(Membrane potential update):
dv/dt = (-(v - E_leak) + I_syn) / tau_m其中:
- dv/dt 是膜电位v随时间的变化率;
- v 是膜电位;
- E_leak 是静息电位(Leakage potential),表示神经元在静息状态下的膜电位;
- I_syn 是突触输入电流,表示由其他神经元传递过来的突触输入;
- tau_m 是膜时间常数(Membrane time constant),表示膜电位衰减的速度。
-
阈值触发(Firing threshold condition):
if v >= V_threshold:
v = V_reset
发放一个脉冲(Fire a spike)其中:
- V_threshold 是火灵阈值(Firing threshold),当膜电位超过该阈值时,神经元会发放一个脉冲;
- V_reset 是重置电位(Reset potential),表示神经元在发放脉冲后膜电位被重置的值。
tau_m 是膜时间常数(Membrane time constant),表示膜电位衰减的速度。
而在izhikevich神经元中,其更新方程为:
-
膜电位更新(Membrane potential update):
dv/dt = 0.04v^2 + 5v + 140 - u + I其中:
- dv/dt 是膜电位v随时间的变化率;
- v 是膜电位;
- u 是恢复变量,表示膜电位的恢复程度;
- I 是突触输入电流,表示由其他神经元传递过来的突触输入。
-
恢复变量更新(Recovery variable update):
du/dt = a(bv - u)其中:
- du/dt 是恢复变量u随时间的变化率;
- a 和 b 是模型参数,控制恢复变量的变化速度和幅度。
-
阈值触发(Firing threshold condition):
if v >= 30:
v = c
u = u + d其中:
- 30 是点火阈值,当膜电位超过该阈值时,神经元会发放一个脉冲;
- c 是脉冲时的膜电位重置值;
- d 是脉冲时的恢复变量增量。:
明显可以看到三种神经元虽然有着相同的放电机制,但是其内部方程的参数完全不同,至于HH神经元,我觉得他太过于复杂,所以本文不再讨论。我计划设计成如何格式的代码,所有的神经元都继承于Neuron。
这篇文章应该昨天发的,但是因为电脑死机了,突然数据没保留,所及今天补发