tensor 包含有 requires_grad属性,意为计算梯度值 设置为True时,会计算该张量的梯度,相反False不会计算梯度。通过调用反向传播方法:.backward(),计算梯度值,并且积累到.grad属性上,所以在每次反向传播时,一般需要把梯度置零,.zero_grad()方法。
实例:(请注意各个方法应该是由谁调用)
# optimizer 是优化器
optimizer = torch.optim.SGD(net.parameters(), lr=0.2) # 传入 net 的所有参数, 学习率
loss_func = torch.nn.MSELoss() # 损失函数为均方误差
for t in range(100):
prediction = net(x) # 把数据加入网络
loss = loss_func(prediction, y) # 计算误差
optimizer.zero_grad() # 清空上一步的梯度值
loss.backward() # 误差反向传播, 计算梯度值
optimizer.step() # 将参数更新值施加到网络上
tensor中的data封装了方法norm 用于返回模
x = torch.ones(3)
print(x.data.norm)
torch中自动计算梯度的例子
from __future__ import print_function
import torch
x = torch.ones(2,2,requires_grad=True)
print(x)
y = x + 2
print(y)
print(y.grad_fn)
z = y*y*3
# z = 3*(x+2)^2
# z'=6*(x+2)
out = z.mean()#均值
print(z,out)
out.backward()
print(x.grad)
o = z/4
输出
tensor([[ 1., 1.], [ 1., 1.]]) tensor([[ 3., 3.], [ 3., 3.]]) <AddBackward0 object at 0x7f64b2615e10> tensor([[ 27., 27.], [ 27., 27.]]) tensor(27.) tensor([[ 4.5000, 4.5000], [ 4.5000, 4.5000]])