이전 블로그를 이어서 진행해본다.
 Evaluation
model.train() 모드로 변한 것 처럼 평가할 때는 model.eval() 으로 설정한다.
1 2 3 4 5 6 7 8 9 10 11
   | 
  model.eval()
 
  Net(   (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))   (conv2): Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1))   (fc1): Linear(in_features=800, out_features=500, bias=True)   (fc2): Linear(in_features=500, out_features=10, bias=True) )
 
  | 
 
torch.no_grad() 함수는 autograd engine, 즉 backpropagatin 이나 기울기 계산 등을 꺼서 memory usage 를 줄이고 속도를 높인다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
   | test_loss = 0 correct = 0
  with torch.no_grad():     data, target = next(iter(test_loader))     data, target = data.to(device), target.to(device)     output = model(data)
      test_loss += F.nll_loss(output, target, reduction='sum').item()
      pred = output.argmax(dim=1, keepdim=True)     correct = pred.eq(target.view_as(pred)).sum().item()
 
  test_loss : 29.74889373779297 correct : 54
  test_loss /= len(test_loader.dataset) => 0.0029748893737792967
   | 
 
 정리
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | model.eval()
  test_loss = 0 correct = 0
  with torch.no_grad():     for data, target in test_loader:         data, target = data.to(device), target.to(device)         output = model(data)         test_loss += F.nll_loss(output, target, reduction='sum').item()         pred = output.argmax(dim=1, keepdim=True)         correct += pred.eq(target.view_as(pred)).sum().item()
  test0_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)))
 
  Test set: Average Loss: 0.4799, Accuracy: 8660/10000 (87%)
   |