PyTorch框架学习十二——损失函数
PyTorch框架學習十二——損失函數
- 一、損失函數的作用
- 二、18種常見損失函數簡述
- 1.L1Loss(MAE)
- 2.MSELoss
- 3.SmoothL1Loss
- 4.交叉熵CrossEntropyLoss
- 5.NLLLoss
- 6.PoissonNLLLoss
- 7.KLDivLoss
- 8.BCELoss
- 9.BCEWithLogitsLoss
- 10.MarginRankingLoss
- 11.HingeEmbeddingLoss
- 12.MultiLabelMarginLoss
- 13.SoftMarginLoss
- 14.MultiLabelSoftMarginLoss
- 15.nn.CosineEmbeddingLoss
- 16.MultiMarginLoss
- 17.TripletMarginLoss
- 18.CTCLoss
之前的筆記寫過,一個深度學習/機器學習模型的實現過程主要來說包括五部分:數據、模型、損失函數、最優化和迭代過程。前面的筆記已經介紹了數據部分和模型部分,這次筆記主要介紹損失函數。
因為在實際使用中根據不同的實際情況會選擇不同的損失函數,所以對損失函數的公式推導就不涉及了,以后具體用到什么再寫什么吧,這次筆記聚焦于PyTorch中損失函數的構建與工作原理,并簡單介紹常用的18種損失函數,具體公式推導應參考相關論文,這里不詳細推導。
一、損失函數的作用
損失函數簡單來說就是用來衡量模型輸出(預測值)與真實標簽(真實值)的差異的。
有三個概念很容易混淆:
其中,損失函數是關于某一個具體樣本的衡量,代價函數是所有樣本的損失的平均,目標函數是在代價函數的基礎上加上正則化。
二、18種常見損失函數簡述
1.L1Loss(MAE)
功能:計算inputs與targets之差的絕對值。
torch.nn.L1Loss(size_average=None, reduce=None, reduction: str = 'mean')參數只需要關注reduction,因為size_average和reduce兩個結合做了reduction的事,以后PyTorch會舍棄這兩個參數,下面每個損失函數都有這兩個參數,就不提了。
reduction是一個字符串參數,能取三個值:‘none’、‘mean’、‘sum’,因為現在計算loss基本都是一個batch的數據樣本不是一個單獨的樣本,所以這三個值分別代表對一個batch的樣本分別求loss、求所有loss的均值、求loss的和。
看一個例子:
inputs = torch.ones((2, 2)) target = torch.ones((2, 2)) * 3loss_none = nn.L1Loss(reduction='none') loss1 = loss_none(inputs, target) print("input:{}\n\ntarget:{}\n\nL1 loss_none:{}".format(inputs, target, loss1))loss_mean = nn.L1Loss(reduction='mean') loss2 = loss_mean(inputs, target) print("\nL1 loss_mean:{}".format(loss2))loss_sum = nn.L1Loss(reduction='sum') loss3 = loss_sum(inputs, target) print("\nL1 loss_mean:{}".format(loss3))輸出:
input:tensor([[1., 1.],[1., 1.]])target:tensor([[3., 3.],[3., 3.]])L1 loss_none:tensor([[2., 2.],[2., 2.]])L1 loss_mean:2.0L1 loss_mean:8.02.MSELoss
功能:計算inputs與targets之差的平方。
torch.nn.MSELoss(size_average=None, reduce=None, reduction: str = 'mean')這個損失函數與L1Loss形式上很相似,直接舉例:
inputs = torch.ones((2, 2)) target = torch.ones((2, 2)) * 3loss_f_mse = nn.MSELoss(reduction='none') loss_mse = loss_f_mse(inputs, target)print("input:{}\n\ntarget:{}\n\nMSE loss:{}".format(inputs, target, loss_mse))輸出:
input:tensor([[1., 1.],[1., 1.]])target:tensor([[3., 3.],[3., 3.]])MSE loss:tensor([[4., 4.],[4., 4.]])3.SmoothL1Loss
功能:平滑的L1Loss。
torch.nn.SmoothL1Loss(size_average=None, reduce=None, reduction: str = 'mean')其公式為:
我們將真實值全部設置為0,就可以繪制出其損失函數的樣子,并與L1Loss進行比較:
繪制的結果為:
4.交叉熵CrossEntropyLoss
功能:nn.LogSoftmax()與nn.NLLLoss()結合,進行交叉熵計算。
torch.nn.CrossEntropyLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')交叉熵損失是分類問題中常用的損失函數,它的計算公式如下:
若再考慮權重weight,公式為:
權重的設置在數據不平衡時非常關鍵。
參數如下所示:
舉個栗子:
inputs = torch.tensor([[1, 2], [1, 3], [1, 3]], dtype=torch.float) target = torch.tensor([0, 1, 1], dtype=torch.long)loss_f_none = nn.CrossEntropyLoss(weight=None, reduction='none') loss_none = loss_f_none(inputs, target)print("Cross Entropy Loss:\n ", loss_none)輸出:
Cross Entropy Loss:tensor([1.3133, 0.1269, 0.1269])5.NLLLoss
功能:實現負對數似然函數中的負號功能。
torch.nn.NLLLoss(weight: Optional[torch.Tensor] = None, size_average=None, ignore_index: int = -100, reduce=None, reduction: str = 'mean')舉例:
inputs = torch.tensor([[1, 2], [1, 3], [1, 3]], dtype=torch.float) target = torch.tensor([0, 1, 1], dtype=torch.long)weights = torch.tensor([1, 1], dtype=torch.float) loss_f_none_w = nn.NLLLoss(weight=weights, reduction='none') loss_none_w = loss_f_none_w(inputs, target)print("\nweights: ", weights) print("NLL Loss", loss_none_w, loss_sum, loss_mean)輸出為:
weights: tensor([1., 1.]) NLL Loss tensor([-1., -3., -3.])6.PoissonNLLLoss
功能:泊松分布的負對數似然損失函數。
torch.nn.PoissonNLLLoss(log_input: bool = True, full: bool = False, size_average=None, eps: float = 1e-08, reduce=None, reduction: str = 'mean')主要參數:
7.KLDivLoss
功能:計算KLD,KL散度。
torch.nn.KLDivLoss(size_average=None, reduce=None, reduction: str = 'mean', log_target: bool = False)8.BCELoss
功能:二分類交叉熵。
torch.nn.BCELoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')注意:輸入值取值在[0,1]。
9.BCEWithLogitsLoss
功能:結合Sigmoid與二分類交叉熵。
torch.nn.BCEWithLogitsLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean', pos_weight: Optional[torch.Tensor] = None)注意:網絡最后不加sigmoid函數。
10.MarginRankingLoss
功能:計算兩個向量之間的相似度,用于排序任務。
torch.nn.MarginRankingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')說明:該方法計算兩組數據之間的差異,返回一個n×n的loss矩陣。
11.HingeEmbeddingLoss
功能:計算兩個輸入的相似性,常用于非線性embedding和半監督學習。
torch.nn.HingeEmbeddingLoss(margin: float = 1.0, size_average=None, reduce=None, reduction: str = 'mean')12.MultiLabelMarginLoss
功能:多標簽邊界損失函數。
torch.nn.MultiLabelMarginLoss(size_average=None, reduce=None, reduction: str = 'mean')13.SoftMarginLoss
功能:計算二分類的logistic損失。
torch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction: str = 'mean')14.MultiLabelSoftMarginLoss
功能:SoftMarginLoss多標簽版本。
torch.nn.MultiLabelSoftMarginLoss(weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')15.nn.CosineEmbeddingLoss
功能:采用余弦相似度計算兩個輸入的相似性。
torch.nn.CosineEmbeddingLoss(margin: float = 0.0, size_average=None, reduce=None, reduction: str = 'mean')16.MultiMarginLoss
功能:計算多分類的折頁損失。
torch.nn.MultiMarginLoss(p: int = 1, margin: float = 1.0, weight: Optional[torch.Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean')17.TripletMarginLoss
功能:三元組損失,人臉驗證中常用。
torch.nn.TripletMarginLoss(margin: float = 1.0, p: float = 2.0, eps: float = 1e-06, swap: bool = False, size_average=None, reduce=None, reduction: str = 'mean')18.CTCLoss
功能:計算CTC損失,解決時序類數據的分類。
torch.nn.CTCLoss(blank: int = 0, reduction: str = 'mean', zero_infinity: bool = False)總結
以上是生活随笔為你收集整理的PyTorch框架学习十二——损失函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2013中CUDA的配置
- 下一篇: QT中的QButtonGroup