这个项目是我本科毕设的一小部分,感觉没啥人写这个,我就写一写纪念下我本科最后一次大作业(主要分享核心思想,不含代码)。
1、DVS128Gesture数据集
'R Arm C Clockwise', 'L Arm Clockwise', 'L Arm C Clockwise', 'Arm Rolls', 'Air Drums', 'Air Guitar', 'Other']
2、数据处理
在git官网下载好数据集后,使用SpikingJelly库文件datasets.dvs_128gesture中的DVS128Gesture解压函数进行解压
3、训练、测试
3.1、训练
训练过程与其余snn训练过程基本一致。特别的地方在于,DVS128Gesture处理得到的数据是(T、C、H、W),于是使用Dataloader函数进行打包时会得到(N、T、C、H、W)数据格式,不符合snn处理的数据格式,于是我们必须将N、T交换,使用transpose函数进行此操作。
值得注意的是,SNN在完成一次batch的训练后,LIF神经元的膜电位必须重置,防止干扰后续batch的训练效果。
训练过程参数可以通过调用os库进行输出
训练结束,更新模型参数
3.2、测试
如果大家理解训练过程,那么测试也只是简化了BP的训练过程,因此不再赘述。
4、输出可视化
输出可视化分为两种:一是使用外部的gesture事件流数据、二是使用测试集中的事件流数据。由于本文缺少dvs相机,无法实现外部gesture事件流数据生成,于是退而求其次,使用测试集中的数据进行可视化验证。
输出可视化主要包括两方面内容:一是事件流数据的动态显示、二是输出预测pred的结果。
4.1、事件流数据动态显示
主要内容:使用plt的停顿函数依次显示不同时间步长的事件状态。
4.2、预测pred结果
主要内容:输出预测值以及置信度。其中:由于输入x的格式(T、C、H、W)无法直接被snn接纳处理,因此我们进行填充使得输入x是一个batchsize=1的批数据。将所有时间步长的平均输出作为pred的参考。
4.3、可视化效果
其中:前者是预测的手势,()里面是置信度。
dvs128gesture