服务器系列(20):精度评价指标

详情可见:https://blog.csdn.net/sinat_26917383/article/details/75199996

对于Acc和loss:

def train(train_loader, model, criteon, optimizer, epoch):

  train_loss =0

  train_acc =0

  num_correct=0

  for  step, (x,y) inenumerate(train_loader):

     # x: [b, 3, 224, 224], y: [b]

      x, y =x.to(device), y.to(device)

      model.train()

      logits =model(x)

      loss =criteon(logits, y)

      optimizer.zero_grad()

      loss.backward()

      optimizer.step()

      train_loss +=float(loss.item())

      train_losses.append(train_loss)

      pred =logits.argmax(dim=1)

      num_correct +=torch.eq(pred, y).sum().float().item()

      logger.info("Train Epoch: {}\t Loss: {:.6f}\t Acc: {:.6f}".format(epoch,train_loss/len(train_loader),num_correct/len(train_loader.dataset)))

  return num_correct/len(train_loader.dataset), train_loss/len(train_loader)

首先这样一次训练称为一个epoch,样本总数/batchsize是走完一个epoch所需的“步数”,相对应的,len(train_loader.dataset)也就是样本总数,len(train_loader)就是这个步数。

那么,accuracy的计算也就是在整个train_loader的for循环中(步数),把每个mini_batch中判断正确的个数累加起来,然后除以样本总数就行了;

而loss的计算有讲究了,首先在这里我们是计算交叉熵,关于交叉熵,也就是涉及到两个值,一个是模型给出的logits,也就是10个类,每个类的概率分布,另一个是样本自身的label,在Pytorch中,只要把这两个值输进去就能计算交叉熵,用的方法是nn.CrossEntropyLoss,这个方法其实是计算了一个minibatch的均值了,因此累加以后需要除以的步数,也就是minibatch的个数,而不是像accuracy那样是样本个数,这一点非常重要。

你可能感兴趣的:(服务器系列(20):精度评价指标)