一、损失函数 nn.CrossEntropyLoss()
交叉熵损失函数 nn.CrossEntropyLoss() ,结合了 nn.LogSoftmax() 和 nn.NLLLoss() 两个函数。 它在做分类(具体几类)训练的时候是非常有用的。
二. 什么是交叉熵
交叉熵主要是用来判定实际的输出与期望的输出的接近程度。举个例子:在做分类训练的时候,如果一个样本属于第 K 类,那么这个类别所对应的输出节点的输出值应该为1,而其他节点的输出都为0,即 [0,0,1,0,….0,0] ,这个数组也就是样本的 Label,是神经网络最期望的输出结果。我们用交叉熵损失函数来衡量网络的实际输出与正确标签的差异,利用这种差异经过反向传播去更新网络参数。
交叉熵:它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,则交叉熵定义为:

那么该公式如何表示,举个例子,假设N=3,期望输出为p = (1,0,0),实际输出q1 = (0.5,0.2,0.3),q2 = (0.8,0.1,0.1),那么:

通过上面可以看出,q2与p更为接近,它的交叉熵也更小。
三. Pytorch中的CrossEntropyLoss()函数
Pytorch中计算的交叉熵并不是采用

这种方式计算得到的,而是交叉熵的另外一种方式计算得到的,如下公式所示,它是交叉熵的另外一种方式。

Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果。
- Softmax后的数值都在0~1之间,所以ln之后值域是负无穷到0。
- 然后将Softmax之后的结果取log,将乘法改成加法减少计算量,同时保障函数的单调性 。
- NLLLoss的结果就是把上面的输出与Label对应的那个值拿出来(下面例子中就是:将log_output\logsoftmax_output中与y_target对应的值拿出来),去掉负号,再求均值。
举例 :
import torch
import torch.nn as nn
x_input=torch.randn(3,3)#随机生成输入
print('x_input:\n',x_input)
y_target=torch.tensor([1,2,0])#设置输出具体值 print('y_target\n',y_target)
#计算输入softmax,此时可以看到每一行加到一起结果都是1
softmax_func=nn.Softmax(dim=1)
soft_output=softmax_func(x_input)
print

本文详细介绍了PyTorch中的CrossEntropyLoss函数,涵盖了其原理、计算方法、与LogSoftmax和NLLLoss的关系,以及实战演示。重点讲解了如何从softmax和负对数似然损失的角度理解该函数,并提供了自定义实现。
最低0.47元/天 解锁文章
743

被折叠的 条评论
为什么被折叠?



