API接口及数据集定义
===============================================================================================

主要LIF/LIFPlus模块位置：

- ./bidlcls/models/layers/lif.py
- ./bidlcls/models/layers/lifplus.py

此LIF/LIFPlus模块主要提供了一个继承自torch.nn.Module的元模型Lif类，和按照维度1d和2d划分的不同的类，并通过可迭代时间轴的It类进行了包装。

.. _sjymx:

神经元模型
-----------------------------------------------------------------------------------------------

- Lif/LifPlus

  - 1d 处理一维数据

    - 带有全连接型突触的泄漏积分发放模型FcLif/FcLifPlus
    - 泄漏积分发放模型Lif1d/LifPlus1d

  - 2d 处理二维数据

    - 带有卷积型突触的泄漏积分发放模型Conv2dLif/Conv2dLifPlus
    - 泄漏积分发放模型Lif2d/LifPlus2d

- It，即Iteration，用于带有多时间步循环的LIF，用于实现内循环版本

  - FcLifIt/FcLifPlusIt
  - Conv2dLifIt/Conv2dLifPlusIt

.. _lif-lifplus:

基础神经元模型——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                                          |
|                |                                                            |
|                | 具体说明参见 :ref:`memb_mode`                              |
+----------------+------------------------------------------------------------+
| soma_params    | 神经元胞体的关键参数。                                     |
|                |                                                            |
|                | 【数据类型】Dict                                           |
|                |                                                            |
|                | 具体说明参见 :ref:`soma_params`                            |
+----------------+------------------------------------------------------------+
| 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                                          |
|                |                                                            |
|                | 具体说明参见 :ref:`memb_mode`                              |
+----------------+------------------------------------------------------------+
| soma_params    | 神经元胞体的关键参数。                                     |
|                |                                                            |
|                | 【数据类型】Dict                                           |
|                |                                                            |
|                | 具体说明参见：:ref:`soma_params`                           |
+----------------+------------------------------------------------------------+
| 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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

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:

soma_params(Lif)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

soma_params表示神经元胞体的关键参数。

【默认参数】

::

   SOMA_PARAMS = {
      'alpha': .3,
      'beta': 0.,
      'theta': .5,
      'v_0': 0.,
      'shape': [],
      'learn': False
   }

【参数说明】

+---------+------------------------------------------------------------+
| 参数    | 含义                                                       |
+=========+============================================================+
| alpha   | 胞体参数，用于计算在脉冲发放前后的不同状态中胞体膜电位值。 |
|         |                                                            |
| beta    | 【数据类型】float类型                                      |
|         |                                                            |
| theta   | 【配置说明】                                               |
|         |                                                            |
| v_0     | - 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`` 值的方法参见              |
|         | :ref:`config_content`。                                    |
+---------+------------------------------------------------------------+
| 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        | 【数据类型】float类型                                       |
|            |                                                             |
| tau_recip  | 【配置说明】                                                |
|            |                                                             |
| v_0        | - epsilon: 电导衰减常数。                                   |
|            |                                                             |
| epsilon_r  | - v_g: 反向电压常数。                                       |
|            |                                                             |
| v_rr       | - tau_recip: ∆𝑡/𝜏（∆𝑡代表采样时间间隔，𝜏为神经元时间因子）。|
|            |                                                             |
| v_ar       | - v_0: 重置膜电位。                                         |
|            |                                                             |
| q_r        | - epsilon_r: 相对不应期衰减常数。                           |
|            |                                                             |
| b          | - v_rr: 相对不应期反转电压。                                |
|            |                                                             |
| epsilon_w  | - v_ar: 适应性反转电压。                                    |
|            |                                                             |
| theta      | - q_r: 相对不应期的跳变尺寸。                               |
|            |                                                             |
| v_theta    | - b: 脉冲触发的跳跃大小。                                   |
|            |                                                             |
| delta_t    | - epsilon_w: 适应性衰减常数。                               |
|            |                                                             |
| v_c        | - theta：门限。                                             |
|            |                                                             |
| a          | - v_theta: 触发电压。                                       |
|            |                                                             |
| v_w        | - delta_t: 锐度因子。                                       |
|            |                                                             |
| alpha      | - v_c: 临界电压。                                           |
|            |                                                             |
| beta       | - a: 亚阈值耦合常。                                         |
|            |                                                             |
| v_leak     | - 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`` 值的方法                   |
|            | 参见 :ref:`config_content` 。                               |
+------------+-------------------------------------------------------------+
| learn      | 是否通过学习而得到胞体的关键参数。                          |
|            |                                                             |
|            | 【数据类型】bool类型                                        |
|            |                                                             |
|            | 【取值范围】False，True                                     |
|            |                                                             |
|            | - False：即固定参数（不通过学习得到相关参数）。             |
|            | - True：即通过所有层一并学习更新相关参数。                  |
|            |                                                             |
|            | 【默认取值】False                                           |
|            |                                                             |
|            | 【配置说明】目前暂不支持配置修改。                          |
+------------+-------------------------------------------------------------+

