Я нашел сообщение здесь. Здесь мы пытаемся найти эквивалент tf.nn.softmax_cross_entropy_with_logits в PyTorch. Ответ меня до сих пор сбивает с толку. Вот тензорный поток импорта кода Tensorflow 2 ...

0
jason 26 Дек 2020 в 20:06

1 ответ

Лучший ответ

tf.nn.softmax_cross_entropy_with_logits в PyTorch

Это эквивалент torch.nn.CrossEntropyLoss (F.cross_entropy). Однако необходимо разобраться в двух вещах:

  1. Вам нужно передать индексы целевого класса, а не весь целевой вектор, как One-Hot-Encoding. Для этого вы можете использовать torch.argmax, примененный к dim=1.

    Этот критерий ожидает, что индекс класса в диапазоне [0, C-1] [0, C − 1] будет целевым для каждого значения - torch.nn.CrossEntropyLoss Документация PyTorch

  2. По умолчанию torch.nn.functional.cross_entropy() будет принимать среднее значение всех потерь элементов пакета, вы можете предотвратить это, передав аргумент reduction='none'.

Если вы так позвоните:

loss = F.cross_entropy(torch_preds, torch.argmax(torch_labels, dim=1), reduction='none')

Вы получите желаемый результат:

tensor([1.2428, 1.0636])

tf.nn.sigmoid_cross_entropy_with_logits в PyTorch

Это немного сложнее, потому что в PyTorch нет прямого эквивалента. Однако вы можете реализовать это выражение самостоятельно. Учитывая цели logits и ярлыки p, определенные как:

logits = torch.tensor(preds)
p = torch.tensor(labels)

Сигмоидная перекрестная энтропия с логитами:

loss = p*-torch.log(torch.sigmoid(logits)) + (1-p)*-torch.log(1-torch.sigmoid(logits))

Который дает:

tensor([[0.9130, 0.6931, 0.6931, 0.4375, 0.6931],
        [0.3711, 0.6931, 0.6931, 0.7981, 0.6931]])

Вы можете проверить совпадение результатов:

tf.nn.sotfmax_cross_entropy_with_logits(logits=tf_preds, labels=tf_labels)

А также:

tf.nn.sigmoid_cross_entropy_with_logits(logits=tf_preds, labels=tf_labels)

Импортировав torch.nn.functional как F .

1
Ivan 26 Дек 2020 в 18:48