交叉熵 pytorch中的nn.CrossEntropyLoss()函数

参考链接:
https://www.cnblogs.com/JeasonIsCoding/p/10171201.html
https://blog.csdn.net/qq_27095227/article/details/103775032
二分类的交叉熵公式是:

如果是多分类,交叉熵公式如下:

这里为了更加直观的理解计算过程,举例说明:
比如我们举例:
假设我们有个一样本,他经过我们的神经网络后会输出一个5维的向量,分别代表这个样本分别属于这5种标签的数值,(注意此时我们的5个数求和还并不等于1,需要先经过softmax处理).比如,我们的对应的5类的输出以及正确的标签类别:

 inputs = torch.FloatTensor([[-0.3830,-0.0102,-1.4235,-0.5212,0.9011]])
 target = torch.LongTensor([4])

在计算之前,我们首先需要计算y冒号,

这是经过softmax的各个类别的得分,加起来和为1. softma公式如下:

y冒有了还缺

这个是真实标签,会根据类别整成one-hot形式,现在类别是4,那么就是[0,0,0,0,1]. 所以,这两个都有了,带入上面公式:

    import torch
    import torch.nn as nn
    import math

    inputs = torch.FloatTensor([[-0.3830,-0.0102,-1.4235,-0.5212,0.9011]])
    target = torch.LongTensor([4])
    ce = nn.CrossEntropyLoss()
    loss = ce(inputs, target)
    print(loss)

    sum_ = 0
    for i in range(5):
        sum_ += math.exp(inputs[0][i])
    my_resutlt = -0.9011 + math.log(sum_)
    print("my_=",my_resutlt)

打印如下:
tensor(0.7020)
my_= 0.7020485611606857
可以看到结果一致!

原文地址:https://www.cnblogs.com/yanghailin/p/13497696.html