pytorch的CrossEntropyLoss交叉熵损失函数默认reduction是平均值

pytorch中使用nn.CrossEntropyLoss()创建出来的交叉熵损失函数计算损失默认是求平均值的,即多个样本输入后获取的是一个均值标量,而不是样本大小的向量。通过

通过CrossEntropyLoss中的reduction参数来设置,reduction参数主要用于确定如何从各样本的损失来计算总损失。'none':不应用任何计算,返回每个样本的损失值。'mean':对各个样本的损失值进行加权平均,返回标量。'sum':对各个样本的损失值进行求和,同样返回标量。

net = nn.Linear(4, 2)
loss = nn.CrossEntropyLoss()
X = torch.rand(10, 4)
y = torch.ones(10, dtype=torch.long)
y_hat = net(X)
l = loss(y_hat, y)
print(l)

打印的结果:tensor(0.7075, grad_fn=<NllLossBackward0>)

以上是对10个样本做的均值的标量

net = nn.Linear(4, 2)
loss = nn.CrossEntropyLoss(reduction='none')
X = torch.rand(10, 4)
y = torch.ones(10, dtype=torch.long)
y_hat = net(X)
l = loss(y_hat, y)
print(l)

在构造CrossEntropyLoss时候加入 reduction='none',就把默认求平均取消掉了

打印结果:

tensor([0.6459, 0.7372, 0.6373, 0.6843, 0.6251, 0.6555, 0.5510, 0.7016, 0.6975,
        0.6849], grad_fn=<NllLossBackward0>)

以上是10个样本各自的loss值

上图是pytorch的CrossEntropyLoss的构造方法,默认是 reduction='mean'

此外,使用反向传播计算梯度也会发生变化,loss值调用backward()要求loss值是一个tensor标量,如果是reduction='none',loss值得到的是tensor向量,会报错。 loss值需要求和或者求平均得到标量再进行backward()的计算

l = loss(y_hat, y)
l.sum().backward()

至于为什么求和或者求平均都可以,首先要看下更新梯度的计算公式

 求和学习率就调整的大一点,求均值的话学习率就可以小一点,总之就是除以样本数这个操作可以放到调整学习率中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值