一、nn.CrossEntropyLoss()交叉熵损失函数
1.函数介绍
信息量:它是用来衡量一个事件的不确定性的;一个事件发生的概率越大,不确定性越小,则它所携带的信息量就越小。假设X是一个离散型随机变量,其取值集合为X,概率分布函数为 ,我们定义事件 的信息量为:,当 时,熵将等于0,也就是说该事件的发生不会导致任何信息量的增加。
熵:它是用来衡量一个系统的混乱程度的,代表一个系统中信息量的总和;信息量总和越大,表明这个系统不确定性就越大。
交叉熵:它主要刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。交叉熵主要是用来判定实际的输出与期望的输出的接近程度,且交叉熵只关注真值非零的情况(通过后期的例子化简可以得知)。其计算方式为:
例如对于一个三分类问题,我们期望得到的是,其中一个预测为,另一个预测为,则两个预测的交叉熵分别为:
可以得知更为接近期望输出(交叉熵更小)。
2.使用示例
Pytorch中CrossEntropyLoss()函数的主要是将softmax-log-NLLLoss合并到一块得到的结果,所以在使用交叉熵函数之前不需要额外对input做softmax处理。
import torch
import torch.nn as nn
# 多分类问题,N是待预测目标个数,n_classes是类别总数
N = 1000
n_clssses = 16
# input是未经softmax处理的logit,target是分类真值
loss = nn.CrossEntropyLoss()
input = torch.randn(N, n_clssses, requires_grad=True)
target = torch.empty(N, dtype=torch.long).random_(n_clssses)
output = loss(input, target)
# input不可以是已经处理过的分类,如,(1,2,2,1,0),必须是float的概率值
nn.CrossEntropyLoss()参数解释
weight:一个可选的张量,用于对不同类别的损失进行加权。默认值为None,表示所有类别的损失权重相等。
size_average:一个布尔值,用于指定损失的计算方式。如果设置为True,则将损失进行平均;如果设置为False,则将损失进行求和。默认值为True。
ignore_index:一个整数,用于指定忽略的目标标签的索引。如果设置了该参数,则在计算损失时会忽略该索引对应的标签。默认值为-100。
reduction:一个字符串,用于指定损失的缩减方式。可选值有"mean"、“sum"和"none”。如果设置为"mean",则将损失进行平均;如果设置为"sum",则将损失进行求和;如果设置为"none",则不进行缩减,返回每个样本的损失值。默认值为"mean"。
3.参考资料
Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解 - 知乎 (zhihu.com)
二、nn.BCELoss()二进制交叉熵损失函数
1.函数介绍
当交叉熵函数的类数为两类的特殊情况时,即变为二分类交叉熵函数,公式则变为:
2.使用示例
此损失函数接受两个张量,第一个张量是正分类标签的概率值(满足概率的取值范围0-1),第二个张量是以0为负分类标签、1为正分类标签的目标数据值,且都必须为浮点类型。
import torch
import torch.nn as nn
# 二分类问题,N是待预测目标个数,n_classes是类别总数
N = 1000
n_clssses = 2
loss = nn.BCELoss()
input = torch.randn(N) # input.shape=(N)
target = torch.empty(N,dtype=torch.float).random_(n_clssses) # target.shape=(N)
output = loss(torch.sigmoid(input), target) # input一定要先处理为0-1之间的概率
三、nn.BCEWithLogitsLoss()对数交叉熵损失函数
1.函数介绍
与二进制交叉熵损失函数类似,唯一不同点就是不需要对input进行sigmoid处理。
2.使用示例
import torch
import torch.nn as nn
# 二分类问题,N是待预测目标个数,n_classes是类别总数
N = 1000
n_clssses = 2
loss = nn.BCELoss()
input = torch.randn(N) # input.shape=(N)
target = torch.empty(N,dtype=torch.float).random_(n_clssses) # target.shape=(N)
output = loss(input, target) # input一定要先处理为0-1之间的概率
四、