二分类交叉熵,多分类交叉熵,focal loss
1:二分类交叉熵
a) 公式:
,其中
表示网络预测结果,是一个属于(0到1)的值,我们当然希望它们的值很接近1。
是真实标签,因为是二分类,所以,
的值为0或者1。网络最后一层一般为sigmoid。比如,网络最后一层sigmoid之后,网络输出为0.8,若
= 1,代入公式则loss = -1*log(0.8);若
= 0,loss=(1-0)*log(1-0.8)。
b) pytorch中的形式:criterion = nn.BCEWithLogitsLoss()
loss = criterion(
,
)
c) 计算:
- 第一种情况:out为网络输出,
它只是一个数,
也是一个数,
取值为0或1。
1,
= sigmoid(out)
2,根据公式,若
取值为0,
,若
取值为1,
,
例如:令out=1.2388,
=0,则
, loss=(1-0)*log(1-0.77535)=1.4932
- 第二种情况:out是一个tensor,shap=(batch),有batch个数,
是一个tensor,shape=(batch),所有数取值为0或者1。相当于求一个平均,和上面大同小异。
1:
= Sigmoid(out)
2:对tensor里每个数都求一次交叉熵。和上面步骤2一样。
3:对所有的loss求平均。
2:多分类交叉熵1
a) 公式:
,和上面的公式一样,只不过,现在把维度扩大,上面只有3个维度,这次有4个
b) pytorch中的形式:criterion = nn.CrossEntropyLoss()
loss = criterion(
,
)
c) 计算:out表示网络输出,shape=(batch,class,W,H),取值任意,
的shape=(batch,class,W,H),取值为[0,class]的整数。
例子:out.shape=(1,3,7,7)
out = tensor([[[0.4100,0.2784,0.8864,0.2563,0.6145,0.1003,0.2250],
[0.8236,0.3911,0.7626,0.4091,0.5717,0.1733,0.7634],
[0.6580,0.9722,0.0596,0.5479,0.9591,0.5731,0.7304]]])
y = tensor([0.4966,1.4566,0.1086, 1.6627,0.3579,0.6607,0.3494])
1:out进行softmax,再去对数log。具体操作是,对每一列的3个数字,进行softmax,使其3个数的概率加起来等于1,然后对这3个数取对数log。得到如下的结果(pytorch中代码是out.log_softmax(1))。
out = tensor([[[-1.3333,-1,4160,-0.8420,-1.2538,-1.2148,-1.3030,-1.4750],
[-0.9197,-1.3033,-0.9658,-1.1010,-1.2575,-1.2300,-0.9366],
[-1.0854,-0.7222,-1.6688,-0.9622,-0.8702,-0.8302,-0.9696]]])
2:将y变成y.long() 则y=tensor([0,2,0,1,0,0,0])
3:y的取值,解释一下,0,2,0,1,0,0,0表示第1个元素要从第1=(0+1)行取,第2个元素要从第3=(2+1)行取,第3个元素要从第1=(0+1)行取,第4个元素要从第2=(1+1)行取,第5个元素要从第1=(0+1)行取,以此类推。最终的结果 [-1.3333,-0.7222,-0.8420,-1.1010,-1.2148,-1.3030,-1.4750]
在pytorch中的代码是:loss_tmp = nll_loss(log_softmax(out,1))
4:将上面得到的数字取反,再求平均值。最终结果为:1.1416
3:多分类交叉熵2
a) 公式:
,其中n表示一个batch中有n个样本,k表示任务是k分类的,如果手写数字mnist分类,k就 等于10。比如以5分类为例,网络的最后一层softmax输出是(0.1,0.3,0.4,0.1,0.1),标签是(0,1,0,0,0),则最后的损失loss为:
b) pytorch中的形式:criterion = nn.CrossEntropyLoss()
loss = criterion(
,
)
c) 计算:out表示网络输出,shape=(batch,class,lines),取值任意,
的shape=(batch,class,lines),取值为[0,class]的整数。
例子:out.shape=(1,3,7,7),现在模拟的是一张图片,宽高为7*7,深度为3,batch为1
y = tensor([1.7231,2.9731,1.0058,0.9391,0.4274,0.9307,0.043])
1:out进行softmax,再去对数log。具体操作是,(类似上图标红的3个数),进行softmax,使其3个数的概率加起来等于1,得到如下结果,可以看到下图圈出的3个数,加起来概率为1。
然后对这3个数取对数log。得到如下的结果(pytorch中代码是out.log_softmax(1))。
2:将y变成y.long() 则y=tensor([1,2,1,0,0,0,0]),y的值肯定是0,1,2,不会出现其他的数。
3:y的取值,解释一下,1,2,1,0,0,0,0表示从,第1行的元素要从第2(1+1)个矩阵中取,第2行的元素要从第3(2+1)个矩阵中取,第3行的元素要从第2(1+1)个矩阵中取,第4行的元素要从第1(0+1)个矩阵中取,以此类推。
在pytorch中的代码是:loss_tmp = nll_loss(log_softmax(out,1)),示意图如下。
最后得到的矩阵是:
4:将上面得到的数字取反,再求平均值。最终结果为:1.1080。
4:Focal Loss多分类)
公式:
,其中
表示网络输出只经过softmax,
,表示的是网络输出经过softmax之后再取log,Focal Loss还等价于
。
计算:令
,
,
则
,
![]()