亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

像在 Keras 中一樣在 pytorch 中獲取交叉熵損失

像在 Keras 中一樣在 pytorch 中獲取交叉熵損失

Cats萌萌 2022-12-27 10:16:06
我正在努力將分類模型從 keras 移植到 pytorch。特別是交叉熵損失似乎返回完全不同的數字。import numpy as npimport torch as timport torch.nn as nnimport tensorflow.keras.backend as Ky_true = np.array([[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]])y_pred = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1, 0.41, 0.31, 0.21, 0.11]])print("Keras", K.categorical_crossentropy(K.constant(y_true), K.constant(y_pred)))print("PyTorch", nn.CrossEntropyLoss()(t.tensor(y_pred).argsort(dim=-1).float(), t.tensor(y_true).argmax(dim=-1)))```印刷:Keras tf.Tensor([2.3369865], shape=(1,), dtype=float32)PyTorch 張量 (1.4587)由于我有一個自定義損失函數,其中交叉熵是其中的一部分,因此我需要獲得相似(如果不是相同)的數字。
查看完整描述

1 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

問題是它們有不同的實現。


正如 pytorch文檔所說,nn.CrossEntropyLoss將nn.LogSoftmax()和組合nn.NLLLoss()在一個類中。但是,tensorflow文檔指定keras.backend.categorical_crossentropy默認情況下不應用 Softmax,除非您設置from_logits為 True。出于這個原因,keras.backend.categorical_crossentropy除非您使用from_logits=True.


如果你不想事先應用 softmax,你應該使用:


import numpy as np

import torch as t

import torch.nn as nn

import tensorflow.keras.backend as K


y_true = np.array([[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]])

y_pred = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1, 0.41, 0.31, 0.21, 0.11]])



print("Keras", K.categorical_crossentropy(K.constant(y_true), K.constant(y_pred), from_logits=True))

# output: Keras tf.Tensor([2.408051], shape=(1,), dtype=float32)

print("PyTorch", nn.CrossEntropyLoss()(t.tensor(y_pred).float(), t.tensor(y_true).argmax(dim=-1)))

# output: PyTorch tensor(2.4081)

否則,您可以在計算 categorical_crossentropy 之前手動應用 Softmax


import numpy as np

import torch as t

import torch.nn as nn

import tensorflow.keras.backend as K


y_true = np.array([[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]])

y_pred = np.array([[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 1, 0.41, 0.31, 0.21, 0.11]])



print("Keras", K.categorical_crossentropy(K.constant(y_true), K.softmax(K.constant(y_pred))))

# output: Keras tf.Tensor([2.408051], shape=(1,), dtype=float32)

print("PyTorch", nn.CrossEntropyLoss()(t.tensor(y_pred).float(), t.tensor(y_true).argmax(dim=-1)))

# output: PyTorch tensor(2.4081)

因此,您不應像在示例中那樣使用keras.backend.categorical_crossentropywith 。from_logits=False


tf.keras.backend.categorical_crossentropy


target:與輸出形狀相同的張量。


output:由 softmax 產生的張量(除非 from_logits 為 True,在這種情況下輸出預計為 logits)。


from_logits:布爾值,輸出是 softmax 的結果,還是 logits 的張量。


查看完整回答
反對 回復 2022-12-27
  • 1 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號