kl_div

paddle.nn.functional. kl_div ( input, label, reduction=’mean’, name=None ) [源代码]

该算子计算输入(Input)和输入(Label)之间的Kullback-Leibler散度损失。注意其中输入(Input)应为对数概率值,输入(Label)应为概率值。

kL发散损失计算如下:

kl_div - 图1

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

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

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

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

参数

  • input (Tensor) - KL散度损失算子的输入张量。维度为[N, ]的多维Tensor,其中N是批大小,表示任何数量的附加维度,数据类型为float32或float64。

  • label (Tensor) - KL散度损失算子的张量。与输入 input 的维度和数据类型一致的多维Tensor。

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

  • name (str,可选) – 具体用法请参见 Name ,一般无需设置。默认值:None。

返回

Tensor KL散度损失。

代码示例

  1. import paddle
  2. import numpy as np
  3. import paddle.nn.functional as F
  4. shape = (5, 20)
  5. input = np.random.uniform(-10, 10, shape).astype('float32')
  6. target = np.random.uniform(-10, 10, shape).astype('float32')
  7. # 'batchmean' reduction, loss shape will be [N]
  8. pred_loss = F.kl_div(paddle.to_tensor(input),
  9. paddle.to_tensor(target), reduction='batchmean')
  10. # shape=[5]
  11. # 'mean' reduction, loss shape will be [1]
  12. pred_loss = F.kl_div(paddle.to_tensor(input),
  13. paddle.to_tensor(target), reduction='mean')
  14. # shape=[1]
  15. # 'sum' reduction, loss shape will be [1]
  16. pred_loss = F.kl_div(paddle.to_tensor(input),
  17. paddle.to_tensor(target), reduction='sum')
  18. # shape=[1]
  19. # 'none' reduction, loss shape is same with input shape
  20. pred_loss = F.kl_div(paddle.to_tensor(input),
  21. paddle.to_tensor(target), reduction='none')
  22. # shape=[5, 20]