PyTorch框架学习十二——损失函数

PyTorch框架学习十二——损失函数

  • 一、损失函数的作用
  • 二、18种常见损失函数简述
    • 1.L1Loss(MAE)
    • 2.MSELoss
    • 3.SmoothL1Loss
    • 4.交叉熵CrossEntropyLoss
    • 5.NLLLoss
    • 6.PoissonNLLLoss
    • 7.KLDivLoss
    • 8.BCELoss
    • 9.BCEWithLogitsLoss
    • 10.MarginRankingLoss
    • 11.HingeEmbeddingLoss
    • 12.MultiLabelMarginLoss
    • 13.SoftMarginLoss
    • 14.MultiLabelSoftMarginLoss
    • 15.nn.CosineEmbeddingLoss
    • 16.MultiMarginLoss
    • 17.TripletMarginLoss
    • 18.CTCLoss

之前的笔记写过,一个深度学习/机器学习模型的实现过程主要来说包括五部分:数据、模型、损失函数、最优化和迭代过程。前面的笔记已经介绍了数据部分和模型部分,这次笔记主要介绍损失函数。

因为在实际使用中根据不同的实际情况会选择不同的损失函数,所以对损失函数的公式推导就不涉及了,以后具体用到什么再写什么吧,这次笔记聚焦于PyTorch中损失函数的构建与工作原理,并简单介绍常用的18种损失函数,具体公式推导应参考相关论文,这里不详细推导。

一、损失函数的作用

损失函数简单来说就是用来衡量模型输出(预测值)与真实标签(真实值)的差异的。

有三个概念很容易混淆:

  1. 损失函数:在这里插入图片描述
  2. 代价函数:在这里插入图片描述
  3. 目标函数:在这里插入图片描述
    其中,损失函数是关于某一个具体样本的衡量,代价函数是所有样本的损失的平均,目标函数是在代价函数的基础上加上正则化。

二、18种常见损失函数简述

1.L1Loss(MAE)

功能:计算inputs与targets之差的绝对值。

torch.nn.L1Loss(size_average=None, reduce=None, reduction: str = 'mean')

参数只需要关注reduction,因为size_average和reduce两个结合做了reduction的事,以后PyTorch会舍弃这两个参数,下面每个损失函数都有这两个参数,就不提了。

reduction是一个字符串参数,能取三个值:‘none’、‘mean’、‘sum’,因为现在计算loss基本都是一个batch的数据样本不是一个单独的样本,所以这三个值分别代表对一个batch的样本分别求loss、求所有loss的均值、求loss的和。

看一个例子:

inputs = torch.ones((2, 2))
target = torch.ones((2, 2)) * 3loss_none = nn.L1Loss(reduction='none')
loss1 = loss_none(inputs, target)
print("input:{}\n\ntarget:{}\n\nL1 loss_none:{}".format(inputs, target, loss1))loss_mean = nn.L1Loss(reduction='mean')
loss2 = loss_mean(inputs, target)
print("\nL1 loss_mean:{}".format(loss2))loss_sum = nn.L1Loss(reduction='sum')
loss3 = loss_sum(inputs, target)
print("\nL1 loss_mean:{}".format(loss3))

输出:

input:tensor([[1., 1.],[1., 1.]])target:tensor([[3., 3.],[3., 3.]])L1 loss_none:tensor([[2., 2.],[2., 2.]])L1 loss_mean:2.0L1 loss_mean:8.0

2.MSELoss

功能:计算inputs与targets之差的平方。

torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')

这个损失函数与L1Loss形式上很相似,直接举例:

inputs = torch.ones((2, 2))
target = torch.ones((2, 2)) * 3loss_f_mse = nn.MSELoss(reduction='none')
loss_mse = loss_f_mse(inputs, target)print("input:{}\n\ntarget:{}\n\nMSE loss:{}".format(inputs, target, loss_mse))

输出:

input:tensor([[1., 1.],[1., 1.]])target:tensor([[3., 3.],[3., 3.]])MSE loss:tensor([[4., 4.],[4., 4.]])

3.SmoothL1Loss

功能:平滑的L1Loss。

torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction: str = 'mean')

其公式为:
在这里插入图片描述
我们将真实值全部设置为0,就可以绘制出其损失函数的样子,并与L1Loss进行比较:

    inputs = torch.linspace(-3, 3, steps=500)target = torch.zeros_like(inputs)loss_f = nn.SmoothL1Loss(reduction='none')loss_smooth = loss_f(inputs, target)loss_l1 = np.abs(inputs.numpy())plt.plot(inputs.numpy(), loss_smooth.numpy(), label='Smooth L1 Loss')plt.plot(inputs.numpy(), loss_l1, label='L1 loss')plt.xlabel('x_i - y_i')plt.ylabel('loss value')plt.legend()plt.grid()plt.show()

绘制的结果为:
在这里插入图片描述

4.交叉熵CrossEntropyLoss

功能:nn.LogSoftmax()与nn.NLLLoss()结合,进行交叉熵计算。

torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')

