pytorch模型训练之 loss function选择

Posted 机器学习算法工程师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch模型训练之 loss function选择相关的知识,希望对你有一定的参考价值。

编辑:田   旭       


前 言

在训练一个网络时候,我们会根据不同的任务选择不同的loss function,我们简单介绍一些loss function以及他们的应用场景。




01

nn.L1Loss


  


l1 loss要求 xx 和 yy 的维度要一样(可以是向量或者矩阵),得到的 loss 维度也是对应一样的。这里用下标 i 表示第 i 个元素。


loss_fn = torch.nn.L1Loss(reduce=False, size_average=False)
input = torch.autograd.Variable(torch.randn(3,4))
target = torch.autograd.Variable(torch.randn(3,4))
loss = loss_fn(input, target)
print(input); print(target); print(loss)
print(input.size(), target.size(), loss.size())




02

nn.MSELoss


均方损失函数, x, y 的维度是一样的,可以是向量或者矩阵,i 是下标。 

pytorch模型训练之 loss function选择


loss_fn = torch.nn.MSELoss(reduce=False, size_average=False)
input = torch.autograd.Variable(torch.randn(3,4))
target = torch.autograd.Variable(torch.randn(3,4))
loss = loss_fn(input, target)
print(input); print(target); print(loss)
print(input.size(), target.size(), loss.size())



03

nn.BCELoss


二分类用的交叉熵,需要在该层前面加上 Sigmoid 函数。 
针对的是二分类任务,只有正例和反例,且两者的概率和为 1,只需要预测一个概率。


pytorch模型训练之 loss function选择 

这里 x,y 可以是向量或者矩阵,i 是下标;xi 表示第 i 个样本预测为 正例 的概率,yi 表示第 i 个样本的标签,wi 表示该项的权重大小。loss, x, y, w 的维度都是一样的。


import torch.nn.functional as F
loss_fn = torch.nn.BCELoss(reduce=False, size_average=False)
input = Variable(torch.randn(3, 4))
target = Variable(torch.FloatTensor(3, 4).random_(2))
loss = loss_fn(F.sigmoid(input), target)
print(input); print(target); print(loss)



04

nn.CrossEntropyLoss


多分类用的交叉熵损失函数,用这个 loss 前不需要加 Softmax 层。


pytorch模型训练之 loss function选择


weight = torch.Tensor([1,2,1,1,10])
loss_fn = torch.nn.CrossEntropyLoss(reduce=False, size_average=False, weight=weight)
input = Variable(torch.randn(3, 5)) # (batch_size, C)
target = Variable(torch.FloatTensor(3).random_(5))
loss = loss_fn(input, target)
print(input); print(target); print(loss)



05

nn.NLLLoss


用于多分类的负对数似然损失函数(Negative Log Likelihood) 


pytorch模型训练之 loss function选择


在前面加上一个 nn.LogSoftMax 层就等价于交叉熵损失了。事实上,nn.CrossEntropyLoss 也是调用这个函数。xlabel 是经过 logSoftMax 运算后的数值。



06

loss选择


针对不同的任务,我们会选择对应的loss function,比如分割任务,我们会使用nll loss, 而对于gan这类任务,discriminator训练更多的使用BCE loss, 比如cyclegan,gan loss和discriminator训练的loss都是BCE loss,cycle loss以及identity loss使用l1 loss。



07

size averagr


很多的 loss 函数都有 size_average 和 reduce 两个布尔类型的参数。因为一般损失函数都是直接计算 batch 的数据,因此返回的 loss 结果都是维度为 (batch_size, ) 的向量。


  • 如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss; 

  • 如果 reduce = True,那么 loss 返回的是标量  

  • 如果 size_average = True,返回 loss.mean(); 

  • 如果 size_average = True,返回 loss.sum(); 

  • 当size avarage为false的时候,我们应该相应的减小学习率。




     

    END



    往期回顾

    【1】 

    【2】 

    【3】 

    【4】 

    【5】 





    机器学习算法工程师


    长按,识别,加关注

    进群,学习,得帮助

    你的关注,我们的热度,

    我们一定给你学习最大的帮助



    以上是关于pytorch模型训练之 loss function选择的主要内容,如果未能解决你的问题,请参考以下文章

    利用pytorch的载入训练npy类型数据代码

    利用pytorch的载入训练npy类型数据代码

    pytorch训练时前一次迭代的loss正常后一次迭代却报nan

    pytorch之transforms.Compose()函数理解

    Pytorch网络训练流程的作用原理:源码分析optimizer.zero_grad()loss.backward()optimizer.step()

    Pytorch网络训练流程的作用原理:源码分析optimizer.zero_grad()loss.backward()optimizer.step()