braincog.base.node package

Submodules

braincog.base.node.node module

class braincog.base.node.node.BackEINode(threshold=0.5, decay=0.2, act_fun=<class 'braincog.base.strategy.surrogate.BackEIGateGrad'>, th_fun=<class 'braincog.base.strategy.surrogate.EIGrad'>, channel=40, if_back=True, if_ei=True, cfg_backei=2, *args, **kwargs)

基类:BaseNode

BackEINode with self feedback connection and excitatory and inhibitory neurons Reference:https://www.sciencedirect.com/science/article/pii/S0893608022002520 :param threshold: 神经元发放脉冲需要达到的阈值 :param if_back whether to use self feedback :param if_ei whether to use excitotory and inhibitory neurons :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

n_reset()

神经元重置,用于模型接受两个不相关输入之间,重置神经元所有的状态 :return: None

training: bool
class braincog.base.node.node.BaseMCNode(threshold=1.0, v_reset=0.0, comps=[])

基类:Module, ABC

多房室神经元模型的基类 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param comps: 神经元不同房室, 例如[“apical”, “basal”, “soma”]

abstract calc_spike()
forward(inputs: dict)
Params:

inputs dict: Inputs for every compartments of neuron

get_n_fire_rate()
abstract integral(inputs)
n_reset()
set_n_threshold(thresh)
set_n_warm_up(flag)
training: bool
class braincog.base.node.node.BaseNode(threshold=0.5, v_reset=0.0, dt=1.0, step=8, requires_thres_grad=False, sigmoid_thres=False, requires_fp=False, layer_by_layer=False, n_groups=1, *args, **kwargs)

基类:Module, ABC

神经元模型的基类 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param mem_detach: 是否将上一时刻的膜电位在计算图中截断 :param args: 其他的参数 :param kwargs: 其他的参数

abstract calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(inputs)

torch.nn.Module 默认调用的函数,用于计算膜电位的输入和脉冲的输出 在```self.requires_fp is True``` 的情况下,可以使得```self.feature_map```用于记录trace :param inputs: 当前输入的膜电位 :return: 输出的脉冲

get_n_attr(attr)
get_thres()
integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

n_reset()

神经元重置,用于模型接受两个不相关输入之间,重置神经元所有的状态 :return: None

rearrange2node(inputs)
rearrange2op(inputs)
set_n_tau(tau)

动态设置神经元的衰减系数,用于带Leaky的神经元 :param tau: 衰减系数 :return:

set_n_threshold(thresh)

动态设置神经元的阈值 :param thresh: 阈值 :return:

set_n_warm_up(flag)

一些训练策略会在初始的一些epoch,将神经元视作ANN的激活函数训练,此为设置是否使用该方法训练 :param flag: True:神经元变为激活函数, False:不变 :return: None

training: bool
class braincog.base.node.node.BiasLIFNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

带有恒定电流输入Bias的LIF神经元,用于带有抑制性/反馈链接的网络的测试 Noisy Leaky Integrate and Fire 在神经元中注入噪声, 默认的噪声分布为 Beta(log(2), log(6)) :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.BiasPLIFNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

Parametric LIF with bias :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.BiasReLUNode(*args, **kwargs)

基类:BaseNode

用于相同连接的ANN的测试, 会在每个时刻注入恒定电流, 使得神经元更容易激发

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(x)

torch.nn.Module 默认调用的函数,用于计算膜电位的输入和脉冲的输出 在```self.requires_fp is True``` 的情况下,可以使得```self.feature_map```用于记录trace :param inputs: 当前输入的膜电位 :return: 输出的脉冲

training: bool
class braincog.base.node.node.BinaryNode(*args, **kwargs)

基类:BaseNode

用于相同连接的Binary-NN的测试

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(x)

参考```BaseNode``` :param x: :return:

training: bool
class braincog.base.node.node.CTIzhNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:IzhNode

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

spreadMarkPostNeurons()
training: bool
class braincog.base.node.node.DGLIFNode(threshold=0.5, tau=2.0, *args, **kwargs)

基类:BaseNode

