为了账号安全,请及时绑定邮箱和手机立即绑定

像在 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 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号