Класс KLDivLoss
Класс KLDivLoss вычисляет расхождение Кульбака-Лейблера между входным тензором и целевым распределением. Входной тензор должен содержать логарифмы вероятностей, а целевой тензор - вероятности. Первым параметром конструктора можно указать параметр reduction, который определяет способ агрегации потерь: 'none', 'batchmean', 'sum' или 'mean'. По умолчанию используется 'mean'. Также можно передать параметр log_target для указания, что целевой тензор также содержит логарифмы.
Синтаксис
torch.nn.KLDivLoss(
reduction='mean',
log_target=False
)
Параметры:
-
reduction- способ агрегации:'none','batchmean','sum','mean'; -
log_target- логическое значение, указывает, что целевой тензор содержит логарифмы.
Пример
Создадим функцию потерь и вычислим KL-дивергенцию между двумя распределениями:
import torch
criterion = torch.nn.KLDivLoss()
input_t = torch.log(torch.tensor([0.4, 0.6]))
target_t = torch.tensor([0.5, 0.5])
res = criterion(input_t, target_t)
print(res)
Результат выполнения кода:
tensor(0.0501)
Пример
Вычислим потерю с агрегацией 'batchmean', которая делит сумму на размер пакета:
import torch
criterion = torch.nn.KLDivLoss(reduction='batchmean')
input_t = torch.log(torch.tensor([[0.3, 0.7], [0.4, 0.6]]))
target_t = torch.tensor([[0.5, 0.5], [0.5, 0.5]])
res = criterion(input_t, target_t)
print(res)
Результат выполнения кода:
tensor(0.0742)
Пример
Используем режим 'none' для получения поэлементных потерь:
import torch
criterion = torch.nn.KLDivLoss(reduction='none')
input_t = torch.log(torch.tensor([0.4, 0.6]))
target_t = torch.tensor([0.5, 0.5])
res = criterion(input_t, target_t)
print(res)
Результат выполнения кода:
tensor([0.1116, 0.0513])
Пример
Используем параметр log_target=True, когда целевой тензор также содержит логарифмы:
import torch
criterion = torch.nn.KLDivLoss(log_target=True)
input_t = torch.log(torch.tensor([0.4, 0.6]))
target_t = torch.log(torch.tensor([0.5, 0.5]))
res = criterion(input_t, target_t)
print(res)
Результат выполнения кода:
tensor(0.0501)
Пример
Вычислим KL-дивергенцию с агрегацией 'sum':
import torch
criterion = torch.nn.KLDivLoss(reduction='sum')
input_t = torch.log(torch.tensor([0.4, 0.6]))
target_t = torch.tensor([0.5, 0.5])
res = criterion(input_t, target_t)
print(res)
Результат выполнения кода:
tensor(0.1003)
Смотрите также
-
класс
CrossEntropyLoss,
который вычисляет кросс-энтропию между распределениями -
класс
NLLLoss,
который вычисляет отрицательное логарифмическое правдоподобие -
класс
MSELoss,
который вычисляет среднеквадратичную ошибку -
класс
BCELoss,
который вычисляет бинарную кросс-энтропию