KLDivLoss
-
class torch.nn.KLDivLoss(size_average=None, reduce=None, reduction='mean', log_target=False)[source] -
Потеря расхождения Кульбака-Лейблера.
Для тензоров одинаковой формы , где является
inputи являетсяtarget, мы определяем точечное расхождение Кульбака-Лейблера какДля избежания проблем с потерей точности при вычислении этой величины, эта потеря ожидает аргумент
inputв логарифмическом пространстве. Аргументtargetтакже может быть предоставлен в логарифмическом пространстве, еслиlog_target= True.Вкратце, эта функция примерно эквивалентна вычислению
if not log_target: # default loss_pointwise = target * (target.log() - input) else: loss_pointwise = target.exp() * (target - input)а затем сокращению этого результата в зависимости от аргумента
reductionкакif reduction == "mean": # default loss = loss_pointwise.mean() elif reduction == "batchmean": # mathematically correct loss = loss_pointwise.sum() / input.size(0) elif reduction == "sum": loss = loss_pointwise.sum() else: # reduction == "none" loss = loss_pointwiseПримечание
Как и все другие потери в PyTorch, эта функция ожидает, что первый аргумент,
input, будет выходом модели (например, нейронной сети), а второй,target, — наблюдениями в наборе данных. Это отличается от стандартной математической нотации , где обозначает распределение наблюдений, а обозначает модель.Предупреждение
reduction= “mean”не возвращает истинное значение расхождения Кульбака-Лейблера, пожалуйста, используйтеreduction= “batchmean”, что соответствует математическому определению.- Параметры
-
-
size_average (bool, необязательно) – Устарело (см.
reduction). По умолчанию потери усредняются по каждому элементу потери в пакете. Обратите внимание, что для некоторых потерь существует несколько элементов на образец. Если полеsize_averageустановлено вFalse, потери вместо этого суммируются для каждой мини-пачки. Игнорируется, когдаreduceравноFalse. По умолчанию:True -
reduce (bool, необязательно) – Устарело (см.
reduction). По умолчанию потери усредняются или суммируются по наблюдениям для каждой мини-пачки в зависимости отsize_average. КогдаreduceравноFalse, возвращает потерю на элемент пакета вместо этого и игнорируетsize_average. По умолчанию:True -
reduction (str, необязательно) – Указывает операцию, которую нужно применить к выводу. По умолчанию:
“mean” -
log_target (bool, необязательно) – Указывает, является ли
targetлогарифмическим пространством. По умолчанию:False
-
size_average (bool, необязательно) – Устарело (см.
- Форма:
-
- Вход: , где означает любое количество измерений.
- Цель: , форма такая же, как у входных данных.
- Вывод: скаляр по умолчанию. Если
reductionравно‘none’, тогда , форма такая же, как у входных данных.
Примеры:
>>> import torch.nn.functional as F >>> kl_loss = nn.KLDivLoss(reduction="batchmean") >>> # input should be a distribution in the log space >>> input = F.log_softmax(torch.randn(3, 5, requires_grad=True), dim=1) >>> # Sample a batch of distributions. Usually this would come from the dataset >>> target = F.softmax(torch.rand(3, 5), dim=1) >>> output = kl_loss(input, target) >>> kl_loss = nn.KLDivLoss(reduction="batchmean", log_target=True) >>> log_target = F.log_softmax(torch.rand(3, 5), dim=1) >>> output = kl_loss(input, log_target)
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/generated/torch.nn.KLDivLoss.html