KLDivLoss

class paddle.nn. KLDivLoss ( reduction='mean', log_target=False ) [源代码]

创建一个 KLDivLoss 类的可调用对象,以计算输入(Input)和输入(Label)之间的 Kullback-Leibler 散度损失。注意其中输入(Input)应为对数概率值,输入(Label)应为概率值。

log_targetFalse:

\[l(input, label) = label * (log(label) - input)\]

log_targetTrue:

\[l(input, label) = exp(label) * (label - input)\]

reductionnone 时,输出损失与输入(input)形状相同,各点的损失单独计算,不会对结果做 reduction 。

reductionmean 时,输出损失的形状为[],输出为所有损失的平均值。

reductionsum 时,输出损失的形状为[],输出为所有损失的总和。

reductionbatchmean 时,输出损失为[N]的形状,N 为批大小,输出为所有损失的总和除以批量大小。

参数

  • reduction (str,可选) - 要应用于输出的 reduction 类型,可用类型为‘none’ | ‘batchmean’ | ‘mean’ | ‘sum’,‘none’表示无 reduction,‘batchmean’ 表示输出的总和除以批大小,‘mean’ 表示所有输出的平均值,‘sum’表示输出的总和。

  • log_target (bool,可选) - 表示输入的 label 变量是否属于 log 空间。默认值为 False,表示不属于。

形状

  • input (Tensor):输入的 Tensor,维度是[N, *],其中 N 是 batch size, * 是任意数量的额外维度。数据类型为:float32、float64。

  • label (Tensor):标签,维度是[N, *],与 input 相同。数据类型为:float32、float64。

  • output (Tensor):输入 input 和标签 label 间的 kl 散度。如果 reduction'none',则输出 Loss 的维度为 [N, *],与输入 input 相同。如果 reduction'batchmean''mean''sum',则输出 Loss 的维度为 []。

代码示例

>>> import paddle
>>> import paddle.nn as nn

>>> shape = (5, 20)
>>> x = paddle.uniform(shape, min=-10, max=10).astype('float32')
>>> target = paddle.uniform(shape, min=-10, max=10).astype('float32')

>>> # 'batchmean' reduction, loss shape will be []
>>> kldiv_criterion = nn.KLDivLoss(reduction='batchmean')
>>> pred_loss = kldiv_criterion(x, target)
>>> print(pred_loss.shape)
[]

>>> # 'mean' reduction, loss shape will be []
>>> kldiv_criterion = nn.KLDivLoss(reduction='mean')
>>> pred_loss = kldiv_criterion(x, target)
>>> print(pred_loss.shape)
[]

>>> # 'sum' reduction, loss shape will be []
>>> kldiv_criterion = nn.KLDivLoss(reduction='sum')
>>> pred_loss = kldiv_criterion(x, target)
>>> print(pred_loss.shape)
[]

>>> # 'none' reduction, loss shape is same with X shape
>>> kldiv_criterion = nn.KLDivLoss(reduction='none')
>>> pred_loss = kldiv_criterion(x, target)
>>> print(pred_loss.shape)
[5, 20]

>>> # if label is in the log space, set log_target = True
>>> target = paddle.uniform(shape, min=0, max=10).astype('float32')
>>> log_target = paddle.log(target)
>>> kldiv_criterion_1 = nn.KLDivLoss(reduction='none')
>>> kldiv_criterion_2 = nn.KLDivLoss(reduction='none', log_target=True)
>>> pred_loss_1 = kldiv_criterion_1(x, target)
>>> pred_loss_2 = kldiv_criterion_2(x, log_target)
>>> print(paddle.allclose(pred_loss_1, pred_loss_2))
Tensor(shape=[], dtype=bool, place=Place(cpu), stop_gradient=True,
True)