关于pytorch中的CrossEntropyLoss()的理解

分类问题中,交叉熵函数是比较常用也是比较基础的损失函数。

基本推导过程

提到交叉熵,脑子里就会出现这个公式:
L = − [ y ∗ l o g y ^ + ( 1 − y ) ∗ l o g ( 1 − y ^ ) ] L=-[y*log\hat{y}+(1-y)*log(1-\hat{y})] L=[ylogy^+(1y)log(1y^)]
然后,脑子里还会浮现出sigmoid这个函数:
g ( s ) = 1 1 + e − s g(s)=\frac{1}{1+e^{-s}} g(s)=1+es1

pytorch中的CrossEntropyLoss()函数其实就是把输出结果进行sigmoid(将数据设置到0-1之间),随后再放到传统的交叉熵函数中,就会得到结果。

我们知道 s i g m o i d sigmoid sigmoid的作用其实就是把前一层的输入映射到0-1这个区间上,可以认为上一层某个输入样本的数据越大,就代表这个样本标签属于1的概率就越大,反之, 上一层样本的输入数据越小,这个样本标签属于0的概率就越大, 而且通过 s i g m o i d sigmoid sigmoid函数的图像(见下)我们可以看出来,随着输入值的增大, 其对概率增大的作用效果是逐渐减弱的, 反之同理, 这就是非线性映射的一个好处,让模型处于对中间范围的输入数据更敏感,下面是 s i g m o i d sigmoid sigmoid图:

在这里插入图片描述
既然经过 s i g m o i d sigmoid sigmoid之后的数据能表示样本所属某个标签的概率, 那么举个例子,我们将模型预测某个样本标签为1的概率是:

y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1|x) y^=P(y=1x)
那么, 这个样本标签不为1的概率是:
1 − y ^ = P ( y = 0 ∣ x ) 1-\hat{y}=P(y=0|x) 1y^=P(y=0x)

从极大似然的角度来讲就是:
P ( y ∣ x ) = y ^ y ∗ ( 1 − y ^ ) 1 − y P(y|x)=\hat{y}^{y}*(1-\hat{y})^{1-y} P(yx)=y^y(1y^)1y

上式可以理解为,某一个样本x,我们通过模型预测出其属于样本标签为y的概率, 因为y是我们给的正确结果, 所以我们当然希望上式越大越好。
接下来我们在 P ( y ∣ x ) P(y|x) P(yx)的外面套上一层log函数,相当于进行了一次非线性映射。众所周知, l o g log </

  • 92
    点赞
  • 289
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
`nn.CrossEntropyLoss()` 是 PyTorch 用于多分类问题的损失函数。它结合了 `nn.LogSoftmax()` 和 `nn.NLLLoss()`,适用于将模型输出与目标类别进行比较的场景。 `nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean')` 参数说明: - `weight`:各个类别的损失权重,可以用于处理类别不平衡问题。默认为 `None`,表示所有类别的损失权重相等。 - `size_average`:已过时的参数,被 `reduce` 参数替代。 - `ignore_index`:忽略指定索引的类别,不计算其损失。默认为 `-100`。 - `reduce`:是否对每个样本的损失进行平均。如果为 `True`,则返回所有样本损失的平均值;如果为 `False`,则返回所有样本损失的总和。默认为 `None`,表示使用全局设置。 - `reduction`:指定如何处理损失。可以是 `'none'`、`'mean'` 或 `'sum'`。默认为 `'mean'`。 使用示例: ```python import torch import torch.nn as nn # 创建交叉熵损失函数 loss_fn = nn.CrossEntropyLoss() # 假设 outputs 是模型的输出,targets 是目标类别的张量 outputs = torch.randn(10, 5) # 示例假设模型输出为 10 个样本,每个样本有 5 个类别的得分 targets = torch.randint(5, (10,)) # 示例假设目标类别为 10 个样本,每个样本的类别在 0 到 4 之间 # 计算损失 loss = loss_fn(outputs, targets) print(loss) ``` 在上述示例,我们首创建了一个 `nn.CrossEntropyLoss()` 的实例 `loss_fn`。然后,我们生成了模型的输出张量 `outputs` 和目标类别张量 `targets`。最后,我们将这两个张量作为输入传递给 `loss_fn()` 函数,计算出交叉熵损失 `loss`。 注意:`nn.CrossEntropyLoss()` 函数会自动应用 `nn.LogSoftmax()` 和 `nn.NLLLoss()`,因此在模型的输出不需要进行 softmax 操作。同时,目标类别张量 `targets` 应当是一维的,每个元素代表一个样本的类别索引。 希望这个示例能够帮助您理解 `nn.CrossEntropyLoss()` 函数的用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值