Reference: https://arxiv.org/abs/2110.08858 :param threshold: 神经元的脉冲发放阈值 :param tau: 神经元的膜常数, 控制膜电位衰减

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.DoubleSidePLIFNode(threshold=0.5, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:LIFNode

能够输入正负脉冲的 PLIF :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

training: bool
class braincog.base.node.node.HTDGLIFNode(threshold=0.5, tau=2.0, *args, **kwargs)

基类:IFNode

Reference: https://arxiv.org/abs/2110.08858 :param threshold: 神经元的脉冲发放阈值 :param tau: 神经元的膜常数, 控制膜电位衰减

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(inputs)

torch.nn.Module 默认调用的函数,用于计算膜电位的输入和脉冲的输出 在```self.requires_fp is True``` 的情况下,可以使得```self.feature_map```用于记录trace :param inputs: 当前输入的膜电位 :return: 输出的脉冲

training: bool
class braincog.base.node.node.IFNode(threshold=0.5, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

Integrate and Fire Neuron :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.IRNode(*args, **kwargs)

基类:BaseNode

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(x)

参考```BaseNode``` :param x: :return:

training: bool
class braincog.base.node.node.IzhNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

Izhikevich 脉冲神经元 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

d

v’ = 0.04v^2 + 5v + 140 -u + I u’ = a(bv-u) 下面是将Izh离散化的写法 if v>= thresh:

v = c u = u + d

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

n_reset()

神经元重置,用于模型接受两个不相关输入之间,重置神经元所有的状态 :return: None

training: bool
class braincog.base.node.node.IzhNodeMU(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

Izhikevich 脉冲神经元多参数版 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

n_reset()

神经元重置,用于模型接受两个不相关输入之间,重置神经元所有的状态 :return: None

requires_activation()
training: bool
class braincog.base.node.node.LIAFNode(spike_act=BackEIGateGrad(), act_fun='SELU', threshold=0.5, tau=2.0, threshold_related=True, *args, **kwargs)

基类:BaseNode

Leaky Integrate and Analog Fire (LIAF), Reference: https://ieeexplore.ieee.org/abstract/document/9429228 与LIF相同, 但前传的是膜电势, 更新沿用阈值和膜电势 :param act_fun: 前传使用的激活函数 [ReLU, SeLU, LeakyReLU] :param threshold_related: 阈值依赖模式,若为”True”则 self.spike = act_fun(mem-threshold) :note that BaseNode return self.spike, and here self.spike is analog value.

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.LIFNode(threshold=0.5, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.QGateGrad'>, *args, **kwargs)

基类:BaseNode

Leaky Integrate and Fire :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.LIFSTDPNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

用于执行STDP运算时使用的节点 decay的方式是膜电位乘以decay并直接加上输入电流

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

requires_activation()
training: bool
class braincog.base.node.node.NoiseLIFNode(threshold=1, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.GateGrad'>, log_alpha=0.6931471805599453, log_beta=1.791759469228055, *args, **kwargs)

基类:LIFNode

Noisy Leaky Integrate and Fire 在神经元中注入噪声, 默认的噪声分布为 Beta(log(2), log(6)) :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param log_alpha: 控制 beta 分布的参数 a :param log_beta: 控制 beta 分布的参数 b :param args: 其他的参数 :param kwargs: 其他的参数

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.NoisePLIFNode(threshold=1, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.GateGrad'>, *args, **kwargs)

基类:PLIFNode

Noisy Parametric Leaky Integrate and Fire :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.PLIFNode(threshold=1.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

Parametric LIF, 其中的 `tau` 会被backward过程影响 Reference:https://arxiv.org/abs/2007.05785 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param requires_thres_grad: 是否需要计算对于threshold的梯度, 默认为 False :param sigmoid_thres: 是否使用sigmoid约束threshold的范围搭到 [0, 1], 默认为 False :param requires_fp: 是否需要在推理过程中保存feature map, 需要消耗额外的内存和时间, 默认为 False :param layer_by_layer: 是否以一次性计算所有step的输出, 在网络模型较大的情况下, 一般会缩短单次推理的时间, 默认为 False :param n_groups: 在不同的时间步, 是否使用不同的权重, 默认为 1, 即不分组 :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

training: bool
class braincog.base.node.node.ReLUNode(*args, **kwargs)

基类:BaseNode

用于相同连接的ANN的测试

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(x)

参考```BaseNode``` :param x: :return:

training: bool
class braincog.base.node.node.SimHHNode(threshold=50.0, tau=2.0, act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>, *args, **kwargs)

基类:BaseNode

简单版本的HH模型 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param dt: 时间步长 :param step: 仿真步 :param tau: 膜电位时间常数, 用于控制膜电位衰减 :param act_fun: 使用surrogate gradient 对梯度进行近似, 默认为 surrogate.AtanGrad :param args: 其他的参数 :param kwargs: 其他的参数

calc_spike()

通过当前的mem计算是否发放脉冲,并reset :return: None

forward(inputs)

torch.nn.Module 默认调用的函数,用于计算膜电位的输入和脉冲的输出 在```self.requires_fp is True``` 的情况下,可以使得```self.feature_map```用于记录trace :param inputs: 当前输入的膜电位 :return: 输出的脉冲

integral(inputs)

计算由当前inputs对于膜电势的累积 :param inputs: 当前突触输入电流 :type inputs: torch.tensor :return: None

n_reset()

神经元重置,用于模型接受两个不相关输入之间,重置神经元所有的状态 :return: None

requires_activation()
training: bool
class braincog.base.node.node.ThreeCompNode(threshold=1.0, tau=2.0, tau_basal=2.0, tau_apical=2.0, v_reset=0.0, comps=['basal', 'apical', 'soma'], act_fun=<class 'braincog.base.strategy.surrogate.AtanGrad'>)

基类:BaseMCNode

三房室神经元模型 :param threshold: 神经元发放脉冲需要达到的阈值 :param v_reset: 静息电位 :param tau: 胞体膜电位时间常数, 用于控制胞体膜电位衰减 :param tau_basal: 基底树突膜电位时间常数, 用于控制基地树突胞体膜电位衰减 :param tau_apical: 远端树突膜电位时间常数, 用于控制远端树突胞体膜电位衰减 :param comps: 神经元不同房室, 例如[“apical”, “basal”, “soma”] :param act_fun: 脉冲梯度代理函数

calc_spike()
integral(basal_inputs, apical_inputs)
Params:

inputs torch.Tensor: Inputs for basal dendrite

training: bool
class braincog.base.node.node.aEIF(*args, **kwargs)

基类:BaseNode

The adaptive Exponential Integrate-and-Fire model (aEIF) :param args: Other parameters :param kwargs: Other parameters

aEIFNode(v, dt, c_m, g_m, alpha_w, ad, Ieff, Ichem, Igap, tau_ad, beta_ad, vt, vm1)

Calculate the neurons that discharge after the current threshold is reached :param v: Current neuron voltage :param dt: time step :param ad:Adaptive variable :param vv:Spike, if the voltage exceeds the threshold from below

calc_spike(x)

通过当前的mem计算是否发放脉冲,并reset :return: None

training: bool

Module contents