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 的張量。
添加回答
舉報