API接口及数据集定义#

主要LIF/LIFPlus模块位置:

  • ./bidlcls/models/layers/lif.py

  • ./bidlcls/models/layers/lifplus.py

此LIF/LIFPlus模块主要提供了一个继承自torch.nn.Module的元模型Lif类,和按照维度1d和2d划分的不同的类,并通过可迭代时间轴的It类进行了包装。

神经元模型#

  • Lif/LifPlus

    • 1d 处理一维数据

      • 带有全连接型突触的泄漏积分发放模型FcLif/FcLifPlus

      • 泄漏积分发放模型Lif1d/LifPlus1d

    • 2d 处理二维数据

      • 带有卷积型突触的泄漏积分发放模型Conv2dLif/Conv2dLifPlus

      • 泄漏积分发放模型Lif2d/LifPlus2d

  • It,即Iteration,用于带有多时间步循环的LIF,用于实现内循环版本

    • FcLifIt/FcLifPlusIt

    • Conv2dLifIt/Conv2dLifPlusIt

基础神经元模型——Lif/LifPlus#

继承自torch.nn.Module,该类中的forward方法实现了LIF/LIFPlus神经元计算的完整过程。

该类描述的是LIF/LIFPlus中最基础,最典型的算子公式,该类的方法主要被后续介绍的类所继承使用。

Lif/LifPlus的初始化参数/可调整的参数参见下表。

表 Lif的初始化参数/可调整的参数

参数

含义

norm

BatchNorm对象,callable类型。

mode

期望的输出类型。

【数据类型】STR类型,有两种类型。

【取值范围】

  • spike:对应LIF模型,期望输出{0,1}脉冲信号;

  • analog:对应LIAF模型,期望输出模拟信号。

memb_mode

膜电位相关参数。

【数据类型】tuple

具体说明参见 memb_mode

soma_params

神经元胞体的关键参数。

【数据类型】Dict

具体说明参见 soma_params(Lif)

noise

噪声,float类型。

ON_APU

芯片推理标志,表示是否在KA200芯片上进行推理。

【数据类型】bool类型

【取值类型】

  • True:在KA200上进行推理;

  • False:在Nvidia GPU上进行推理。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

表 LifPlus的初始化参数/可调整的参数

参数

含义

norm

BatchNorm对象,callable类型。

mode

期望的输出类型。

【数据类型】STR类型,有两种类型。

【取值范围】

  • spike:对应LIF模型,期望输出{0,1}脉冲信号;

  • analog:对应LIAF模型,期望输出模拟信号。

memb_mode

膜电位相关参数。

【数据类型】tuple

具体说明参见 memb_mode

soma_params

神经元胞体的关键参数。

【数据类型】Dict

具体说明参见:soma_params(Lif)

input_accm

输入脉冲累积相关参数。

【数据类型】int

【取值类型】

  • 0:CUB(电流累积);

  • 1:COBE(指数函数型电导累积);

  • 2:COBA(阿尔法函数型电导累积)。

rev_volt

输入脉冲累积相关参数。

【数据类型】bool

【取值类型】

  • True:with REV(设置反转电压);

  • False:without REV(不设置反转电压)。

fire_refrac

不应期相关参数。

【数据类型】int

【取值类型】

  • 0:no refractory(不设置);

  • 1:AR(绝对不应期)。

spike_init

脉冲触发相关参数。

【数据类型】int

【取值类型】

  • 0:naïve(同LIF);

  • 1:EXI(指数尖峰启动);

  • 2:QDI(二次尖峰启动)。

trig_current

脉冲触发电流相关参数。

【数据类型】int

【取值类型】

  • 0:naïve(同LIF);

  • 1:ADT(适应);

  • 2:SBT(亚阈值震荡)。

memb_decay

膜衰减相关参数。

【数据类型】int

【取值类型】

  • 0:naïve(同LIF);

  • 1:EXD(指数衰减)。

noise

噪声,float类型。

ON_APU

芯片推理标志,表示是否在KA200芯片上进行推理。

【数据类型】bool类型

【取值类型】

  • True:在KA200上进行推理;

  • False:在Nvidia GPU上进行推理。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

memb_mode#

memb_mode表示膜电位相关参数。数据类型为tuple,其中包含2个元素:

参数

含义

第一个 元素

