在以下上下文中 "grad attribute" 有何不同?
What makes the difference in "grad attribute" in the following context?
考虑以下两种情况
with torch.no_grad():
params = params - learning_rate * params.grad
和
with torch.no_grad():
params -= learning_rate * params.grad
在第二种情况下 .backward()
是 运行 顺利而在第一种情况下它给出
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
这是什么原因,因为 x-= a
和 x = x - a
互换使用很正常?
注意 x -= a
和x = x - a
cannot be used interchangeably:后者创建一个新的张量赋值给变量x
,而前者执行一个到位操作。
因此与
with torch.no_grad():
params -= learning_rate * params.grad
优化循环中一切正常,而在
with torch.no_grad():
params = params - learning_rate * params.grad
变量 params
被 覆盖 new 张量。由于这个新张量是在 torch.no_grad()
上下文中创建的,这意味着这个新张量具有 params.requires_grad=False
,因此没有 .grad
属性。因此在下一次迭代中火炬将抱怨 params.grad
不存在。
考虑以下两种情况
with torch.no_grad():
params = params - learning_rate * params.grad
和
with torch.no_grad():
params -= learning_rate * params.grad
在第二种情况下 .backward()
是 运行 顺利而在第一种情况下它给出
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
这是什么原因,因为 x-= a
和 x = x - a
互换使用很正常?
注意 x -= a
和x = x - a
cannot be used interchangeably:后者创建一个新的张量赋值给变量x
,而前者执行一个到位操作。
因此与
with torch.no_grad():
params -= learning_rate * params.grad
优化循环中一切正常,而在
with torch.no_grad():
params = params - learning_rate * params.grad
变量 params
被 覆盖 new 张量。由于这个新张量是在 torch.no_grad()
上下文中创建的,这意味着这个新张量具有 params.requires_grad=False
,因此没有 .grad
属性。因此在下一次迭代中火炬将抱怨 params.grad
不存在。