MENU

神经网络中测试部分的编写

January 6, 2020 • Read: 3150 • Deep Learning阅读设置

上下两张图中蓝色的曲线分别代表 training 过程中 accuracy 和 loss,可以看到,随着 epoch 的增加,accuracy 在逐渐变大,loss 也在逐渐变小。由图来看貌似训练过程良好,但实际上被骗了

这种情况叫做 overfitting,里面的 sample 被其所记忆,导致构建的网络很肤浅,无法适应一些复杂的环境,泛化的能力比较弱。就好比说快要期末考试了,同学只是把平时作业的答案全部背住了,如果期末考试考的是平时的作业,那结果肯定很好,但是期末考试考的是平时作业的一些细微的改动,比方说改了数字之类的,此时同学们就不会做了。若想缓解这种情况,就需要在 train 的同时做 test

由黄线 test 结果可看到,其总体趋势与 train 相一致,但呈现出的波动较大。但可明显注意到在上图的后半期 test 的正确率不再变化,且下图中的 loss 也很大。总之,train 过程并不是越多越好,而是取决于所采用的架构、函数、足够的数据才能取得较好的效果

原本我们用 logits 进行 Corss Entropy Loss,我们先将 logits 进行 softmax,再进行 argmax 得到 label,argmax 的作用是返回输入矩阵最大值的下标,例如 argmax([0.2,0.3,0.5]),则返回 2。然后与真实的 label 进行比较,使用 eq() 函数计算器正确率

  • import torch
  • import torch.nn.functional as F
  • logits = torch.rand(4, 10) # [4,10]
  • # 先定义一个logits,物理意义为有4张图片,每张图片有10维的数据
  • pred = F.softmax(logits, dim = 1)
  • # 这里在10维度的输出值上进行softmax
  • print(pred.shape)
  • pred_label = pred.argmax(dim = 1)
  • print(pred_label)
  • real_label = torch.tensor([9, 3, 2, 4])
  • correct = torch.eq(pred_label, real_label)
  • # eq函数对比两个tensor相同位置的元素,相等为1,不等为0
  • print(correct)
  • print("acc:", correct.sum().float().item() / 4.)

那么何时使用 test 呢?

  1. train 多个 batch 后进行一次 test
  2. 每个 epoch 后进行一次 test

具体实现到神经网络中

  • '''
  • 这里训练了一个epoch
  • '''
  • test_loss = 0
  • correct = 0
  • for data, target in test_loader:
  • data = data.view(-1, 28*28)
  • # data, target = data.to(device), target.to(device)
  • logits = net(data)
  • test_loss += criteon(logits, target).item()
  • pred = logits.argmax(dim=1)
  • correct += pred.eq(target).float().sum().item()
  • test_loss /= len(test_loader.dataset)
  • print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
  • test_loss, correct, len(test_loader.dataset),
  • 100. * correct / len(test_loader.dataset)))
Last Modified: January 8, 2020
Archives Tip
QR Code for this page
Tipping QR Code