日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch框架学习十二——损失函数

發布時間:2024/7/23 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.0

    2.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進行比較:

    inputs = torch.linspace(-3, 3, steps=500)target = torch.zeros_like(inputs)loss_f = nn.SmoothL1Loss(reduction='none')loss_smooth = loss_f(inputs, target)loss_l1 = np.abs(inputs.numpy())plt.plot(inputs.numpy(), loss_smooth.numpy(), label='Smooth L1 Loss')plt.plot(inputs.numpy(), loss_l1, label='L1 loss')plt.xlabel('x_i - y_i')plt.ylabel('loss value')plt.legend()plt.grid()plt.show()

    繪制的結果為:

    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,公式為:

    權重的設置在數據不平衡時非常關鍵。

    參數如下所示:

  • weight:各類別的loss設置權值。
  • ignore_index:忽略某個類別。
  • reduction:同上。
  • 舉個栗子:

    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')

    主要參數:

  • log_input:輸入是否為對數形式,決定計算公式是哪一個。
  • full:計算所有的loss,默認為False。
  • eps:修正項,避免log(input)為nan。
  • reduction:同上。
  • 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框架学习十二——损失函数的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。