GaussianNLLLoss¶
该接口创建一个 GaussianNLLLoss 实例,计算输入 input
和标签 label
、 variance
间的 GaussianNLL 损失, label
被视为服从高斯分布的样本,期望 input
和方差 variance
由神经网络预测给出。 对于一个具有高斯分布的 Tensor label
,期望 input
和正方差 var
与其损失的数学计算公式如下:
其中, epsilon
是一个很小的数字,用于保证数值的稳定性。默认情况下,常数项将会被忽略,除非 epsilon
为 True。 若 variance
与 input
的形状不一致,则必须要服从广播机制。
参数¶
full (bool,可选) - 是否在损失计算中包括常数项。默认情况下为 False,表示忽略最后的常数项。
epsilon (float,可选) - 一个很小的数字,用于限制 variance 的值,使其不会导致除 0 的出现。默认值为 1e-6。
reduction (str,可选) - 指定应用于输出结果的计算方式,可选值有
none
、mean
和sum
。默认为mean
,计算mini-batch
loss 均值。设置为sum
时,计算mini-batch
loss 的总和。设置为none
时,则返回 loss Tensor。name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。
形状¶
input (Tensor):输入
Tensor
,其形状为 \((N, *)\) 或者 \((*)\),其中 \(*\) 表示任何数量的额外维度。数据类型为 float32 或 float64。label (Tensor):输入
Tensor
,其形状为 \((N, *)\) 或者 \((*)\),形状与input
相同,或者维度与 input 相同但最后一维的大小为 1,如input
的形状为: \((N, 3)\) 时,input
的形状可为 \((N, 1)\), 这时会进行 broadcast 操作。数据类型为 float32 或 float64。variance (Tensor): 输入
Tensor
,其形状为 \((N, *)\) 或者 \((*)\),形状与input
相同,或者维度与 input 相同但最后一维的大小为 1,或者维度与 input 相比缺少最后一维,如input
的形状为: \((N, 3)\) 时,input
的形状可为 \((N, 1)\) 或 \((N)\), 这时会进行 broadcast 操作。正方差样本,可为不同标签对应不同的方差(异方差性),也可以为同一个方差(同方差性)。数据类型为 float32 或 float64。
返回¶
output (Tensor) - 输入
input
、variance
和label
间的 GaussianNLLLoss 损失。如果 reduction 为 'none',则输出 Loss 形状与输入相同为 (N, *)。如果 reduction 为 'sum' 或者 'mean',则输出 Loss 形状为 '(1)' 。
代码示例¶
>>> import paddle
>>> import paddle.nn as nn
>>> paddle.seed(2023)
>>> input = paddle.randn([5, 2], dtype=paddle.float32)
>>> label = paddle.randn([5, 2], dtype=paddle.float32)
>>> variance = paddle.ones([5, 2], dtype=paddle.float32)
>>> gs_nll_loss = nn.GaussianNLLLoss(full=False, epsilon=1e-6, reduction='none')
>>> loss = gs_nll_loss(input, label, variance)
>>> print(loss)
Tensor(shape=[5, 2], dtype=float32, place=Place(cpu), stop_gradient=True,
[[0.21808575, 1.43013096],
[1.05245590, 0.00394560],
[1.20861185, 0.00000062],
[0.56946373, 0.73300570],
[0.37142906, 0.12038800]])