Lif/LifPlus中的硬件加速函数
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Lif中包含了两个硬件加速函数，这两个函数在灵汐芯片上可以快速执行，定义如下：

1. cmpandfire：比较并发放函数，定义为：

   .. math:: y(i)\  = \ 1\ if\ x(i)\  > \ theta,\ otherwise\ 0

   其中x,y为Tensor，th为标量，i代表任意一个Tensor中的元素的角标。

2. resetwithdecay：发放后复位及泄漏计算函数，用于计算发放后的复位过程及泄漏
   过程，定义为：

   .. math:: 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操作统一放在神经元模型描述的最后。

.. attention::

   对于一个状态变量，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           | 具体内容同 :ref:`lif-lifplus` 章节的【表 Lif的初始化  |
|                | 参数/可调整的参数】。                                 |
| memb_mode      |                                                       |
|                |                                                       |
| soma_params    |                                                       |
|                |                                                       |
| noise          |                                                       |
+----------------+-------------------------------------------------------+
| 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           | 具体内容同  :ref:`lif-lifplus` 章节的【表 Lif的初始化 |
|                | 参数/可调整的参数】。                                 |
| memb_mode      |                                                       |
|                |                                                       |
| soma_params    |                                                       |
|                |                                                       |
| noise          |                                                       |
|                |                                                       |
| input_accum    |                                                       |
|                |                                                       |
| rev_volt       |                                                       |
|                |                                                       |
| fire_refrac    |                                                       |
|                |                                                       |
| spike_init     |                                                       |
|                |                                                       |
| trig_current   |                                                       |
|                |                                                       |
| memb_decay     |                                                       |
+----------------+-------------------------------------------------------+
| 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            | 具体内容同 :ref:`lif-lifplus` 章节的【表 Lif的初   |
|                 | 始化参数/可调整的参数】。                          |
| memb_mode       |                                                    |
|                 |                                                    |
| soma_params     |                                                    |
|                 |                                                    |
| noise           |                                                    |
+-----------------+----------------------------------------------------+
| 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            | 具体内容同  :ref:`lif-lifplus` 章节的【表 Lif的初  |
|                 | 始化参数/可调整的参数】。                          |
| memb_mode       |                                                    |
|                 |                                                    |
| soma_params     |                                                    |
|                 |                                                    |
| noise           |                                                    |
|                 |                                                    |
| input_accum     |                                                    |
|                 |                                                    |
| rev_volt        |                                                    |
|                 |                                                    |
| fire_refrac     |                                                    |
|                 |                                                    |
| spike_init      |                                                    |
|                 |                                                    |
| trig_current    |                                                    |
|                 |                                                    |
| memb_decay      |                                                    |
+-----------------+----------------------------------------------------+
| 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等。
