损失计算与权重更新
损失函数用于评估每次训练中特征提取计算与目标值之间的差距。在torch.nn
包中提供了众多可用的损失函数选择。损失函数实例在调用时可以接受两个张量,并且会返回两个张量之间的误差张量,其中还会给出反向传播用的微分方法.backward()
。
要将损失反向传播到网络中,只需要调用损失函数返回的误差张量中的.backward()
即可。调用.backward()
之后就需要更新网络中各层的权重。
最简单的更新权重的方法是使用以下语句:
learning_rate = 0.01
for f in net.parameters():
f.data.sub_(f.grad.data * learning_rate)
以上语句使用了SGD优化,优化公式为\( weight = weight - learning\_rate \times gradient \)。网络中所有的可学习参数都可以通过.parameters()
进行访问,其中每一个可学习参数都是一个张量,可以使用优化器函数进行调整。如果直接使用torch.optim
包中提供的优化器,则可以更加方便的调整网络中的全部参数。
例如使用预定义的优化器进行权重更新,则可以如下例一般进行。
import torch.nn as nn
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.01)
# 在训练循环中
# 重置优化器
optimizer.zero_grad()
output = net(input)
loss = nn.MAELoss()(output, target)
loss.backward()
optimizer.step()