import torch import torch.nn as nn input = torch.randn(3, 3) # 理解为每一行对应一张图片(🐖🐱🐕3分类,所以是3行3列) target = torch.tensor([0, 2, 1]) # 真实标签 sm = nn.Softmax(dim=1) # 转化为0~1之间,概率 loss = nn.NLLLoss() # 注意此处需要将类实例化,不可直接写为nn.NLLLoss(torch.log(sm(input)), target) loss_value = loss(torch.log(sm(input)), target) # log是将(0~1)之间的概率P转化之(-∞~0),可以理解为P越大,loss越小,P越小loss越大 print(loss_value) loss = nn.CrossEntropyLoss() loss_value = loss(input, target) print(loss_value)
>>>tensor(1.7419)
>>>tensor(1.7419)
两者输出结果一致,可以看出交叉熵损失将softmax-log-损失计算过程进行了合并,简化了计算。
损失计算:torch.log(sm(input))的输出与target对应的值拿出来,去掉负号,再求平均值的过程。