Мне нужен эквивалент тензорного потока tf.nn.softmax_cross_entropy_with_logits
в pytorch. Я сталкивался с torch.nn.functional.cross_entropy
, но он не принимает тот же формат измерения, что и tf.nn.softmax_cross_entropy_with_logits
. ниже приведен пример в pytorch '1.4.0'
, который выдает ошибку:
labels = torch.tensor([958, 85, 244, 182, 294], dtype=torch.float)
logits = torch.tensor([24.131283, 25.147522, 38.882504, 25.451395, 30.272345], dtype=torch.float)
print(torch.nn.functional.cross_entropy(logits, labels))
Я получил ошибку Dimension out of range (expected to be in range of [-1, 0], but got 1)
Ниже приведен аналогичный пример в tensorflow '2.2.0-rc3'
, который работает нормально:
label = [958, 85, 244, 182, 294]
logits = [24.131283, 25.147522, 38.882504, 25.451395, 30.272345]
print(tf.nn.softmax_cross_entropy_with_logits(label,logits))
Я получил <tf.Tensor: shape=(), dtype=float32, numpy=20275.318>
в качестве вывода
То же самое tf.nn.softmax_cross_entropy_with_logits(label,logits)
можно записать как:
label = [958, 85, 244, 182, 294]
logits = [24.131283, 25.147522, 38.882504, 25.451395, 30.272345]
print(-tf.reduce_sum(label * tf.math.log(tf.nn.softmax(logits)),axis=0))
, поэтому, используя аналогичный подход, я написал эквивалентную функцию в pytorch как:
labels = torch.tensor([958, 85, 244, 182, 294], dtype=torch.float)
logits = torch.tensor([24.131283, 25.147522, 38.882504, 25.451395, 30.272345], dtype=torch.float)
print(-torch.sum(labels*torch.log(torch.nn.functional.softmax(logits,dim=0)),axis=0))
и здесь я получил правильный ответ tensor(20275.3184)
Мой вопрос заключается в том, есть ли какая-либо функция в pytorch, которая делает что-то похожее на torch.sum(labels*torch.log(torch.nn.functional.softmax(logits,dim=0)),axis=0)