🎯要点
- CPU和GPU模拟脉冲神经元计算
- 脉冲神经元预测和回归模型
- 拉皮克神经元模型和突触电导神经元模型
- 大规模高速和自定义硬件尖峰神经元模拟系统
- 动态自定义CUDA核神经元模型
- 卷积神经网络脉冲神经元模型
- 脉冲神经元处理器硬件设计
- 稀疏神经元加速器
Python神经元霍奇金-赫胥黎动力学模拟
首先,构建一个由体细胞和树突组成的两室神经元。之后,我们将在其上安装一些仪器来模拟和监测其动态。细胞按定义由两部分组成:胞体和树,我们定义一个 BAS 神经元类。在 Python 中定义任何类的基本样板如下所示:
class BAS:
def __init__(self):
特别是在我们的例子中,每次我们说有一个 BAS 细胞时,我们应该创建体细胞和树突部分:
class BAS:
def __init__(self):
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
任何描述细胞属性的变量都必须作为自身属性存储。这就是我们写 self.soma
而不是 soma
的原因。另一方面,临时变量不需要以 self 为前缀,并且会在初始化函数结束时停止存在。您还会注意到,我们为部分引入了一个新的关键字参数,即单元格属性。这将始终设置为 self(即当前单元格),以允许每个部分知道它属于哪个单元格。
我们可以通过以下方式检查拓扑:
h.topology()
让我们创建第一个细胞:
my_cell = BAS()
让我们设置两个部分的长度和宽度。我们将使胞体的长度和直径为 12.6157 微米,树突的长度为 200 微米,直径为 1 微米。
class BAS:
def __init__(self, gid):
self._gid = gid
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
self.dend.connect(self.soma)
self.soma.L = self.soma.diam = 12.6157 * µm
self.dend.L = 200 * µm
self.dend.diam = 1 * µm
def __repr__(self):
return "BAS[{}]".format(self._gid)
my_cell = BAS(0)
如果您想知道为什么选择这个数字作为体体长度和直径:这是因为它使表面积(不包括端面)约为 500 μm2:
请注意,长度和直径相等的圆柱体的表面积
π
d
ℓ
=
π
d
2
=
4
π
(
d
2
)
2
=
4
π
r
2
\pi d \ell=\pi d^2=4 \pi\left(\frac{d}{2}\right)^2=4 \pi r^2
πdℓ=πd2=4π(2d)2=4πr2
与相同直径的球体的表面积相同。
也就是说,如果我们只对电生理建模感兴趣,我们可以用长度和直径相同的圆柱形体细胞代替直径相同的球形体细胞,就像我们在这里所做的那样。
现在是时候看看细胞是什么样子了:
import matplotlib.pyplot as plt
h.PlotShape(False).plot(plt)
我们的细胞需要膜中的生物物理机制。我们首先设置轴向电阻和膜电容。
class BAS:
def __init__(self, gid):
self._gid = gid
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
self.dend.connect(self.soma)
self.all = self.soma.wholetree() # <-- NEW
self.soma.L = self.soma.diam = 12.6157 * µm
self.dend.L = 200 * µm
self.dend.diam = 1 * µm
for sec in self.all: # <-- NEW
sec.Ra = 100
sec.cm = 1
def __repr__(self):
return "BAS[{}]".format(self._gid)
my_cell = BAS(0)
我们添加了一个新变量 self.all
,它是细胞中所有部分的列表。wholetree
方法返回它所连接的所有部分的列表 - 即相应的神经元。这将帮助我们迭代它们 - 在本例中 - 指定轴向阻力和膜电容,但也可以用于任何其他生物物理学。
让我们将 __init__
分成几个函数:
class BAS:
def __init__(self, gid):
self._gid = gid
self._setup_morphology()
self._setup_biophysics()
def _setup_morphology(self):
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
self.all = [self.soma, self.dend]
self.dend.connect(self.soma)
self.soma.L = self.soma.diam = 12.6157 * µm
self.dend.L = 200 * µm
self.dend.diam = 1
def _setup_biophysics(self):
for sec in self.all:
sec.Ra = 100
sec.cm = 1
def __repr__(self):
return "BAS[{}]".format(self._gid)
my_cell = BAS(0)
我们将霍奇金-赫胥黎动力学放入体细胞中并指定一些参数:
class BAS:
def __init__(self, gid):
self._gid = gid
self._setup_morphology()
self._setup_biophysics()
def _setup_morphology(self):
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
self.dend.connect(self.soma)
self.all = self.soma.wholetree()
self.soma.L = self.soma.diam = 12.6157 * µm
self.dend.L = 200 * µm
self.dend.diam = 1 * µm
def _setup_biophysics(self):
for sec in self.all:
sec.Ra = 100
sec.cm = 1
self.soma.insert("hh")
for seg in self.soma:
seg.hh.gnabar = (
0.12
)
seg.hh.gkbar = (
0.036
)
seg.hh.gl = 0.0003
seg.hh.el = (
-54.3 * mV
)
def __repr__(self):
return "BAS[{}]".format(self._gid)
my_cell = BAS(0)
最后,让我们在树突中插入无源(泄漏)电流:
class BAS:
def __init__(self, gid):
self._gid = gid
self._setup_morphology()
self._setup_biophysics()
def _setup_morphology(self):
self.soma = h.Section(name="soma", cell=self)
self.dend = h.Section(name="dend", cell=self)
self.dend.connect(self.soma)
self.all = self.soma.wholetree()
self.soma.L = self.soma.diam = 12.6157 * µm
self.dend.L = 200 * µm
self.dend.diam = 1 * µm
def _setup_biophysics(self):
for sec in self.all:
sec.Ra = 100
sec.cm = 1
self.soma.insert("hh")
for seg in self.soma:
seg.hh.gnabar = 0.12
seg.hh.gkbar = 0.036
seg.hh.gl = 0.0003
seg.hh.el = -54.3 * mV
self.dend.insert("pas")
for seg in self.dend:
seg.pas.g = 0.001
seg.pas.e = -65 * mV
def __repr__(self):
return "BAS[{}]".format(self._gid)
my_cell = BAS(0)
我们将在模拟开始后 5 毫秒开始向树突的远端 (1) 注入电流脉冲,持续时间为 1 毫秒,幅度为 0.1 nA。首先,我们定义并定位当前的钳位对象。