fangwei123456 / spikingjelly

SpikingJelly is an open-source deep learning framework for Spiking Neural Network (SNN) based on PyTorch.
https://spikingjelly.readthedocs.io
Other
1.29k stars 236 forks source link

在回归任务中ann2snn后snn的脉冲结果映射到连续值域问题 #432

Closed PenguinX7 closed 10 months ago

PenguinX7 commented 11 months ago

Issue type

SpikingJelly version

0.0.0.0.14

Description 你好:

在目标检测任务中,大多数模型都可以分为主干网络+后处理解码的形式,显然转换只能将主干网络的ann转换为snn。 但是后处理解码是基于连续值域来进行的,这就要求到一个将snn的脉冲映射回源ann连续值域的操作,请问这个该如何操作?

注意到ann2snn的转换总是会将relu转换为VoltageScaler1+IFNode+VoltageScaler2的形式,且VoltageScaler2是捕捉到的激活的最大值,起初我认为该神经元在时间维度上的发射率*VoltageScaler2的值即是源ann对应位置的激活值。

但目前我就一个以resnet18(去除最后的全连接层)为主干网络的模型的最终输出来说,上述的映射操作结果与源ann的结果相差甚远。

下图源ann输出的标准结果: image 下图上述映射操作的结果,转换策略为max,且转换数据集只使用了测试所用的这一张图片 image

如果需要任何补充说明请提出。

fangwei123456 commented 11 months ago

看起来你的ANN2SNN误差很大,应该先解决转换误差问题。去除最后一个全连接层,ann resnet的输出是relu的输出,snn resnet的输出是IF神经元的输出。如果ANN2SNN没问题,那IF神经元的输出频率应该和relu输出一致

PenguinX7 commented 11 months ago

是的,我会继续尝试找出转换问题。言下之意snn中所有的neuron.IF的发射率经过VoltageScaler2放缩后在数值上就是等于该处relu是吗?另外转换所用的数据集数量对这个有影响吗?

fangwei123456 commented 11 months ago

理论上缩放后应该和SNN输出频率一样;数据量会有影响,因为缩放的系数是从训练集中估计出来的,如果训练集和测试集数据分布差距太大,则估计出的系数是错的

PenguinX7 commented 11 months ago

我在检查时发现我使用的resnet有别于经典的resnet18,我使用的网络在第一个conv-bn-relu后加了一个maxpool,似乎是这个maxpool影响了特征分布。似乎spikingjelly没有maxpool的替换方案,我将尝试自己制作一个基于最近时间步脉冲计数的通道选择层用以替换maxpool,并测试效果,希望spikingjelly后续也可以将maxpool的替换方案嵌入框架

PenguinX7 commented 10 months ago

在一篇文章“Enhancing the Performance of Transformer-based Spiking Neural Networks by SNN-optimized Downsampling with Precise Gradient Backpropagation.”中提到了将ann中conv-bn-relu-maxpool块的顺序调换为conv-bn-maxpool-relu,如此可以有效规避maxpool在snn中原理不符的问题,虽然不知道这样是否具有普适性但起码这个方法在我的例子中非常有效,准确率和运行速度都远超我自己实现的最大池化方法