關於Pytorch中accuracy和loss的計算


這幾天關於accuracy和loss的計算有一些疑惑,原來是自己還沒有弄清楚。

給出實例

def train(train_loader, model, criteon, optimizer, epoch):
    train_loss = 0
    train_acc = 0
    num_correct= 0
    for step, (x,y) in enumerate(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那樣是樣本個數,這一點非常重要。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM