softmax_cross_entropy_with_logits в pytorch - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужен эквивалент тензорного потока 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)

...