Pytorch使用时遇到的关于in place,grad.zero_()操作,require_grad=True
这几天在学习李沐的动手深度学习,但是由于不熟悉pytorch所以遇到了很多问题。
def sgd(params, lr, batch_size): with torch.no_grad(): for param in params: # param = param - lr*param.grad/batch_size # param -= lr * param.grad/batch_size param.grad.zero_() 123456'
这两种写法看似在编程中没什么区别,但在python中有些许区别。这就涉及到python中的in place操作,in place操作是指在变量的原地址上操作并且不产生新的变量。param -= 就是in place 操作
所以因为使用以下代码param -= lr * param.grad/batch.size, 所以必须先用torch.no_grad()将require_grad()变为false才可以对叶子节点使用-=操作。
还有一点需要讲明白的就是如果不使用in-place操作为什么梯度清零的时候会报错
因为在反向传播的时候,只有叶子节点的梯度才会被保存。