表示在LIF或LIAF模型中,膜电位从上一个信号输入开始,所经历 的4种不同状态,包括:接受刺激后膜电位;减去发放阈值后膜电 位;重置后膜电位;泄漏后膜电位。这4种状态分别对应LIF或 LIAF模型期望取到的不同膜电位状态。

【数据类型】int类型

【取值范围】

  • 0:input后膜电位;

  • 1:减去发放阈值之后膜电位;

  • 2:重置膜电位后的膜电位;

  • 3:泄漏之后膜电位。

第二个 元素

对第一个元素取到的膜电位设定的激活函数类型。

【数据类型】callable类型

【配置说明】该激活函数的作用是将模型中所传递的脉冲信号 {0,1},通过activation function转化为模拟信号, 如torch.relu、torch.sigmoid或torch.tanh等,如果 值为None就是不加激活函数。此元素只在mode取analog时才有效。

soma_params(Lif)#

soma_params表示神经元胞体的关键参数。

【默认参数】

SOMA_PARAMS = {
   'alpha': .3,
   'beta': 0.,
   'theta': .5,
   'v_0': 0.,
   'shape': [],
   'learn': False
}

【参数说明】

参数

含义

alpha

beta

theta

v_0

胞体参数,用于计算在脉冲发放前后的不同状态中胞体膜电位值。

【数据类型】float类型

【配置说明】

  • alpha:乘性泄漏。

  • beta:加性泄漏。

  • theta:门限。

  • v_0:重置膜电位。

shape

用于说明胞体参数的共享程度。

【数据类型】list类型

【取值范围】

根据shape的形状来确定是所有神经元共享一套参数,还是每个通 道一个单独的参数:

  • 如果 shape[] ,即空list,则表示所有的神经元 共享一套参数,对应配置文件中的 soma_params 的值为 all_share

  • 如果是每个通道一个单独的参数,假设通道数为c,则对于全连 接版本, shape 需要设置为 [1,c] ,对于卷积版本, shape需要设置为 [1, c, 1,1] ,对应配置文件中的 soma_params 的值为 channel_share

【配置说明】

在配置文件中设置 soma_params 值的方法参见 配置文件内容

learn

是否通过学习而得到胞体的关键参数。

【数据类型】bool类型

【取值范围】False,True

  • False:即固定参数(不通过学习得到相关参数)。

  • True:即通过所有层一并学习更新相关参数。

【默认取值】False

【配置说明】目前暂不支持配置修改。

soma_params (LifPlus)#

soma_params表示神经元胞体的关键参数。

【默认参数】

SOMA_PARAMS = {
   'epsilon': None,
   'v_g': None,
   'tau_recip': None,
   'v_0': 0.,
   'epsilon_r': None,
   'v_rr': None,
   'v_ar': None,
   'q_r': None,
   'b': None,
   'epsilon_w': None,
   'theta': .5,
   'v_theta': None,
   'delta_t': None,
   'v_c': None,
   'a': None,
   'v_w': None,
   'alpha': .3,
   'beta': 0.,
   'v_leak': None,
   'shape': [],
   'learn': False,
}

【参数说明】

参数

含义

epsilon

v_g

tau_recip

v_0

epsilon_r

v_rr

v_ar

q_r

b

epsilon_w

theta

v_theta

delta_t

v_c

a

v_w

alpha

beta

v_leak

胞体参数,用于计算在脉冲发放前后的不同状态中胞体膜电位值。

【数据类型】float类型

【配置说明】

  • epsilon: 电导衰减常数。

  • v_g: 反向电压常数。

  • tau_recip: ∆𝑡/𝜏(∆𝑡代表采样时间间隔,𝜏为神经元时间因子)。

  • v_0: 重置膜电位。

  • epsilon_r: 相对不应期衰减常数。

  • v_rr: 相对不应期反转电压。

  • v_ar: 适应性反转电压。

  • q_r: 相对不应期的跳变尺寸。

  • b: 脉冲触发的跳跃大小。

  • epsilon_w: 适应性衰减常数。

  • theta:门限。

  • v_theta: 触发电压。

  • delta_t: 锐度因子。

  • v_c: 临界电压。

  • a: 亚阈值耦合常。

  • v_w: 耦合膜电位偏置常量。

  • alpha:乘性泄漏。

  • beta:加性泄漏。

  • v_leak: 线性延时常数。

