pytorch 中 nn.CrossEntropyLoss 理解

在看代码的时候。发现输出未经过softmax的值直接送入CrossEntropyLoss。觉得这里有问题。

https://zhuanlan.zhihu.com/p/98785902

sum up:

1.torch的crossEntropy里三个过程1.softmax,2.取log,3.NLLLoss 取label位置上那个log值取均值(是否取均值可由参数设置)。

2.如果logit不经过softmax的话,直接取交叉熵的影响:因为交叉熵是取label=1位置上的logx。x>0,1.logit无法保证x>0;2.如果x都>0,out=softmax(X) 的大小分布和X中一致,但是实际值loss,则反向传播计算梯度时,梯度值会产生影响,而logloss的梯度最终等于ai-yi(ai预测值,yi是label),所以对每个输出值的梯度都不一致,影响整体梯度下降的方向。所以l必须经过softmax计算交叉熵。

如果理解有误的话,请指出,谢谢~

logloss求梯度:https://blog.csdn.net/qian99/article/details/78046329

`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()` 函数的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值