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

enter image description here

Самый простой способ для цикла (для 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)?

1
Mohsen 20 Фев 2020 в 04:45

2 ответа

Лучший ответ

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

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

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

0
Mohsen 24 Мар 2020 в 01:35

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

Итак, изображение у вас есть 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

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

0
André Pacheco 20 Фев 2020 в 03:07