1 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊
問(wèn)題是它們有不同的實(shí)現(xiàn)。
正如 pytorch文檔所說(shuō),nn.CrossEntropyLoss將nn.LogSoftmax()和組合nn.NLLLoss()在一個(gè)類(lèi)中。但是,tensorflow文檔指定keras.backend.categorical_crossentropy默認(rèn)情況下不應(yīng)用 Softmax,除非您設(shè)置from_logits為 True。出于這個(gè)原因,keras.backend.categorical_crossentropy除非您使用from_logits=True.
如果你不想事先應(yīng)用 softmax,你應(yīng)該使用:
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)
否則,您可以在計(jì)算 categorical_crossentropy 之前手動(dòng)應(yīng)用 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)
因此,您不應(yīng)像在示例中那樣使用keras.backend.categorical_crossentropywith 。from_logits=False
tf.keras.backend.categorical_crossentropy
target:與輸出形狀相同的張量。
output:由 softmax 產(chǎn)生的張量(除非 from_logits 為 True,在這種情況下輸出預(yù)計(jì)為 logits)。
from_logits:布爾值,輸出是 softmax 的結(jié)果,還是 logits 的張量。
添加回答
舉報(bào)