交叉熵损失 在PyTorch 中的计算过程

时间:2024-10-16 07:25:18

其实就是根据 真实值的结果,当成索引去取的值
import torch
import torch.nn as nn

aaaa = torch.tensor([[2.0,1.0,3.0],
             [2.0,4.0,2.0]])

l1 = nn.LogSoftmax(dim=-1)
result = l1(aaaa)
print(result)

import torch
import torch.nn as nn

# 定义交叉熵损失函数
criterion = nn.CrossEntropyLoss()

# 模拟的模型输出(没有经过 softmax)
aaaa = torch.tensor([[2.0, 1.0, 3.0],
                     [2.0, 4.0, 2.0]])

# 模拟的目标类别
target = torch.tensor([2, 1])

# 计算交叉熵损失
loss = criterion(aaaa, target)
print("交叉熵损失:", loss.item())

 

在这个例子中,CrossEntropyLoss 会先对模型输出进行 softmax,然后计算目标类别的负对数似然损失(NLLLoss)。

其中 aaaa 是模型的原始输出,没有经过 softmax,target 是目标类别。

计算过程详细解释:

1. Softmax 操作:

• 第一行:[2.0, 1.0, 3.0]

• 计算 softmax 值:

经过计算得到:


• 第二行:[2.0, 4.0, 2.0]

• 计算 softmax 值:

经过计算得到:

2. 取对数:

• 第一行:[0.2595, 0.0952, 0.6452] 的对数:

• 第二行:[0.1065, 0.7869, 0.1065] 的对数:

3. NLLLoss 计算:

现在我们使用目标类别计算负对数似然损失:

4. 计算平均损失:

将两个样本的损失值相加后取平均:

因此,最终的交叉熵损失值为 0.33935。

总结:​​​​​​​

Softmax 将模型输出转换为概率分布。

LogSoftmax 将 softmax 的概率取对数。

NLLLoss 根据目标类别提取 log-prob 对应的值,并计算损失。

CrossEntropyLoss 将 LogSoftmax 和 NLLLoss 结合起来。