交叉熵损失是分类问题中常用的损失函数,它的计算公式如下:
在这里插入图片描述
若再考虑权重weight,公式为:
在这里插入图片描述
权重的设置在数据不平衡时非常关键。

参数如下所示:

  1. weight:各类别的loss设置权值。
  2. ignore_index:忽略某个类别。
  3. reduction:同上。

举个栗子:

inputs = torch.tensor([[1, 2], [1, 3], [1, 3]], dtype=torch.float)
target = torch.tensor([0, 1, 1], dtype=torch.long)loss_f_none = nn.CrossEntropyLoss(weight=None, reduction='none')
loss_none = loss_f_none(inputs, target)print("Cross Entropy Loss:\n ", loss_none)

输出:

Cross Entropy Loss:tensor([1.3133, 0.1269, 0.1269])

5.NLLLoss

功能:实现负对数似然函数中的负号功能。

torch.nn.NLLLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')

举例:

inputs = torch.tensor([[1, 2], [1, 3], [1, 3]], dtype=torch.float)
target = torch.tensor([0, 1, 1], dtype=torch.long)weights = torch.tensor([1, 1], dtype=torch.float)
loss_f_none_w = nn.NLLLoss(weight=weights, reduction='none')
loss_none_w = loss_f_none_w(inputs, target)print("\nweights: ", weights)
print("NLL Loss", loss_none_w, loss_sum, loss_mean)

输出为:

weights:  tensor([1., 1.])
NLL Loss tensor([-1., -3., -3.])

6.PoissonNLLLoss

功能:泊松分布的负对数似然损失函数。

torch.nn.PoissonNLLLoss(log_input: bool = True, full: bool = False, size_average=None, eps: float = 1e-08, reduce=None, reduction: str = 'mean')

主要参数:
在这里插入图片描述

  1. log_input:输入是否为对数形式,决定计算公式是哪一个。
  2. full:计算所有的loss,默认为False。
  3. eps:修正项,避免log(input)为nan。
  4. reduction:同上。

7.KLDivLoss

功能:计算KLD,KL散度。

torch.nn.KLDivLoss(size_average=None, reduce=None, reduction: str = 'mean', log_target: bool = False)

8.BCELoss

功能:二分类交叉熵。

torch.nn.BCELoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')

注意:输入值取值在[0,1]。

9.BCEWithLogitsLoss

功能:结合Sigmoid与二分类交叉熵。

torch.nn.BCEWithLogitsLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean', pos_weight: Optional[torch.Tensor] = None)

注意:网络最后不加sigmoid函数。

10.MarginRankingLoss

功能:计算两个向量之间的相似度,用于排序任务。

torch.nn.MarginRankingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')

说明:该方法计算两组数据之间的差异,返回一个n×n的loss矩阵。

11.HingeEmbeddingLoss

功能:计算两个输入的相似性,常用于非线性embedding和半监督学习。

torch.nn.HingeEmbeddingLoss(margin: float = 1.0, size_average=None, reduce=None, reduction: str = 'mean')

12.MultiLabelMarginLoss

功能:多标签边界损失函数。

torch.nn.MultiLabelMarginLoss(size_average=None, reduce=None, reduction: str = 'mean')

13.SoftMarginLoss

功能:计算二分类的logistic损失。

torch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction: str = 'mean')

14.MultiLabelSoftMarginLoss

功能:SoftMarginLoss多标签版本。

torch.nn.MultiLabelSoftMarginLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')

15.nn.CosineEmbeddingLoss

功能:采用余弦相似度计算两个输入的相似性。

torch.nn.CosineEmbeddingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')

16.MultiMarginLoss

功能:计算多分类的折页损失。

