赞
踩
直接在tensor中设置 requires_grad=True,每次操作这个数的时候,就会保存每一步的数据。也就是保存了梯度相关的数据。
- import torch
- x = torch.ones(2, 2, requires_grad=True) #初始化参数x并设置requires_grad=True用来追踪其计算历史
- print(x)
- #tensor([[1., 1.],
- # [1., 1.]], requires_grad=True)
-
- y = x+2
- print(y)
- #tensor([[3., 3.],
- # [3., 3.]], grad_fn=<AddBackward0>)
-
- z = y*y*3 #平方x3
- print(x)
- #tensor([[27., 27.],
- # [27., 27.]], grad_fn=<MulBackward0>)
-
- out = z.mean() #求均值
- print(out)
- #tensor(27., grad_fn=<MeanBackward0>)
图1.1
想要修改的话:x.requires_grad_(True),就把x变为可以追踪(中间计算结果都保存)的数了。
不想修改了:
- with torch.no_gard():
- c = (a * a).sum() #tensor(151.6830),此时c没有gard_fn
把内容放在torch.no_gard():下就可以了
计算梯度:直接调用.backward()就行。
例如上面图1.1,out.backward()就行
获取梯度:调用那个数.gard
注意:如果.grad在循环中,每次都会和之前的.grad叠加。
所以每次反向传播之后,都需要把梯度变为0再进行操作。
使用.data获取里面的数据。相当于直接拷贝了一份数据,而不改变原数据的内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。