Pytorch中accuracy和loss的计算知识点总结
这几天关于accuracy和loss的计算有一些疑惑,原来是自己还没有弄清楚。
给出实例
deftrain(train_loader,model,criteon,optimizer,epoch): train_loss=0 train_acc=0 num_correct=0 forstep,(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("TrainEpoch:{}\tLoss:{:.6f}\tAcc:{:.6f}".format(epoch,train_loss/len(train_loader),num_correct/len(train_loader.dataset))) returnnum_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那样是样本个数,这一点非常重要。
以上就是本次介绍的全部知识点内容,感谢大家对毛票票的支持。