其实就是根据 真实值的结果,当成索引去取的值
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 结合起来。