shape

用于说明胞体参数的共享程度。

【数据类型】list类型

【取值范围】

根据shape的形状来确定是所有神经元共享一套参数,还是每个 通道一个单独的参数:

  • 如果shape是[],即空list,则表示所有的神经元共享一套参 数,对应配置文件中的 soma_params 的值为 all_share

  • 如果是每个通道一个单独的参数,假设通道数为c,则对于全 连接版本, shape 需要设置为 [1,c] ,对于卷积版 本, shape 需要设置为 [1, c, 1,1] ,对应配置文 件中的 soma_params 的值为 channel_share

【配置说明】

在配置文件中设置 soma_params 值的方法 参见 配置文件内容

learn

是否通过学习而得到胞体的关键参数。

【数据类型】bool类型

【取值范围】False,True

  • False:即固定参数(不通过学习得到相关参数)。

  • True:即通过所有层一并学习更新相关参数。

【默认取值】False

【配置说明】目前暂不支持配置修改。

Lif/LifPlus中的硬件加速函数#

Lif中包含了两个硬件加速函数,这两个函数在灵汐芯片上可以快速执行,定义如下:

  1. cmpandfire:比较并发放函数,定义为:

    \[y(i)\ = \ 1\ if\ x(i)\ > \ theta,\ otherwise\ 0\]

    其中x,y为Tensor,th为标量,i代表任意一个Tensor中的元素的角标。

  2. resetwithdecay:发放后复位及泄漏计算函数,用于计算发放后的复位过程及泄漏 过程,定义为:

    \[y(i) = \ alpha\ *\ v\_ 0\ + \ beta\ if\ x(i)\ > \ theta,otherwise\ alpha\ *\ x(i)\ + \ beta\]

    其中x, y为tensor,th,decay,reset三个为标量。

这两个函数是采用Pytorch自定义层表示并传达给芯片的编译器的(但不是真正的灵汐芯片执行的描述),他们也可用于Lif/LifPlus之外的其他层的描述中。

Lif/Lifplus中的状态存取描述#

由于Lyngor编译器只编译单时间拍的计算逻辑,默认逻辑是计算完毕本时间拍的内容后,所有变量生存周期结束,不再保存。而对于神经元而言,一些状态信息在下一拍还需要继续使用,例如膜电位,突触后电流等。因此需要一些辅助的代码用于标记哪些变量是需要被静态存储的,以及本次计算中哪些变量是需要从静态存储中读取并使用的。因此构建如下约定:

对于状态信息v(如膜电位),在本拍第一次使用之前,即第一次v出现在计算等式右侧之前,需要加入:

load(v, ‘v_string’)

其中v表示状态变量的变量名字, v_string 是一个全局唯一的字符串标识,可任意指派一个字符串标识它,目前采用UUID产生,但同一个变量的 v_string 必须是一个。

通常,可以将一系列状态变量的load操作统一放在神经元模型描述的最开始。

类似的,对于状态信息v,在本拍最后一次被更新后,即最后一次出现在计算等式左边之后,需要加入:

save(v, ‘v_string’)

通常,可以将一系列状态变量的save操作统一放在神经元模型描述的最后。

注意

对于一个状态变量,load/save需要配对使用。

含有全连接型突触的一维数据处理模型#

FcLif#

继承自 torch.nn.Module ,FcLif1d是基于Lif实现的,在 init 方法中对Lif中所涉及的参数赋予了初始值。在使用时只能处理单个时间步的输入。

FcLif层的初始化参数/可调整的参数参见下表。

表 FcLif层结构参数说明

参数

含义

input_channel

输入层通道数,int类型。

hidden_channel

隐层或输出层通道数,int类型。

feed_back

是否使用回环结构链接隐层与隐层,bool类型,默认为 False

norm_state

是否使用BatchNorm进行归一化处理防止梯度爆炸,bool 类型,默认为 False

mode

memb_mode

soma_params

noise

具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初始化 参数/可调整的参数】。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

it_batch

【数据类型】int类型

内循环模式的 batch_size ,在APU推理时请使用 1 ,训练时可自行定义

FcLifPlus#

继承自 torch.nn.Module ,FcLifPlus1d是基于LifPlus实现的,在 init 方法中对LifPlus中所涉及的参数赋予了初始值。在使用时只能处理单个时间步的输入。

