资源说明:在PyTorch中,`nn.CrossEntropyLoss()` 是一个常用的操作,用于计算神经网络分类任务的损失。这个损失函数结合了对数 softmax 函数和负对数似然损失(negative log likelihood loss),常用于多分类问题。以下是 `nn.CrossEntropyLoss()` 的详细计算过程。
1. **对数 Softmax**:
在神经网络的输出层,通常会得到一个二维张量,其中每一行代表一个样本的概率分布,每一列对应一个类别。对数 softmax 操作会将每个样本的输出转化为概率分布,公式为:
\[
\text{softmax}(z)_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)}
\]
其中,\( z \) 是未经处理的网络输出,\( \exp(z_i) \) 表示第 \( i \) 类别的指数值,而 \( \sum_j \exp(z_j) \) 是所有类别指数值的总和。这将确保每行的概率和为1。
2. **负对数似然损失**:
对于单个样本,如果真实类别为 \( y \),则交叉熵损失 \( L \) 可以表示为:
\[
L = -\log(\text{softmax}(z)_y)
\]
这是因为我们希望预测出的类别 \( y \) 的概率最大,因此对其取对数可以最大化损失,当且仅当实际类别对应的概率为1时,损失为0。
3. **PyTorch 中的 `nn.CrossEntropyLoss()`**:
PyTorch 的 `nn.CrossEntropyLoss()` 实现中,它会自动执行对数 softmax 和负对数似然损失的计算。输入参数 `output` 是模型的预测输出,`label` 是对应的真实类别。`output` 应该是一个形状为 `(N, C)` 的张量,其中 \( N \) 是样本数量,\( C \) 是类别数。`label` 是一个形状为 `(N,)` 的张量,表示每个样本的正确类别。
4. **实际计算**:
在提供的测试代码中,可以看到如何手动计算交叉熵损失。对于一维输出,计算过程是遍历每个样本,找出对应真实类别的输出值,减去其指数值,然后加上其他所有类别的指数值的对数。对于多维输出,同样的过程需要对每个样本进行,最后求平均得到整体的损失。
5. **加权交叉熵**:
`nn.CrossEntropyLoss()` 还支持加权,可以通过设置 `weight` 参数来调整不同类别的损失权重。如果提供了 `weight` 参数,那么损失将会根据指定的权重进行调整。默认情况下,`weight` 是 `None`,意味着所有类别的权重相同。
6. **一维和多维输出**:
测试代码分别展示了单个样本和多个样本的计算过程。在多维输出的情况下,需要对每个样本的损失进行累加,然后除以样本总数来得到平均损失。
总结来说,`nn.CrossEntropyLoss()` 是 PyTorch 中用于多分类任务的损失函数,它结合了对数 softmax 和负对数似然损失,使得模型能够最小化预测类别与真实类别之间的差异。在训练过程中,通过优化这个损失函数,可以改进模型的分类性能。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。