paddle中nll_loss()与CrossEntropyLoss()损失函数区别

paddle中nll_loss()与CrossEntropyLoss()损失函数区别

首先先交代结论:nll_loss()与CrossEntropyLoss()损失函数计算的关系为CrossEntropyLoss()等于对输入数据先做softmax,再做log处理,再加nll_loss()操作。
1.NLLLoss 的输入是一个对数概率向量和一个目标标签,它不会为我们计算对数概率.,适合网络的最后一层是log_softmax损失函数,有时候调用预训练模型修改网络最后的全连接层的时候会把最后一层的输出改变,这时候就不适合用CrossEntropyLoss()作为损失函数;CrossEntropyLoss()与NLLLoss()相同,唯一的不同是它为我们去做 softmax。
2.CrossEntropyLoss():交叉熵损失函数,交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。
以下提供在paddlepaddle2.0以及pytorch两种框架中的验证。

一、paddlepaddle2.0框架中的验证

这一部分我已经上传我的ai studio上,上面有分步的详细解释,欢迎大家fork学习。
https://aistudio.baidu.com/aistudio/projectdetail/1759396

二、pytorch框架中的验证

import torch
import torch.nn.functional as nn
input = torch.tensor([[ 0.9451, -0.1922, -0.5285],
                      [-0.3981,  0.5784,  0.0945],
                      [-1.1648,  0.1565, -0.4067]])
input_aftersoftmax_hang = nn.softmax(input,dim = 1)
# print(input_aftersoftmax_hang)
'''
tensor([[0.6453, 0.2069, 0.1478],
        [0.1890, 0.5018, 0.3093],
        [0.1453, 0.5446, 0.3101]])
'''
input_aftersoftmax_lie = nn.softmax(input,dim = 0)
# print(input_aftersoftmax_lie)
'''
tensor([[0.7235, 0.2184, 0.2504],
        [0.1888, 0.4720, 0.4668],
        [0.0877, 0.3096, 0.2828]])
'''
input_log_hangsoftmax = torch.log(input_aftersoftmax_hang)
# print(input_log_hangsoftmax)
'''
tensor([[-0.4381, -1.5754, -1.9117],
        [-1.6661, -0.6896, -1.1735],
        [-1.9290, -0.6077, -1.1709]])
'''
input_log = torch.log_softmax(input,dim = 1)
# print(input_log)
'''
tensor([[-0.4381, -1.5754, -1.9117],
        [-1.6661, -0.6896, -1.1735],
        [-1.9290, -0.6077, -1.1709]])
'''
# 由此可以说明对input按行做softmax后再做log处理的结果,和直接用torch.log_softmax()的结果是一样的

# 假设每一行代表一个数据,他们的真实标签分别为0,2,1,也就是取input_log第一行第一个,第二行第三个,第三行第二个作为预测结果
target = torch.tensor([0,2,1])

# 计算nnl_loss损失函数的损失值
loss_nlllose = nn.nll_loss(input_log_hangsoftmax, target)
# print(loss_nlllose)  # tensor(0.7398)

# 计算CrossEntropyLoss损失函数损失值
loss_CrossEntropyLoss = nn.cross_entropy(input,target)
# print(loss_CrossEntropyLoss)  # tensor(0.7398)

# 由此可以知道,输入数据按行做softmax,再做log操作,再接nn.nll_loss,等于nn.cross_entropy(input,target)


你可能感兴趣的:(一点一滴深度学习,深度学习,python,人工智能,算法,机器学习)