FcLifPlus层的初始化参数/可调整的参数参见下表。

表 FcLif层结构参数说明

参数

含义

input_channel

输入层通道数,int类型。

hidden_channel

隐层或输出层通道数,int类型。

feed_back

是否使用回环结构链接隐层与隐层,bool类型,默认为 False

norm_state

是否使用BatchNorm进行归一化处理防止梯度爆炸, bool类型,默认为 False

mode

memb_mode

soma_params

noise

input_accum

rev_volt

fire_refrac

spike_init

trig_current

memb_decay

具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初始化 参数/可调整的参数】。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

it_batch

【数据类型】int类型

内循环模式的 batch_size ,在APU推理时请使用 1 ,训练时可自行定义

FcLifIt/FcLifPlusIt#

通过可迭代时间轴的It类对FcLif类进行了包装,在 forward 方法中,支持对多个时间步进行循环处理。

Lif1d/LifPlus1d#

与FcLif/FcLifPlus类似,只是没有投影,也即没有nn.Linear层,因此不需要input_channel、hidden_channel和feed_back这三个参数。

含有卷积型突触二维数据处理模型#

Conv2dLif#

继承自 torch.nn.Module ,在 init 方法中对Lif中所涉及的参数赋予了初始值, forward 方法与FcLif完全一致。在使用时只能处理单个时间步的输入。

ConvLif2d层的初始化参数/可调整的参数参见下表。

表 Conv2dLif层结构参数说明

参数

含义

input_channel

输入层通道数,int类型。

hidden_channel

隐层或输出层通道数,int类型。

kernel_size

卷积核尺寸,int类型。

stride

卷积步长,int类型,默认为 1

padding

卷积补零,int类型,默认为 0

dilation

卷积核膨胀系数,是卷积核元素之间的间距,int类型, 默认为 1

groups

从输入通道到输出通道的阻塞连接数,int类型, 默认为 1

feed_back

是否使用回环结构链接隐层与隐层,bool类型, 默认为 False

norm_state

是否使用BatchNorm进行归一化处理防止梯度爆炸, bool类型,默认为 True

mode

memb_mode

soma_params

noise

具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初 始化参数/可调整的参数】。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

it_batch

【数据类型】int类型

内循环模式的 batch_size ,在APU推理时请使用 1 ,训练时可自行定义

Conv2dLifPlus#

继承自 torch.nn.Module ,在 init 方法中对LifPlus中所涉及的参数赋予了初始值, forward 方法与FcLifPlus完全一致。在使用时只能处理单个时间步的输入。

ConvLifPlus2d层的初始化参数/可调整的参数参见下表。

表 Conv2dLif层结构参数说明

参数

含义

input_channel

输入层通道数,int类型。

hidden_channel

隐层或输出层通道数,int类型。

kernel_size

卷积核尺寸,int类型。

stride

卷积步长,int类型,默认为 1

padding

卷积补零,int类型,默认为 0

dilation

卷积核膨胀系数,是卷积核元素之间的间距,int类型, 默认为 1

groups

从输入通道到输出通道的阻塞连接数,int类型, 默认为 1

feed_back

是否使用回环结构链接隐层与隐层,bool类型, 默认为 False

norm_state

是否使用BatchNorm进行归一化处理防止梯度爆炸, bool类型,默认为 True

mode

memb_mode

soma_params

noise

input_accum

rev_volt

fire_refrac

spike_init

trig_current

memb_decay

具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初 始化参数/可调整的参数】。

spike_func

【数据类型】callable

神经元使用的梯度梯度代替函数

use_inner_loop

【数据类型】bool类型

是否使用神经元内循环模式

it_batch

【数据类型】int类型

内循环模式的 batch_size ,在APU推理时请使用 1 ,训练时可自行定义

Conv2dLifIt/Conv2dLifPlusIt#

通过可迭代时间轴的It类对Conv2dLif类进行了包装,在 forward 方法中,支持对多个时间步进行循环处理。

Lif2d/LifPlus2d#

与Conv2dLif/Conv2dLifPlus类似,只是没有投影,也即没有nn.Conv2d层,因为不需要卷积相关的参数,如input_channel、hidden_channel、kernel_size等。