BCE loss和 CE理解
1. BCE loss:Binary Cross Entropy Loss
BCE loss pytorch官網鏈接
1.1 解釋
pytorch中調用如下。設置weight,使得不同類別的損失權值不同。
其中x是預測值,取值范圍(0,1), target是標簽,取值為0或1.
在Retinanet的分類部分最后一層的激活函數用的是sigmoid,損失函數是BCE loss.BCE loss可以對單個類別進行求損失,配合sigmoid(每個類別單獨求概率,不同類別間互不影響)。相當于是把每個類別都看成了二分類的問題,為后面使用Focal Loss做準備。
Focal Loss是針對目標檢測任務中正負樣本不均橫提出的,通過使用Focal Loss,使得易于分類的背景類別的損失相對于不適用會大幅降低。
1.2 實現代碼
import torch from torch.nn import BCELoss import torch.nn as nny = torch.randn((2,3)) target = torch.tensor([[0,0,1],[1,0,0]],dtype=torch.float32)m = nn.Sigmoid()# BEC的輸入變量的取值范圍[0,1] y = m(y) print('y',y) print('target',target)loss_func = BCELoss() loss = loss_func(y,target)def compute_bce(y,target):b = y.shape[0]loss = 0for i in range(b): # 多少個實例for j in range(len(y[i])):# 每個實例有多少個類別if target[i][j] == 0.:temp_loss = torch.log(1-y[i][j])else:temp_loss = torch.log(y[i][j])loss -= temp_lossreturn loss/(b*y.shape[1]) loss_ = compute_bce(y,target)print('loss',loss) print('loss',loss_)輸出
y tensor([[0.3410, 0.1810, 0.1073],[0.7485, 0.6879, 0.2198]]) target tensor([[0., 0., 1.],[1., 0., 0.]]) loss tensor(0.7586) loss compute tensor(0.7586)1.3 求解過程
BCE Loss默認求誤差的方式是取平均。
預測值y,標簽是target
y的形式可以看成是三分類,共有兩個樣本
根據公式bce_loss(y,taqget)=?1NΣiN[target[i]?log(y[i])+(1?target[i])?log(1?y[i])]bce\_loss(y,taqget) = -\frac{1}{N}\Sigma_{i}^{N}[target[i]*log(y[i]) + (1-target[i])*log(1-y[i])]bce_loss(y,taqget)=?N1?ΣiN?[target[i]?log(y[i])+(1?target[i])?log(1?y[i])]
這個是求均值的方式。
[0.3410, 0.1810, 0.1073]對應的標簽為[0., 0., 1.]
對于第一個實例,它的損失為
?13[[0?log(0.3410)+(1?0)?log(1?0.3410)]+[0?log(0.1810)+(1?0)?log(1?0.1810)]+[1?log(0.1073)+(1?1)?log(1?0.1810)]]-\frac{1}{3}[[0*log(0.3410)+(1-0)*log(1-0.3410)] + [0*log(0.1810)+(1-0)*log(1-0.1810)] + [1*log(0.1073)+(1-1)*log(1-0.1810)] ] ?31?[[0?log(0.3410)+(1?0)?log(1?0.3410)]+[0?log(0.1810)+(1?0)?log(1?0.1810)]+[1?log(0.1073)+(1?1)?log(1?0.1810)]],
三個類別單獨求損失,然后加起來取平均
與BCE Loss 類似的是BCEWithLogiticsLoss,不同之處在于對預測值加了sigmoid變化
2. CE Loss
CE: Cross Entropy
2.1 解釋
pytorch 官網介紹
設置weight,使得不同類別的損失權值不同。
輸入變量:預測值input和target.
處理過程:先對input求softmax,然后對每個概率取對數,再求NLLLoss(negative log likelihood loss,負對數似然損失)
2.2 代碼實現
import torch import torch.nn as nn loss = nn.CrossEntropyLoss() input = torch.randn(3, 5, requires_grad=True) target = torch.empty(3, dtype=torch.long).random_(5) output = loss(input, target) output.backward() print('input',input) print('target',target) print('output loss',output)def compute_ce(input,target):input = nn.Softmax(dim=-1)(input)b = input.shape[0]loss = 0for i in range(b):# input[i] 第i個樣本對應的預測概率# target[i]樣本標簽# 取出input[i]中索引為target[i]的概率值temp_loss = -1*torch.log(input[i][target[i]])loss += temp_lossloss = loss/breturn loss loss_compute = compute_ce(input,target) print('compute_loss',loss_compute)輸出
input tensor([[ 5.1491e-01, 4.8284e-01, -5.4881e-01, 3.3695e-01, -9.2449e-01],[ 7.5421e-01, -1.3219e+00, 8.3139e-02, -9.4772e-02, 9.4742e-01],[-3.5083e-01, 1.1744e+00, -1.0697e+00, 1.9165e-03, -2.4743e+00]],requires_grad=True) target tensor([2, 4, 4]) output tensor(2.4776, grad_fn=<NllLossBackward>) compute loss tensor(2.4776, grad_fn=<DivBackward0>)2.3 過程
總結
以上是生活随笔為你收集整理的BCE loss和 CE理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch中tensorboard使
- 下一篇: python中argparse模块