Closed NoahFeng closed 4 years ago
文档2.3.3节中例子:
x = torch.ones(1,requires_grad=True) print(x.data) # 还是一个tensor print(x.data.requires_grad) # 但是已经是独立于计算图之外 y = 2 * x x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播 y.backward() print(x) # 更改data的值也会影响tensor的值 print(x.grad)
输出:
tensor([1.]) False tensor([100.], requires_grad=True) tensor([2.])
这里改变x.data没有改变到x.grad是因为y=2*x吧? 如果改成y=x**2:
x.data
x.grad
y=2*x
y=x**2
x = torch.ones(1., requires_grad=True) print(x.data) print(x.data.requires_grad) y = x ** 2 x.data *= 100 y.backward() print(x) print(x.grad)
输出变成了:
tensor([1.]) False tensor([100.], requires_grad=True) tensor([200.]) # 值改变了
文档中所述内容需要怎么理解呢?有点不太明白。
这里这个例子确实举得不太准确。对于x**2,它的导数是2x,所以当x的值(x.data)变了之后导数自然会跟着改变(所以实际上我们很少直接修改x.data)。你只需要记住这样一个事实:x.data是独立在运行图之外的,好好理解下面这个例子即可 这里x2是没有梯度的
x**2
2x
感谢解答,理解这里所说的用法了。非常感谢。
文档2.3.3节中例子:
输出:
这里改变
x.data
没有改变到x.grad
是因为y=2*x
吧? 如果改成y=x**2
:输出变成了:
文档中所述内容需要怎么理解呢?有点不太明白。