天天看點

Pytorch損失函數

學習過程知識粗略記錄,用于個人了解和日後檢視

包導入

import torch
from torch import nn
           

MSELoss-均方差損失

  • 常用于回歸問題中
  • 對于每一個輸入執行個體都隻有一個輸出值,把所有輸入執行個體的預測值和真實值見的誤差求平方,然後取平均
  • 定義:

    class torch.nn.MSELoss(size_average=True,reduce=True)

參數含義
  • size_average

    :預設為

    True

    ,此時損失為每個

    minibatch

    的平均;

    False

    時,損失為每個

    minibatch

    的求和。這個屬性隻有在

    reduce

    設定為True時才生效
  • reduce

    True

    ,損失根據

    size_average

    的值計算;

    False

    時,忽略

    size_average

    值,傳回每個元素的損失
loss=nn.MSELoss()
input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2,3)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch損失函數

L1Loss-MAE平均絕對誤差

  • 傳回資料集上所有誤差絕對值的平均數
  • class torch.nn.L1Loss(size_average=True,reduce=True)

    ,參數與

    MSE

    相同
loss=nn.L1Loss()
input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2,3)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch損失函數

BCELoss

  • 常用于二分類問題中
  • class torch.nn.BCELoss(weight=None, size_average=True, reduce=True)

參數定義:
  • weight

    :指定

    batch

    中的每個元素的

    Loss

    權重,必須是一個長度和

    batch

    相等的

    Tensor

  • 值得注意的是,每個目标值都要求在

    (0,1)

    之間,可以在網絡最後一層加一個

    Sigmoid

    解決這個問題
m = nn.Sigmoid()
loss = nn.BCELoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
print(input)
print(target)
output = loss(m(input), target)
output.backward()
print(output)
           
Pytorch損失函數

BCEWithLogitsLoss

  • 同樣用于二分類問題,他将

    Sigmoid

    集合在了函數中,因而實際使用中會比

    BCELoss

    在數值上更加穩定
  • class torch.nn.BCEWithLogitsLoss(weight=None, size_average=True, reduce=True)

    ,參數同

    BCELoss

    一緻
loss = nn.BCEWithLogitsLoss()
input = torch.randn(3, requires_grad=True)
target = torch.empty(3).random_(2)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch損失函數

NLLLoss-負對數似然損失函數

  • 應用于多分類任務中,用C表示多分類任務中的類别個數,

    N

    表示

    minibatch

    ,則

    NLLLoss

    的輸入必須是

    (N,C)

    的二維

    Tensor

    ,也就是每個執行個體對應的每個類别的對數機率,可以在網絡的最後一層加

    LogSoftmax

    層來實作
  • 定義:

    class torch.nn.NLLLoss(weight=None, size_average=True, ignore_index=-100,reduce=True)

參數含義:
  • weight

    :指定一個一維的

    Tensor

    ,用來設定每個類别的權重(非必須項)
  • ignore_index

    :設定一個被忽略值,使這個值不會影響到輸入的梯度計算,

    size_average

    True

    時,

    loss

    的平均值也會忽略該值
  • 值得注意的時,輸入根據

    reduce

    而定,

    True

    則輸出一個标量,

    False

    則輸出

    N

m = nn.LogSoftmax(dim=1)
loss = nn.NLLLoss()
# input is of size N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
# each element in target has to have 0 <= value < C
target = torch.tensor([1, 0, 4])
print(input)
print(target)
output = loss(m(input), target)
output.backward()
print(output)
           
Pytorch損失函數

CrossEntropyLoss-交叉熵損失

  • 用于多分類問題,

    LogSoftmax

    NLLLoss

    的組合
  • class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100,reduce=True)

    ,參數含義與

    NLLLoss

loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
print(input)
print(target)
output = loss(input, target)
output.backward()
print(output)
           
Pytorch損失函數

如有錯誤,歡迎指正

同時釋出在CSDN中:https://blog.csdn.net/tangkcc/article/details/119803598

繼續閱讀