Pytorch如何自定義損失函式(Loss Function)?

時間 2021-05-05 19:16:26

1樓:

vector的回答已經比較詳細地介紹了自己寫pytorch 裡loss function 的方法。但是在你自己去定義loss function前需要明白pytorch的自動求導機制,從而避免很多問題。

1.你想用的loss function究竟能不能作為loss function來監督學習。很多時候我們想要讓test的結果適應與你的metric,那麼第一想法是我直接拿評價標準作為loss唄,譬如影象超分辨用MSE訓練,用PSNR測試,這是可行的,因為他們「可導」。

但是很多時候,任務的評價標準是複雜的,裡面可能有閾值設定、統計操作,你希望直接用這個評價標準做loss並不一定可行,它不可導。

2.了解torch的求導機制(autograd)。用pytorch訓練時,似乎只用加個requires_grad=True網路就什麼都給我們算了,但是往往我們自己去寫loss function時會存在loss沒有grad_fn的情況,那麼你需要了解torch裡的結構圖、張量、葉子節點等有關torch是如何完成自動求導過程的。

可以參考如下回答:

xiaopl:PyTorch 的 Autograd

這也是@vector三種寫loss function方法裡為什麼有的需要自己寫backward有的只用定義forward的原因,以及為什麼最好用torch的運算而不要轉成numpy的原因,因為要保證tensor在「管道」裡流動。

2樓:Bruce

我感覺沒必要繼承 nn.Module,因為很多時候計算 loss,中間都沒有額外的變數需要儲存或者算梯度。我有時候就直接寫個正常的函式,或者類似像這樣子 loss = torch.

sum(x - y) 就完了。

3樓:

從 code 裡面可以看到loss 函式部分繼承自_loss, 部分繼承自_WeightedLoss,而_WeightedLoss繼承自_loss, _loss繼承自nn.Module.

與定義乙個新的模型類相同,定義乙個新的loss function 你只需要繼承nn.Module就可以了

乙個 pytorch 常見問題的 jupyter notebook 鏈結為A-Collection-of-important-tasks-in-pytorch

import

torch.nn

asnn

Class

NewLoss(nn

.Module

):def

__init__

():pass

defforward

():pass

keras如何自定義triplet loss損失函式?

周周周 請問我想用keras自定義loss函式,loss y true 0 log y pred y true 0 log 1 y pred 我在實現過程中老是報錯,能麻煩您指導下嗎 其中 x 表示滿足x條件返回1 否則返回0 Rainman 22 這種操作是可以的。我用keras試驗過可行。但是最...

Swift Haskell 等可以自定義運算子的語言(不僅是過載),實現編譯器時跟其他語言有什麼區別?

深海 其他語言我不太了解,簡單說一下 Swift 的實現.Swift Haskell 還有不少函式式語言實現運算子的思路是一樣的 規定運算子必須由某些特殊字元構成,且這些字元和構成識別符號 identifier 的字符集的交集為空.這樣一來,lexer 就很簡單了,和傳統編譯器沒差.除了中綴 二元 ...

自定義android studio的配置檔案目錄後,無法正常安裝和解除安裝外掛程式,是何原因?

大攀 這個問題我解決了,應該是配置plugins路徑的問題,直接貼修復好的配置 idea.config.path D AndroidStudio2.0 config Uncomment this option if you want to customize path to IDE system f...