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)、碳化硅(…

TensorFlow 中三种启动图用法

转自https://blog.csdn.net/lyc_yongcai/article/details/73467480 TensorFlow 中有三种启动图的方法:tf.Session(),tf.InteractivesSession(),tf.train.Supervisor().managed_session() 它们各自的用法如下: (1&am…

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)的海洋生物在埃迪…

TensorFlow保存和载入训练模型

保存:使用saver.save()方法保存 载入:使用saver.restore()方法载入 下面是个完整例子: 保存: import tensorflow as tfW tf.Variable([[1, 1, 1], [2, 2, 2]], dtypetf.float32, namew) b tf.Variable([[0, 1, 2]], dtypetf…

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

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

C++与linus

1、linus炮轰C原帖(英文) http://thread.gmane.org/gmane.comp.version-control.git/57643/focus57918 2、2007年,linus之父炮轰C:糟糕程序员的垃圾语言(中文) CSDN刘江的博客,包括事件前因后果…

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

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

plt.subplots中的ax = ax.flatten()

在用plt.subplots画多个子图中,ax ax.flatten()将ax由n*m的Axes组展平成1*nm的Axes组 以下面的例子说明ax ax.flatten()的作用: fig, ax plt.subplots(nrows2,ncols2,sharexall,shareyall) ax ax.flatten() for i in range(4):img image[i].resh…

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…

将tensor转array

如果对tensor使用extend方法,如下面这个例子: import tensorflow as tfa tf.convert_to_tensor([1,2,3]) b [] with tf.Session() as sess:b.extend(a) 会报错“Tensor objects are only iterable when eager execution is enabled. To iterate over…

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种方式

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

ncread

matlab 函数ncread(),这自变量有 source:代表的是你要载入的文件; varname:是你要提取的变量的变量名; start:你提取的变量实际是一个数组,比如你是一个三维数组 start:是你提取这个数组的值的起始索引。如果你的变量是一个三维数组&#xff…