mindspore.mint.nn.functional.kl_div

查看源文件
mindspore.mint.nn.functional.kl_div(input, target, reduction='mean', log_target=False)[源代码]

计算输入 inputtarget 的Kullback-Leibler散度。

对于相同shape的Tensor xy ,KLDivLoss的计算公式如下:

L(x,y)=y(logyx)

(x,y)={L(x,y),if reduction='none';mean(L(x,y)),if reduction='mean';sum(L(x,y))/x.shape[0],if reduction='batchmean';sum(L(x,y)),if reduction='sum'.

其中 x 表示 inputy 表示 target(x,y) 表示输出。

说明

  • 目前不支持需要 input 广播到 target 的输入。

  • 仅当 reduction 设置为 "batchmean" 时,输出才与Kullback-Leibler散度的数学定义一致。

参数:
  • input (Tensor) - 输入Tensor。数据类型必须为float16、float32或bfloat16(仅Atlas A2训练系列产品支持)。

  • target (Tensor) - 目标Tensor,其数据类型与 input 相同。 target 的shape必须能够广播到 input 的shape。

  • reduction (str,可选) - 指定应用于输出结果的规约计算方式。默认值: 'mean'

  • log_target (bool,可选) - 指定输入 target 是否在对数空间内。默认值: False

返回:

Tensor,数据类型与 input 相同。如果 reduction'none' ,则shape与 inputtarget 广播之后的结果相同。 否则,输出为Scalar的Tensor。

异常:
  • TypeError - inputtarget 不是Tensor。

  • TypeError - inputtarget 的数据类型不是float16、float32或bfloat16。

  • TypeError - target 的数据类型与 input 不同。

  • ValueError - reduction 不为 'none''mean''sum''batchmean' 之一。

  • ValueError - target 的shape不能广播到 input 的shape。

支持平台:

Ascend

样例:

>>> import mindspore as ms
>>> from mindspore import mint
>>> import numpy as np
>>> input = ms.Tensor(np.array([[0.5, 0.5], [0.4, 0.6]]), ms.float32)
>>> target = ms.Tensor(np.array([[0., 1.], [1., 0.]]), ms.float32)
>>> output = mint.nn.functional.kl_div(input, target, reduction='mean', log_target=False)
>>> print(output)
-0.225