首先提供paper、源码和工具包的链接。
文章要点:事件相机输入、高斯核和赢者通吃(先到先赢)的池化方法。2020年AAAI上一篇文章:Effective AER Object Classification Using Segmented Probability-Maximization Learning in Spiking Neural Networks 前面的步骤也是这样,后面主要是训练部分提出了新方法。

首先介绍事件相机发放的示意图:

从图中可以看出log(I)变化超过阈值时才发放对应的脉冲。
并且,由公式:dI(u,v,t)dt=−dI(u,v,t)dududt−dI(u,v,t)dvdvdt(1)\frac{d I(u, v, t)}{d t}=-\frac{d I(u, v, t)}{d u} \frac{d u}{d t}-\frac{d I(u, v, t)}{d v} \frac{d v}{d t} \tag{1} dtdI(u,v,t)​=−dudI(u,v,t)​dtdu​−dvdI(u,v,t)​dtdv​(1)
可推断,在横纵坐标u,v变化较大的地方发放的脉冲比较多,由此来检验事件的边缘。

然后介绍神经元模型。
这里我们约定所有的参数使用整数,模型公式可以这样表达:
if ti−tlastspike<trefrthen Vmi←Vmi−1elseVmi←{max⁡{Vmi−1−ILCm(ti−ti−1),0}if Vmi−1≥0min⁡{Vmi−1+IlCm(ti−ti−1),0}if Vmi−1<0Vmi←Vmi+ωiendif\begin{array}{l} \text { if } t_{i}-t_{\text {lastspike}}<t_{\text {refr}} \\ \text {then } \\ \qquad V m_{i} \leftarrow V m_{i-1} \end{array}\\ else \\ V m_{i} \leftarrow\left\{\begin{array}{ll}\max \left\{V m_{i-1}-\frac{I_{L}}{C_{m}}\left(t_{i}-t_{i-1}\right), 0\right\} & \text { if } V m_{i-1} \geq 0 \\ \min \left\{V m_{i-1}+\frac{I_{l}}{C_{m}}\left(t_{i}-t_{i-1}\right), 0\right\} & \text { if } V m_{i-1}<0\end{array}\right.\\ V m_{i} \leftarrow V m_{i}+\omega_{i}\\ end if if ti​−tlastspike​<trefr​then Vmi​←Vmi−1​​elseVmi​←⎩⎨⎧​max{Vmi−1​−Cm​IL​​(ti​−ti−1​),0}min{Vmi−1​+Cm​Il​​(ti​−ti−1​),0}​ if Vmi−1​≥0 if Vmi−1​<0​Vmi​←Vmi​+ωi​endif
ifVmi≥VthreshthenVmi←0tlastspike←tiDo(GenerateOutputSpike)endifif V m_{i} \geq V_{t h r e s h}\\ then\\ V m_{i} \leftarrow 0\\ t_{\text {lastspike}} \leftarrow t_{i}\\ Do(Generate Output Spike) \\ end ififVmi​≥Vthresh​thenVmi​←0tlastspike​←ti​Do(GenerateOutputSpike)endif

作者在源码中有注释,这样做有问题,但是效果更好。
我提出自己的想法:
1、这里没有采用负阈值。VmiV_{m_i}Vmi​​直接加上的www,而没有管事件的极性。(这一点应该是作者实验发现这样效果更好,虽然不符合理论推断,在源码中也可以看到并没有用上p,而是把正负数据输入然后再合并,感觉可能是提高了点火率所以效果更好)
2、复位操作15年这里还是减法和归零并存,文章中有陈述其他人有用减法,但是作者用的归零,目前而言已经普遍采用减法。20年还有一篇CVPR讲述的用减法做转换会更好。也可以看一下。(RMP-SNN: Residual Membrane Potential Neuron for Enabling Deeper High-Accuracy and Low-Latency Spiking Neural Network)

3、作者提到的横向抑制如上图,主要是类似于池化操作,即当前脉冲发放后给相邻脉冲的上次发放时间更新一下(这个操作感觉可以改),在图中有给相邻的电势置零的操作但是公式里只有更新最近发放时间。

然后是最大池化,选择的是先到者最大的方法,并且赢者通吃,即池化中选最先到的脉冲。(这里主要考虑的是未必就要把附近的都归零,因为脉冲点火率本来就低,信息浓缩的特别快,深层网络很难传递信号过去,感觉前面还是别降这么快)

接着作者分析了高斯核的反应,得到结论和运动方向夹角90°时电势变化较大。所谓的高斯核就是如下公式:Fθ(u,v)=e(−u02+γ2v022σ2)cos⁡(2πλu0)u0=ucos⁡θ+vsin⁡θv0=−usin⁡θ+vcos⁡θ(2)\begin{aligned} F_{\theta}(u, v) &=e^{\left(-\frac{u_{0}^{2}+\gamma^{2} v_{0}^{2}}{2 \sigma^{2}}\right)} \cos \left(\frac{2 \pi}{\lambda} u_{0}\right) \\ u_{0} &=u \cos \theta+v \sin \theta \\ v_{0} &=-u \sin \theta+v \cos \theta \end{aligned} \tag{2} Fθ​(u,v)u0​v0​​=e(−2σ2u02​+γ2v02​​)cos(λ2π​u0​)=ucosθ+vsinθ=−usinθ+vcosθ​(2)
其中θ\thetaθ从0°-165°,每次增加15°,共12个角度,也就是用它来提取12个角度的方向特征。看起来是经典操作了,参数也不用训练,用这个公式算就行了,其中的u,v这里用的是高斯核的相对位置。

接着介绍网络结构,示意图如下:


Il/CmI_l/C_mIl​/Cm​指的是衰减系数。
对于S1层:输入大小和S1大小一样,卷积核采用的策略其实是stride=1,padding=SAME的策略,单个事件过来后,会对S1的KernelSize * KernelSize这么多个神经元产生影响,把符合条件(没有超出边框,不在不应期)的找出来,更新电势,再看发不发放脉冲即可。
对于C1层,核是4x4,no padding, stride=4,即直接16对1,通过横向抑制采取先到通吃的策略,作者还加了一句这样也可以减少脉冲发放并且避免单个C1直接激活S2,但是目前来说脉冲是努力提高点火率的。
接着是S2层,C2层作者说是可有可无的,S2的连接系数是训练的,但是具体训练作者没提,代码也很简单。上面AER那篇也是后面接一层输出层,训练这一层。
训练前后代码如下:
`%load the C1 results
load(output_filename);

%initialize a filter
S2_Filter_temp = zeros(1,1);

%figure out what the filter size should be and increase the S2 size accordingly
max_x = max(C1out.x);
max_y = max(C1out.y);
max_p = max(C1out.p);
[S2FilterTemp_Sizey, S2FilterTemp_Sizex, S2FilterTemp_Sizep, ~] = size(S2_Filter_temp);
S2_Filter_temp = padarray(S2_Filter_temp, [max(max_y - S2FilterTemp_Sizey,0), max(max_x - S2FilterTemp_Sizex,0), max(max_p - S2FilterTemp_Sizep,0)], ‘post’);
%count the C1 spikes at each location
for eventNumber = 1:length(C1out.ts)
S2_Filter_temp(C1out.y(eventNumber), C1out.x(eventNumber), C1out.p(eventNumber)) = S2_Filter_temp(C1out.y(eventNumber), C1out.x(eventNumber), C1out.p(eventNumber))+1;
end
%normalize the filter
S2_Filter_temp = 100*S2_Filter_temp./sqrt(sum(sum(sum(S2_Filter_temp.^2)))); %set norm to 100
S2_Filters = S2_Filter_temp;
S2_Filters(S2_Filters == 0) = -1; %small inhibitory value
save(filter_filename, ‘S2_Filters’); %save the filter`

相当于是计数再归一化正则化啥的当权重了。
然后训练出来的权重就如下图:

颜色越深表明权重越大,右边是对应值的大小。

分类结果可以用谁的脉冲最多来决定。

最后作者在FPGA上实现,值得一提的是,为了实现,作者并没有img_size * img_size * num_orientations这么多个状态(最后一次发放时间,最后一次更新状态时间),只保持了img_size * img_size的大小,主要为了节约内存大小,由于计算量小,内存大小决定了固定FPGA板子上能放多大的网络,同时这也可以解释为对每个通道上的状态进行横向更新统一了。然后就分析了计算量,速度,功耗等。最后在poker和character上做了测试。

HFirst解读和复现心得相关推荐

  1. 论文解读+代码复现【AIDD】贝叶斯、决策树、随机森林+2种机器学习模型在癌症治疗药物发现中的应用

    AIDD(AI Drug Discovery & Design):是近年来非常火热的技术应用,且已经介入到新药设计到研发的大部分环节当中,为新药发现与开发带来了极大的助力.倾向于机器对数据库信 ...

  2. 基于深度强化学习的车道线检测和定位(Deep reinforcement learning based lane detection and localization) 论文解读+代码复现

    之前读过这篇论文,导师说要复现,这里记录一下.废话不多说,再重读一下论文. 注:非一字一句翻译.个人理解,一定偏颇. 基于深度强化学习的车道检测和定位 官方源码下载:https://github.co ...

  3. Learning Generalized Spoof Cues for Face Anti-spoofing论文解读及复现笔记

    Paper link: https://arxiv.org/abs/2005.03922 Code link: https://github.com/VIS-VAR/LGSC-for-FAS 简介: ...

  4. ICCV2019(AD) - 解读与复现MemAE《Memorizing Normality to Detect Anomaly:Memory-augmented Deep Autoencode...

    MemAE 论文名全称<Memorizing Normality to Detect Anomaly: Memory-augmented Deep Autoencoder for Unsuper ...

  5. MMsegmentation教程1:学习配置文件

    我们整合了模块和继承设计到我们的配置里,这便于做很多实验.如果您想查看配置文件,您可以运行 python tools/print_config.py /PATH/TO/CONFIG 去查看完整的配置文 ...

  6. 【图像去噪】兴智杯论文复现赛——NAFNet

    论文复现--Low-level算法 NAFNet (去噪) Simple Baselines for Image Restoration--一个简单的用于图像恢复的强基线模型 官方源码:https:/ ...

  7. 3D目标检测(单目)D4LCN论文复现(paddlepaddle)

    D4LCN: Learning Depth-Guided Convolutions for Monocular 3D Object Detection (CVPR2020) 基于深度引导卷积的单目3D ...

  8. 论文复现:WS-DAN细粒度分类问题经典之作

    转自AI Studio,原文链接:​​​​​​论文复现:WS-DAN细粒度分类问题经典之作 - 飞桨AI Studio 论文复现: See Better Before Looking Closer: ...

  9. 【论文复现赛第七期】Fact-Seg论文复现(拯救你的小目标分割)

    [论文复现赛第七期]Fact-Seg论文复现(拯救你的小目标分割) 摘要 小目标语义分割任务致力于从高分辨率遥感图像中自动提取关键目标.与遥感图像的大规模覆盖区域相比,像汽车和轮船这样的关键目标往往仅 ...

最新文章

  1. bzoj2006 NOI2010 数据结构+堆维护区间和最大
  2. python语言编程基础-Python语言入门详解!快速学成Python!
  3. 智能指针weak_ptr
  4. 在linux系统上使用jmeter
  5. 卸载KVM虚拟机(全、干净、彻底)
  6. layui让文字和div平行_layui富文本的使用注意事项以及拓展
  7. 随想录(常用gdb选项)
  8. 企业如何选择数据分析架构?——谈谈3种架构的利弊
  9. mysql java safe model_被 MySQL sql_mode 深深伤害( 中 )
  10. linux的进程和作业控制实验报告,Linux基础--进程管理和作业控制
  11. 判断一个网站用什么服务器
  12. 201507152326_《Javascript实现跨域有4种方法——介绍jsonp和html5方法》
  13. matlab无缝拼接两个图_无色差液晶拼接屏研发商参数
  14. 【笔记:傅里叶分析】数学基础——傅里叶级数与傅里叶变换
  15. Linksys E 刷Tomato shibby
  16. Android开发丶底部导航栏
  17. python中复数的实部和虚部都是浮点数_Python学习笔记:从入门到放弃(2)基本语法...
  18. 游戏数字资产复用——有哪些是你需要知道的?
  19. 将SQL导入JAVA的后续操作
  20. Cisco路由器重置enable密码步骤

热门文章

  1. 路由器突然断网服务器无响应,突然断网了 怎样判断路由器是不是坏了?
  2. win7 x64 PL/SQL连接Make sure you have the 32 bits Oracle Cient italled.问题解决
  3. x3650服务器硬盘指示灯,IBM X3500服务器故障|前面板指示灯解释
  4. 【WLAN从入门到精通-基础篇】第11期——WLAN接入认证-Portal
  5. 基于Python实现数字图像可视化水印系统
  6. 3dmax选中间隔面的步骤教程
  7. 人鱼线和马甲线的区别你知道吗
  8. [转载]领航名人馆丨吴甘沙:自动驾驶将颠覆我们的生活与城市
  9. vue3种路由守卫详解
  10. BBS论坛项目相关-4:发帖模块