torch.nn.MultiMarginLoss(p: int = 1, margin: float = 1.0, weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')

17.TripletMarginLoss

功能:三元组损失,人脸验证中常用。

torch.nn.TripletMarginLoss(margin: float = 1.0, p: float = 2.0, eps: float = 1e-06, swap: bool = False, size_average=None, reduce=None, reduction: str = 'mean')

18.CTCLoss

功能:计算CTC损失,解决时序类数据的分类。

torch.nn.CTCLoss(blank: int = 0, reduction: str = 'mean', zero_infinity: bool = False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

化合物半导体的机遇

来源:国盛证券半导体材料可分为单质半导体及化合物半导体两类,前者如硅(Si)、锗(Ge)等所形成的半导体,后者为砷化镓(GaAs)、氮化镓(GaN)、碳化硅(…

PyTorch框架学习十三——优化器

PyTorch框架学习十三——优化器一、优化器二、Optimizer类1.基本属性2.基本方法三、学习率与动量1.学习率learning rate2.动量、冲量Momentum四、十种常见的优化器(简单罗列)上次笔记简单介绍了一下损失函数的概念以及18种常用的损失函数,这次…

最全芯片产业报告出炉,计算、存储、模拟IC一文扫尽

来源:智东西最近几年, 半导体产业风起云涌。 一方面, 中国半导体异军突起, 另一方面, 全球产业面临超级周期,加上人工智能等新兴应用的崛起,中美科技摩擦频发,全球半导体现状如何&am…

python向CSV文件写内容

f open(r"D:\test.csv", w) f.write(1,2,3\n) f.write(4,5,6\n) f.close() 注意:上面例子中的123456这6个数字会分别写入不同的单元格里,即以逗号作为分隔符将字符串内容分开放到不同单元格 上面例子的图: 如果要把变量的值放入…

PyTorch框架学习十四——学习率调整策略

PyTorch框架学习十四——学习率调整策略一、_LRScheduler类二、六种常见的学习率调整策略1.StepLR2.MultiStepLR3.ExponentialLR4.CosineAnnealingLR5.ReduceLRonPlateau6.LambdaLR在上次笔记优化器的内容中介绍了学习率的概念,但是在整个训练过程中学习率并不是一直…

JavaScript数组常用方法

转载于:https://www.cnblogs.com/kenan9527/p/4926145.html

蕨叶形生物刷新生命史,动物界至少起源于5.7亿年前

来源 :newsweek.com根据发表于《古生物学》期刊(Palaeontology)的一项研究,动物界可能比科学界所知更加古老。研究人员发现,一种名为“美妙春光虫”(Stromatoveris psygmoglena)的海洋生物在埃迪…

PyTorch框架学习十五——可视化工具TensorBoard

PyTorch框架学习十五——可视化工具TensorBoard一、TensorBoard简介二、TensorBoard安装及测试三、TensorBoard的使用1.add_scalar()2.add_scalars()3.add_histogram()4.add_image()5.add_graph()之前的笔记介绍了模型训练中的数据、模型、损失函数和优化器,下面将介…

CNN、RNN、DNN的内部网络结构有什么区别?

来源:AI量化百科神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是…

L2级自动驾驶量产趋势解读

来源:《国盛计算机组》L2 级自动驾驶离我们比想象的更近。18 年下半年部分 L2 车型已面世,凯迪拉克、吉利、长城、长安、上汽等均已推出了 L2 自动驾驶车辆。国内目前在售2872个车型,L2级功能渗透率平均超过25%,豪华车甚至超过了6…

PyTorch框架学习十六——正则化与Dropout

PyTorch框架学习十六——正则化与Dropout一、泛化误差二、L2正则化与权值衰减三、正则化之Dropout补充:这次笔记主要关注防止模型过拟合的两种方法:正则化与Dropout。 一、泛化误差 一般模型的泛化误差可以被分解为三部分:偏差、方差与噪声…

HDU 5510 Bazinga 暴力匹配加剪枝

Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid5510 Description Ladies and gentlemen, please sit up straight.Dont tilt your head. Im serious.For n given strings S1,S2,⋯,Sn, labelled from 1 to n, you shou…

PyTorch框架学习十七——Batch Normalization

PyTorch框架学习十七——Batch Normalization一、BN的概念二、Internal Covariate Shift(ICS)三、BN的一个应用案例四、PyTorch中BN的实现1._BatchNorm类2.nn.BatchNorm1d/2d/3d(1)nn.BatchNorm1d(2)nn.Bat…

人工智能影响未来娱乐的31种方式

来源:资本实验室 技术改变生活,而各种新技术每天都在重新定义我们的生活状态。技术改变娱乐,甚至有了互联网时代“娱乐至死”的警语。当人工智能介入我们的生活,特别是娱乐的时候,一切又将大为不同。尽管很多时候我们很…

素数与量子物理的结合能带来解决黎曼猜想的新可能吗?

来源:中国科学院数学与系统科学研究院翻译:墨竹校对:杨璐1972年,物理学家弗里曼戴森(Freeman Dyson)写了一篇名为《错失的机会》(Missed Opportunities)的文章。在该文中&#xff0c…

PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization

PyTorch框架学习十八——Layer Normalization、Instance Normalization、Group Normalization一、为什么要标准化?二、BN、LN、IN、GN的异同三、Layer Normalization四、Instance Normalization五、Group Normalization上次笔记介绍了Batch Normalization以及它在Py…

重磅!苹果祭出大招:史上最强 Mac 发布,iPad OS 惊艳问世

来源:网络大数据伴随着时间的脚步进入到 6 月份,一年一度的苹果 WWDC 开发者大会又如期到来;这是苹果自举办开发者大会以来的第三十场 WWDC,因而有着不一样的意义。今年的 WWDC 在苹果库比蒂诺总部附近的 San Jose McEnery Convention Center…

PyTorch框架学习十九——模型加载与保存

PyTorch框架学习十九——模型加载与保存一、序列化与反序列化二、PyTorch中的序列化与反序列化1.torch.save2.torch.load三、模型的保存1.方法一:保存整个Module2.方法二:仅保存模型参数四、模型的加载1.加载整个模型2.仅加载模型参数五、断点续训练1.断…

新计算推动信息技术产业新发展?

来源:工信头条未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&#…

保存tensorboard的损失曲线为图片

损失loss一般是标量,损失曲线一般显示在TensorBoard的SCALARS下,如图所示: 如果想将损失曲线保存下来,选中左边“Show data download links”按钮,曲线下面就会有一个下载按钮,但是只能保存为SVG文件&#…