报错解决方案- backward

今天写代码的时候出现了这样的报错:
RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors after they have already been freed). Saved intermediate values of the graph are freed when you call .backward() or autograd.grad(). Specify retain_graph=True if you need to backward through the graph a second time or if you need to access saved tensors after calling backward.
大概的意思就是,反向传播的时候计算图被释放了,不能backward,但是我的代码中只有一个backward啊,后来查找了一些资料,对于pytorch计算图有了新的认识
这里有几篇好的博文可以供大家参考一下:
https://blog.csdn.net/weixin_44618906/article/details/107435076
https://blog.csdn.net/rothschild666/article/details/124170794
https://blog.csdn.net/xiecheng1995/article/details/118296092

总结一下:一个变量加入到计算图之后,他就会一直存在与计算图中,我们使用的backward()会将梯度适释放掉,但是计算图的连接仍旧会保存,这个时候由于某个值在每个batch或者epoch都出现的时候,在第二个batch或者第二个epoch就会出现这个错误
(自己根据自己的错误总结的,不是很确定对不对,如果有不对的希望大家能够指出,互相学习)
然后说一下我的问题,我是在写SNN(脉冲网络)的时候遇到这个问题的,后来经过网上的学习,觉得可以是初始的阈值电压由于没有被重置,导致了链式求导,所以查找资料使用LIFNode类中的.reset()方法

def reset_net(net: nn.Module):
    """
    :param net: 任何属于 ``nn.Module`` 子类的网络
    :return: None
    将网络的状态重置。做法是遍历网络中的所有 ``Module``,若含有 ``reset()`` 函数,则调用。
    reset()函数即是LIFNode类中的方法
    """
    for m in net.modules():
        if hasattr(m, 'reset'):
            m.reset()

在参数更新后重置模型的初始阈值电压

loss.backward()  
optimizer.step()  
reset_net(model)

你可能感兴趣的:(报错解决方案,pytorch,SNN,深度学习,人工智能)