我找到了here的帖子。在这里,我们试图在PyTorch中找到tf.nn.softmax_cross_entropy_with_logits
的等价物。答案对我来说仍然很困惑。
下面是Tensorflow 2
代码
import tensorflow as tf
import numpy as np
# here we assume 2 batch size with 5 classes
preds = np.array([[.4, 0, 0, 0.6, 0], [.8, 0, 0, 0.2, 0]])
labels = np.array([[0, 0, 0, 1.0, 0], [1.0, 0, 0, 0, 0]])
tf_preds = tf.convert_to_tensor(preds, dtype=tf.float32)
tf_labels = tf.convert_to_tensor(labels, dtype=tf.float32)
loss = tf.nn.softmax_cross_entropy_with_logits(logits=tf_preds, labels=tf_labels)
它给予loss
作为
<tf.Tensor: shape=(2,), dtype=float32, numpy=array([1.2427604, 1.0636061], dtype=float32)>
下面是PyTorch
代码
import torch
import numpy as np
preds = np.array([[.4, 0, 0, 0.6, 0], [.8, 0, 0, 0.2, 0]])
labels = np.array([[0, 0, 0, 1.0, 0], [1.0, 0, 0, 0, 0]])
torch_preds = torch.tensor(preds).float()
torch_labels = torch.tensor(labels).float()
loss = torch.nn.functional.cross_entropy(torch_preds, torch_labels)
但是,它会引发:
运行时错误:预期1D目标Tensor,不支持多目标
看来这个问题还是没有解决,如何在PyTorch中实现tf.nn.softmax_cross_entropy_with_logits
?
那么tf.nn.sigmoid_cross_entropy_with_logits
呢?
2条答案
按热度按时间mzsu5hc01#
-第一个月第一个月
F.cross_entropy
。后者只能处理单类分类设置。而不是更一般的多类分类情况,即标签可以由多个类组成。实际上,F.cross_entropy
将唯一的类ID作为目标(每个示例),而不是tf.nn.softmax_cross_entropy_with_logits
可以期望接收的类的概率分布。为了得到所需的结果,对你的logits应用log-softmax,然后取负对数似然:
-
tf.nn.sigmoid_cross_entropy_with_logits
(第四个数字)对于这个,您可以应用
F.binary_cross_entropy_with_logits
。这相当于先应用S形,然后应用负对数似然,将每个类视为二元分类任务:
torch.nn.functional
导入为F
*。yptwkmov2#
nn.CrossEntropyLoss的输出与
tf.nn.softmax_cross_entropy_with_logits
相同reduction
参数默认为mean。我将其设置为none
以匹配您的输出。nn.BCEWithLogitsLoss的输出与
tf.nn.sigmoid_cross_entropy_with_logits
相同