pytorch: сумма перекрестной энтропии по всем классам - PullRequest
1 голос
/ 20 февраля 2020

Я хочу вычислить сумму перекрестной энтропии по всем классам для каждого прогноза, где входные данные являются пакетными (размер n), а выходные - пакетными (размер n).

enter image description here

Самый простой способ для l oop (для 1000 классов):

def sum_of_CE_lost(input):
    L = 0
    for c in range(1000):
        L = L + torch.nn.CrossEntropyLoss(input, c)
    return L

Однако это очень медленный. Какой способ лучше? Как мы можем распараллелить его для GPU (CUDA)?

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Я нашел ответ:

torch.nn.functional.log_softmax (input).sum() / input.shape[0]

Делим на input.shape [0], потому что cross_entropy () по умолчанию принимает среднее значение по измерению пакета.

0 голосов
/ 20 февраля 2020

Прежде всего, чтобы сделать это быстрее, нужно его векторизовать, то есть работать с матрицами.

Итак, у вас есть 1000 образцов для расчета потерь. Кроме того, ваша проблема классификации имеет 5 меток. Для вычисления CrossEntropyLoss нам нужны входные данные и цель. Давайте смоделируем это следующим образом:

loss = nn.CrossEntropyLoss() # the loss function
input = torch.randn(1000, 5) #1000 samples and 5 labels' predictions
target = torch.empty(1000, dtype=torch.long).random_(5) # 1000 samples with labels from 0 to 4
loss_value = loss(input, target) # It'll output the loss

Там мы go! Теперь потери рассчитываются с учетом 1000 образцов. Это самый лучший способ сделать это.

...