-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
请问代码是否支持单步推理? #23
Comments
这个时期的SJ框架好像不支持切换 |
我看到代码中用的神经元都有MultiStep的前缀,如MultiStepIFNode。那请问是否有对应的单步神经元?如果我将多步神经元全部替换为单步神经元,可以实现单步推理吗?因为sj里似乎单步和多步只与神经元层有关,和其他层无关。 |
可以这样做,把神经元换成单步神经元,把用seq to ann container包装的无状态层去掉包装即可在单步模式下运行 |
我没有找到这一版本SJ的文档,您能否提供这一版本里神经元类的文档? |
针对您提出的解决方案,我截取了一段典型的代码: |
是的,这样做即可。 可能引发的小问题是SeqToANNContainer换成Sequential后加载训练好的权重出问题。由于SeqToANNContainer会融合TN,你可以考虑在单步模式下,给SeqToANNContainer注册个钩子,前向传播时输入unsqueeze(0)补充一个T=1的维度,输出在squeeze(0)去掉这个维度 |
“由于SeqToANNContainer会融合TN,你可以考虑在单步模式下,给SeqToANNContainer注册个钩子,前向传播时输入unsqueeze(0)补充一个T=1的维度,输出在squeeze(0)去掉这个维度” |
正常单步应该输入[N,C,H,W],然后改成[1,N,C,H,W]去适应SeqToANNContainer |
是的,如果你不加载权重的话就不需要管这个 https://spikingjelly.readthedocs.io/zh-cn/0.0.0.0.14/activation_based/container.html |
好的,谢谢您,我应该是要加载权重的,多步训练,然后用单步做推理。另外我还发现似乎有一个问题。 |
不能,所以需要对上一层的输出或者这一层的输入 |
那我能不能这样做,不做任何修改,就用多步神经元和SeqToANNContainer,然后:
问题的关键就是,多步神经元能不能支持这样的多次输入,并在多次输入下记忆膜电位?因为一般来说多步神经元不需要面对这种多次输入的情况。 |
最新的SJ框架可以。这个repo中用的那个我不确定,建议你翻一下源代码 |
这一版的监视器是不是不支持查看电压呀? 我想直接看每个时间步长的电压就行了。源代码里面没有cext.neuron的部分,我在文档中没有找到。 |
最新版的监视器是支持看电压的,用访问成员变量的方式查看 |
你好,经过我的测试,多步神经元应该是可以保存电压直到下次reset的,您提供版本的SJ没办法查看膜电压,我只能通过输出的spike来判断,具体来说,我用的是下面的代码:
至少在1000个步长上,神经网络的输出都是一致的。因此我初步认为有记忆性。
在这里我用了两个网络model和model1,这是因为必须要预先设置T,原因是在model里会根据T去复制输入。
这是sew_resnet的源码,我的理解是前两层是一个输入编码层,并且在最后输出了平均电压。因此按照我的测试方法,model和model1的输出应该是一致的,但是结果不一致。希望您能告诉我原因 |
我修改了一下代码,在使用预训练后,下面这个代码的单步和多步输出终于一致了:
输出:全部都是True,即误差在可控范围内,这些误差应该是不可去的,属于单步和多步的固有误差。
不知道您是否知道下面的代码为什么没法得到一致的输出。 |
是不是这里导致的?前向传播的写法默认按多步来,最终的输出被直接平均了 |
具体不是很懂,但是fc层是linear的,先平均后输入和先输入后平均得到的结果应该是一致的吧?哪怕有bias也是一样。
报错: |
应该不是fc mean的问题
权重初始化不一样
是SeqToANNContainer导致的,解决方法前面提到过:#23 (comment) |
我试了一下,时间长了之后,单步和多步总是会产生一些细小的误差,可能这是无法避免的吧。 |
误差是不能避免的。即便是pytorch中一个conv层,把2个bach拼在一块送进去,和分别送入再把输出合并,最后得到的结果都会有很小的差异 |
前面提到的dvsgesture模型的问题,我是简化了您的代码里的输入weight过程,是不是我哪里写错了?
我的:
|
打印一下check point和model的state_dict的keys,对比一下差异 |
就在前面,主要是后面多了 .0 和 .num_batches_tracked |
.0可能是SeqToANNContainer导致的?在新版框架中, SeqToANNContainer继承自Sequential,state dict中不会多一个.0的前缀了,和sequential一致 |
建议你用类似的方法修改模型的定义代码,让key和check point一致 |
您好,我觉得误差还是有点大,尤其是在长步长后,可能直接用现有的代码做单步推理不是很现实。 |
是的,然后运行在单步模式 |
有个问题啊,就是新版的sewresnet里的conv3*3调用的是layer里的:
和这里的不太一样。 |
nn里面的网络不能切换单步多步 |
哦,怪不得新版SEWResnet里全部换成layer了。
不知道现在是否可以自由切换单步多步?
|
现在可以了 |
为啥在新版的SEWResnet里是用torch.flatten(x, 1)和x = torch.flatten(x, 2)呀,还需要根据self.avgpool.step_mode进行判断,我修改的代码里面直接用layer.Flatten会不会产生不可预知的错误 |
|
需要看输入是 |
试着跑了一下,报了一个错,DVSCIFAR10
下面是部分代码
|
好像维度不对 |
|
十分感谢!好像跑起来了,但是如果我要改成单步的话,上面的代码还要哪些改动呢?
应该改成
但我不确定前面的怎么改动
|
functional.set_step_mode作用整个网络,改成单步即可。具体请参考最新版的教程 https://spikingjelly.readthedocs.io/zh-cn/latest/activation_based/basic_concept.html#id4 |
单步模式下最后一层应该是return self.out(x),没有mean(0) |
意思是这么写吗:
这里的all就是累计电压。 |
可以这样,先用functional.set_step_mode作用self,让所有子模块都在单步模式下 |
您好,我想用spikingjelly训练cifar10和cifar100,我想用在spikingjelly/activation_based/model/spiking_vgg.py中的VGG范例模型,这些模型都是来自于ANN的VGG架构吗?然后将激活函数改成了神经元。 |
spiking_vgg的文档有点不全,我想问下我这么用是对的吗? |
|
我直接训练vgg16效果比较差,我想试试加上tdbn看看能不能到达那篇文章(Going Deeper With Directly-Trained Larger Spiking Neural Networks)所说的效果,net定义成这样:
但是报错了: |
|
norm_layer需要是一个可调用的对象,而不是一个已经生成的模块吧 |
|
CIFAR数据集很容易过拟合,一般只能采用改进网络结构的方式。L2之类的技巧没什么效果。数据增强有一些用,参考下面的代码: |
如果要改进网络的话,只能添加dropout,但是resnet原文里是不加dropout的。或者用您文章里的专门为DVScifar10准备的小网络Wide-7B-Net,不知道可不可行。 |
不知道您有没有用sewresnet做过cifar100,可以提供一点经验吗 |
没有试过,但你可以用CIFAR10的网络试试 |
您好,您说的数据增强方法确实有用,但是似乎有点过了,导致训练集都有点欠拟合。不知道数据增强中有没有参数可以调节数据增强的强度? |
现在比较尴尬的是测试集的精度比训练集的精度更高,这可能是数据增强太强所导致的。您原来的数据增强是针对cifar10的,但是现在我用的数据集是cifar100,可能不需要这么强的数据增强。希望您能告诉我数据增强的代码中有没有参数可供调节,来降低数据增强的效果。 |
看一下数据增强的class的构造参数 |
您好,查看代码后我发现推理使用的是多步推理。请问我能否用
from spikingjelly.clock_driven import functional
functional.set_step_mode(net, 's')
方便地将网络改为单步推理模式?
如果不能,您能否提供一个可行的办法使得可以在单步模式下推理?谢谢!
The text was updated successfully, but these errors were encountered: