存疑的一段代码:(../lib/python3.9/site-packages/d2l/torch.py)
for X, y in train_iter:
# Compute gradients and update parameters
y_hat = net(X)
l = loss(y_hat, y)
if isinstance(updater, torch.optim.Optimizer):
# Using PyTorch in-built optimizer & loss criterion
updater.zero_grad()
l.mean().backward()
updater.step()
else:
# Using custom built optimizer & loss criterion
l.sum().backward()
updater(X.shape[0])
metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())
在上面的代码中,metric存储每一个batch的loss、accuracy,在一轮(epoch)循环结束后计算平均值,在这个过程中,model参数是在不断变化的,每一批次数据也是不一样的,最后计算平均值作为整个一轮(epoch)的loss、accuracy,这个计算方面没有什么依据。并且从训练的表现上也存在差异。
在“4.1多层感知机的从零开始实现”一节中,训练图如下:
num_epochs, lr = 10, 0.1
在整个训练集上,表现并不是这么良好,这里的曲线是平均化了,看不到“震荡”现象和不稳定的现象,并且整体的loss也没有局部loss平均后的好,实际表现如下:
在第epoch=10出现震荡
在第epoch=5出现震荡
当 num_epochs, lr = 80, 0.01时,训练表现如下:
第一次epoch的表现
80次epoch的表现