Pytorch中accuracy和loss的計算知識點總結
阿新 • • 發佈:2020-01-09
這幾天關於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那樣是樣本個數,這一點非常重要。
以上就是本次介紹的全部知識點內容,感謝大家對我們的支援。