先建立一个能用的直觉
Conv 提取每个时间步的空间局部特征,LIF 在同一空间位置上沿时间积累。典型模块是 Conv → Norm → LIF。
它到底解决了什么麻烦
事件帧和图像有二维结构。只用全连接会丢掉平移共享与局部感受野。
Math · 不背公式,顺着计算读
每张卡先讲人话,再拆符号、走计算顺序,最后代入一组数。读完后请合上说明,自己复算一次。
这不是一条计算公式,而是一张形状合同:同一批视频/脉冲序列按时间、样本、通道、高、宽五个维度排好。
符号分别是谁
- T
- 序列长度/时间步数
- B
- 彼此独立的样本数量
- C
- 输入极性通道或卷积特征通道
- H×W
- 空间分辨率
按这个顺序计算
- 先确认框架是 time-major [T,B,…] 还是 batch-major [B,T,…]。
- 逐步模式每次取 X[t],形状为 [B,C,H,W]。
- 卷积输出的膜状态通常保持 [B,Cout,H′,W′]。
代入一组数
[8,32,16,28,28] 表示 8 步、32 个样本、16 个通道、28×28。仅 float32 输入就有 8×32×16×28×28≈321 万个数,约 12.3 MiB。
卷积负责同一时间步里的空间特征提取,LIF 递推负责同一空间位置跨时间保留状态。两种结构各做一件事。
符号分别是谁
- Conv
- 对 H/W 做局部共享计算
- S(l−1)[t]
- 上一层本步的脉冲特征图
- V[t−1]
- 当前层上一时间步的膜状态图
按这个顺序计算
- 对本步 spike map 做卷积,得到电流图 I[t]。
- 把旧膜状态图乘 β。
- 逐位置相加,再做阈值与 reset。
代入一组数
某像素位置旧 V=0.5、β=0.9,卷积在本步给出 I=0.6,则更新前 V=1.05;阈值为 1 时该位置发放。
落到代码就是
current = conv(spikes_t)
mem = beta * mem + current把几个容易混的概念拆开
Step mode
逐步模式输入 [B,C,H,W];多步模式一次接收 [T,B,C,H,W]。库的约定不同。
Normalization
BatchNorm 的统计量如何处理时间维会影响训练;常见方案包括共享 BN 或时间相关 BN。
跟着机制一步一步走
01
同时追踪空间与时间
在 [T,B,C,H,W] 中,卷积核沿 H/W 共享,神经元状态沿 T 延续,B 中不同样本彼此独立。一次 reshape 错位就可能把 batch 当成 time,却不一定立刻报错。
- 逐步模式:循环 T 次,每次输入 [B,C,H,W]。
- 多步模式:模块直接接收 [T,B,C,H,W]。
- 状态张量形状通常与卷积输出 [B,C,H,W] 相同。
02
Normalization 也有时间语义
共享 BatchNorm 把不同时间步混在同一统计量中;时间相关 BN 为每个 t 保存独立参数。前者简单,后者表达更细但参数和实现复杂度更高。
公式在代码里对应哪一行
这一章更适合在交互实验里逐步观察;代码实验页还提供了完整训练程序。
先写下预测,再动参数
画出一个 [8,32,16,28,28] 张量并逐维解释。再估算保存所有膜电位需要多少元素。
我最常见到的误解
把 T 与 B 混淆。代码可能仍运行,却把不同样本当成时间序列,结果没有意义。
到了论文里,它会怎么出现
SEW-ResNet 与后续深层 SNN 重新设计 residual path,避免仅把 ReLU 换成 LIF 导致的优化退化。
别急着翻页,先验算一下
本章检测0/3 已作答