pytorch学习笔记十一:损失函数

本文介绍了PyTorch中的损失函数,包括交叉熵损失、NLLLoss、BCELoss等,详细解析了它们的计算方式、应用场景和参数设置。通过对损失函数的创建、运行机制的探讨,阐述了它们在模型训练中的作用,为理解和应用提供指导。
摘要由CSDN通过智能技术生成

一、损失函数是什么

损失函数:衡量模型输出与真实标签之间的差异。与损失函数有关的还有代价函数和目标函数。

  • 损失函数(Loss Function):计算一个样本的差异, L o s s = f ( y ^ , y ) Loss=f\left ( \hat{y},y \right ) Loss=f(y^,y)
  • 代价函数(Cost Function):计算整个训练集loss的一个平均值, c o s t = 1 N ∑ i N f ( y ^ , y ) cos t= \frac{1}{N}\sum_{i}^{N}f\left ( \hat{y},y \right ) cost=N1iNf(y^,y)
  • 目标函数(Objective Function):衡量模型的整体拟合程度,过拟合和欠拟合,obj = cost + Regularization

所以在衡量模型的输出和真实标签之间的差异时的损失函数其实是指代价函数,下面看一下pytorch中的损失函数:
在这里插入图片描述
_loss也继承了nn.Module类,说明loss也是一层,也有nn.Module中的8个参数字典。参数有size_average、reduce、reduction,其中size_average和reduce已经被舍弃不再使用,重点关注reduction参数。下面以人民币的二分类中交叉熵损失函数为例,看损失函数是如何创建和使用的,背后运行的机制是什么?

# 在train.py文件的损失函数创建处打上断点,进行调试
criterion = nn.CrossEntropyLoss()

可看出程序进入到了loss.py文件中的 CrossEntropyLoss(_WeightedLoss):交叉熵损失类的__init__方法, 这里发现交叉熵损失函数继承_WeightedLoss这个类:
在这里插入图片描述
继续debug,就到了class _WeightedLoss(_Loss):这个类里面,就会发现这个类继承_Loss, 那么我们继续步入,就到了_Loss这个类里面去,会发现这个继承Module
在这里插入图片描述
在这里插入图片描述
在_loss中继承了Module类,所以损失函数的初始化和模型的初始化类似,也调用了Module初始化方法,最终会有8个属性字典,如下:
在这里插入图片描述
然后在_loss类中设置reduction参数,至此,损失函数的创建过程已完成。下面看一下损失函数的运行机制

# 在此处设置断点,损失函数前向传播
loss = criterion(outputs, labels)

在这里插入图片描述
损失函数_loss继承了Module,那么在前向传播时也会调用Module的forward方法,继续debug可看到
在这里插入图片描述
在这里插入图片描述所以在forward中调用了F中对应的损失函数,而cross_entroy又是由nll_loss计算而来。以上就是损失函数的创建和内部运行机制。
下面来看pytorch中损失函数的具体使用。

常见损失函数

官网链接

1、交叉熵损失 CrossEntropyLoss

nn.CrossEntropyLoss: nn.LogSortmax() 与 nn.NLLLoss() 结合,进行交叉熵计算。

torch.nn.CrossEntropyLoss(weight=None, 
                          size_average=None, 
                          ignore_index=- 100, 
                          reduce=None, 
                          reduction='mean', label_smoothing=0.0)

参数:

  • weight:各类别的loss设置权值
  • ignore_index:忽略某个类别
  • reduction:计算模式,可为none/sum/mean,none 表示逐个元素计算,这样有多少个样本就会返回多少个 loss。sum 表示所有元素的 loss求和,返回标量,mean 所有元素的 loss 求加权平均(加权平均的含义下面会提到),返回标量。

在了解交叉熵之前先来了解几个概念:
自信息:单个事件的不确定性, I ( x ) = − l o g [ p ( x ) ] I(x) = -log[p(x)] I(x)=log[p(x)]
熵(信息熵):描述一个事件的不确定性,一个事件越不确定,熵越大, H ( P ) = E x ∼ p [ I ( x ) ] = − ∑ i N P ( x i ) l o g P ( x i ) H(P)=E_{x\sim p}[I(x)] = -\sum_{i}^{N}P(x_{i})logP(x_{i}) H(P)=Exp[I(x)]=iNP(xi)logP(xi)
交叉熵:衡量两个分布之间的差异程度,P表示数据的原始分布,Q表示模型的输出分布,交叉熵越小说明两个分布越接近 , H ( P , Q ) = − ∑ i = 1 N P ( x i ) l o g Q ( x i ) H(P, Q) = -\sum_{i=1}^{N}P(x_{i})logQ(x_{i}) H(P,Q)=

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值