训练过程:
代码:
lr = 0.03
#学习度
num_epochs = 3
#整个数据扫描次数=3
net = linreg
#模型
loss = squared_loss
#损失计算
for epoch in range(num_epochs):
#扫描三遍数据
for X, y in data_iter(batch_size, features, labels):
#每次取出一个批量大小的X和y
l = loss(net(X, w, b), y)
#net中把x,w,b进行预测,获得预测的y,并且与真实的y进行比较
#得到的l为长为batch_size的一个向量(显然是应为一组中由batch_size个数据啦)
l.sum().backward()
#求和并计算梯度,因为向量的梯度较难计算,所以选择求和的方法来计算
#从sgd的/batch_size中也可以看出这一点
sgd([w, b], lr, batch_size)
#更新梯度
with torch.no_grad():
#在扫完一遍后进行评估,且不用进行梯度计算
train_l = loss(net(features, w, b), labels)
print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
#把整个数据进行预测,与labels进行比较
从上面的代码中,我们可以看出这个训练的大致流程:
所以,通过随机选取,计算梯度,通过损失等更新参数,然后再次进行这个流程达到线性回归的目的。
三次循环学习的结果:
在上面的训练中,可以看出,超参数的选择lr,num_epochs是很重要的,所以我们往往要经过多次测试才能取到合适的结果。