fangwei123456 / spikingjelly

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

关于example - Spikebased_backpropogation #131

Closed XiangyuMao1108 closed 2 years ago

XiangyuMao1108 commented 3 years ago

您好, 我能请教一些问题关于如下path: spikingjelly/spikingjelly/clock_driven/examples/cifar10_r11_enabling_spikebased_backpropagation.py

  1. Poisson Encoder [代码299行至303行]-"poisson_input = torch.mul(poisson_input, torch.sign(img))". 这行是表示poisson_input中,如果sign(img)是负数的话,可以有-1存在嘛?
  2. 乘上问题 Poisson Encoder [代码299行至303行], 如果abs(input) 的范围超过1, 会有什么后果?
  3. 代码305行, 您有先call一个“net(poisson_input)", 然后再赋予output "output = net(poisson_input)". 请问一下先 call一遍net(poisson_input)的意义在于?

非常感谢您的帮助

Yanqi-Chen commented 3 years ago
  1. Poisson Encoder [代码299行至303行]-"poisson_input = torch.mul(poisson_input, torch.sign(img))". 这行是表示poisson_input中,如果sign(img)是负数的话,可以有-1存在嘛?

是的,相当于按原始的符号,只对绝对值进行Poisson编码,参见https://github.com/chan8972/Enabling_Spikebased_Backpropagation/blob/46e18a7b0741d08f155435e2c62acac4bebe5b2f/src/cifar10_VGG9.py#L531-L534

  1. 乘上问题 Poisson Encoder [代码299行至303行], 如果abs(input) 的范围超过1, 会有什么后果?

进行normalize后,确实有部分数据绝对值会超过1,导致持续的发放

  1. 代码305行, 您有先call一个“net(poisson_input)", 然后再赋予output "output = net(poisson_input)". 请问一下先 call一遍net(poisson_input)的意义在于?

注意这一行 https://github.com/fangwei123456/spikingjelly/blob/b7d27d263116101f6786ff7070c4d371b1de9421/spikingjelly/clock_driven/examples/cifar10_r11_enabling_spikebased_backpropagation.py#L299 这是由于这篇文章的网络较为特殊,需要的是最后时刻的神经元电压。即前T-1次call net输出的电压并对loss的计算没有什么用,因此不需要赋值到output,只需要forward的过程。实际上仅有最后一步的电压需要输出(赋值)。

XiangyuMao1108 commented 2 years ago

谢谢您的答复,我想请问一下: 如果我不断forward poisson_input, 但我并没有像您一样在中间forward net(poisson_input). 然后等到for loop结束,我再直接assign output=net(poisson_input), 请问一下我这样是不是也是得到的最后一步的电压输出(如下)? for t in range(T - 1):

Poisson encoding

            rand_num = torch.rand_like(img).cuda()
            poisson_input = (torch.abs(img) > rand_num).float()
            poisson_input = torch.mul(poisson_input, torch.sign(img))

        output = net(poisson_input)

再次谢谢您的帮助

Yanqi-Chen commented 2 years ago

谢谢您的答复,我想请问一下: 如果我不断forward poisson_input, 但我并没有像您一样在中间forward net(poisson_input). 然后等到for loop结束,我再直接assign output=net(poisson_input), 请问一下我这样是不是也是得到的最后一步的电压输出(如下)? for t in range(T - 1): # Poisson encoding rand_num = torch.rand_like(img).cuda() poisson_input = (torch.abs(img) > rand_num).float() poisson_input = torch.mul(poisson_input, torch.sign(img))

      output = net(poisson_input)

再次谢谢您的帮助

for t in range(T - 1):
    # Poisson encoding
    rand_num = torch.rand_like(img).cuda()
    poisson_input = (torch.abs(img) > rand_num).float()
    poisson_input = torch.mul(poisson_input, torch.sign(img))

    #net(poisson_input)
output = net(poisson_input)

代码缩进有点不清楚,是这样吗?

如果是这样的话,网络在前T-1步并没有接受输入,而是单纯的产生了T-1次Poisson编码,并且这些编码后的数据马上在下一次循环被覆盖了。网络实际上只运行了一步,也就是只接受了一次输入。这样做与T=1没有区别。

XiangyuMao1108 commented 2 years ago

I see. 非常感谢