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类型,有两种类型。 【取值范围】
|
memb_mode |
膜电位相关参数。 【数据类型】tuple 具体说明参见 memb_mode |
soma_params |
神经元胞体的关键参数。 【数据类型】Dict 具体说明参见 soma_params(Lif) |
noise |
噪声,float类型。 |
ON_APU |
芯片推理标志,表示是否在KA200芯片上进行推理。 【数据类型】bool类型 【取值类型】
|
spike_func |
【数据类型】callable 神经元使用的梯度梯度代替函数 |
use_inner_loop |
【数据类型】bool类型 是否使用神经元内循环模式 |
表 LifPlus的初始化参数/可调整的参数
参数 |
含义 |
|---|---|
norm |
BatchNorm对象,callable类型。 |
mode |
期望的输出类型。 【数据类型】STR类型,有两种类型。 【取值范围】
|
memb_mode |
膜电位相关参数。 【数据类型】tuple 具体说明参见 memb_mode |
soma_params |
神经元胞体的关键参数。 【数据类型】Dict 具体说明参见:soma_params(Lif) |
input_accm |
输入脉冲累积相关参数。 【数据类型】int 【取值类型】
|
rev_volt |
输入脉冲累积相关参数。 【数据类型】bool 【取值类型】
|
fire_refrac |
不应期相关参数。 【数据类型】int 【取值类型】
|
spike_init |
脉冲触发相关参数。 【数据类型】int 【取值类型】
|
trig_current |
脉冲触发电流相关参数。 【数据类型】int 【取值类型】
|
memb_decay |
膜衰减相关参数。 【数据类型】int 【取值类型】
|
noise |
噪声,float类型。 |
ON_APU |
芯片推理标志,表示是否在KA200芯片上进行推理。 【数据类型】bool类型 【取值类型】
|
spike_func |
【数据类型】callable 神经元使用的梯度梯度代替函数 |
use_inner_loop |
【数据类型】bool类型 是否使用神经元内循环模式 |
memb_mode#
memb_mode表示膜电位相关参数。数据类型为tuple,其中包含2个元素:
参数 |
含义 |
|---|---|
第一个 元素 |
表示在LIF或LIAF模型中,膜电位从上一个信号输入开始,所经历 的4种不同状态,包括:接受刺激后膜电位;减去发放阈值后膜电 位;重置后膜电位;泄漏后膜电位。这4种状态分别对应LIF或 LIAF模型期望取到的不同膜电位状态。 【数据类型】int类型 【取值范围】
|
第二个 元素 |
对第一个元素取到的膜电位设定的激活函数类型。 【数据类型】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类型 【配置说明】
|
shape |
用于说明胞体参数的共享程度。 【数据类型】list类型 【取值范围】 根据shape的形状来确定是所有神经元共享一套参数,还是每个通 道一个单独的参数:
【配置说明】 在配置文件中设置 |
learn |
是否通过学习而得到胞体的关键参数。 【数据类型】bool类型 【取值范围】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类型 【配置说明】
|
shape |
用于说明胞体参数的共享程度。 【数据类型】list类型 【取值范围】 根据shape的形状来确定是所有神经元共享一套参数,还是每个 通道一个单独的参数:
【配置说明】 在配置文件中设置 |
learn |
是否通过学习而得到胞体的关键参数。 【数据类型】bool类型 【取值范围】False,True
【默认取值】False 【配置说明】目前暂不支持配置修改。 |
Lif/LifPlus中的硬件加速函数#
Lif中包含了两个硬件加速函数,这两个函数在灵汐芯片上可以快速执行,定义如下:
cmpandfire:比较并发放函数,定义为:
\[y(i)\ = \ 1\ if\ x(i)\ > \ theta,\ otherwise\ 0\]其中x,y为Tensor,th为标量,i代表任意一个Tensor中的元素的角标。
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类型,默认为
|
norm_state |
是否使用BatchNorm进行归一化处理防止梯度爆炸,bool
类型,默认为 |
mode memb_mode soma_params noise |
具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初始化 参数/可调整的参数】。 |
spike_func |
【数据类型】callable 神经元使用的梯度梯度代替函数 |
use_inner_loop |
【数据类型】bool类型 是否使用神经元内循环模式 |
it_batch |
【数据类型】int类型 内循环模式的 |
FcLifPlus#
继承自 torch.nn.Module ,FcLifPlus1d是基于LifPlus实现的,在 init 方法中对LifPlus中所涉及的参数赋予了初始值。在使用时只能处理单个时间步的输入。
FcLifPlus层的初始化参数/可调整的参数参见下表。
表 FcLif层结构参数说明
参数 |
含义 |
|---|---|
input_channel |
输入层通道数,int类型。 |
hidden_channel |
隐层或输出层通道数,int类型。 |
feed_back |
是否使用回环结构链接隐层与隐层,bool类型,默认为
|
norm_state |
是否使用BatchNorm进行归一化处理防止梯度爆炸,
bool类型,默认为 |
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类型 内循环模式的 |
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类型,默认为 |
padding |
卷积补零,int类型,默认为 |
dilation |
卷积核膨胀系数,是卷积核元素之间的间距,int类型,
默认为 |
groups |
从输入通道到输出通道的阻塞连接数,int类型,
默认为 |
feed_back |
是否使用回环结构链接隐层与隐层,bool类型,
默认为 |
norm_state |
是否使用BatchNorm进行归一化处理防止梯度爆炸,
bool类型,默认为 |
mode memb_mode soma_params noise |
具体内容同 基础神经元模型——Lif/LifPlus 章节的【表 Lif的初 始化参数/可调整的参数】。 |
spike_func |
【数据类型】callable 神经元使用的梯度梯度代替函数 |
use_inner_loop |
【数据类型】bool类型 是否使用神经元内循环模式 |
it_batch |
【数据类型】int类型 内循环模式的 |
Conv2dLifPlus#
继承自 torch.nn.Module ,在 init 方法中对LifPlus中所涉及的参数赋予了初始值, forward 方法与FcLifPlus完全一致。在使用时只能处理单个时间步的输入。
ConvLifPlus2d层的初始化参数/可调整的参数参见下表。
表 Conv2dLif层结构参数说明
参数 |
含义 |
|---|---|
input_channel |
输入层通道数,int类型。 |
hidden_channel |
隐层或输出层通道数,int类型。 |
kernel_size |
卷积核尺寸,int类型。 |
stride |
卷积步长,int类型,默认为 |
padding |
卷积补零,int类型,默认为 |
dilation |
卷积核膨胀系数,是卷积核元素之间的间距,int类型,
默认为 |
groups |
从输入通道到输出通道的阻塞连接数,int类型,
默认为 |
feed_back |
是否使用回环结构链接隐层与隐层,bool类型,
默认为 |
norm_state |
是否使用BatchNorm进行归一化处理防止梯度爆炸,
bool类型,默认为 |
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类型 内循环模式的 |
Conv2dLifIt/Conv2dLifPlusIt#
通过可迭代时间轴的It类对Conv2dLif类进行了包装,在 forward 方法中,支持对多个时间步进行循环处理。
Lif2d/LifPlus2d#
与Conv2dLif/Conv2dLifPlus类似,只是没有投影,也即没有nn.Conv2d层,因为不需要卷积相关的参数,如input_channel、hidden_channel、kernel_size等。