mindspore.ops.smooth_l1_loss

mindspore.ops.smooth_l1_loss(logits, labels, beta=1.0, reduction='none')[source]

Computes smooth L1 loss, a robust L1 loss.

SmoothL1Loss is a Loss similar to MSELoss but less sensitive to outliers as described in the Fast R-CNN by Ross Girshick.

Given two input \(x,\ y\) of length \(N\), the unreduced SmoothL1Loss can be described as follows:

\[\begin{split}L_{i} = \begin{cases} \frac{0.5 (x_i - y_i)^{2}}{\text{beta}}, & \text{if } |x_i - y_i| < \text{beta} \\ |x_i - y_i| - 0.5 \text{beta}, & \text{otherwise. } \end{cases}\end{split}\]

If reduction is not none, then:

\[\begin{split}L = \begin{cases} \operatorname{mean}(L_{i}), & \text{if reduction} = \text{'mean';}\\ \operatorname{sum}(L_{i}), & \text{if reduction} = \text{'sum'.} \end{cases}\end{split}\]

Here \(\text{beta}\) controls the point where the loss function changes from quadratic to linear. Its default value is 1.0. \(N\) is the batch size.

Note

For Ascend platform, the ‘reduction’ is not support set to ‘sum’ or ‘mean’ for now.

Parameters
  • logits (Tensor) – Tensor of shape \((N, *)\) where \(*\) means, any number of additional dimensions.

  • labels (Tensor) – Ground truth data, tensor of shape \((N, *)\), same shape and dtype as the logits.

  • beta (float) – A parameter used to control the point where the function will change from quadratic to linear. Default: 1.0.

  • reduction (str) – Apply specific reduction method to the output: ‘none’, ‘mean’ or ‘sum’. Default: ‘none’.

Returns

Tensor, if reduction is ‘none’, then output is a tensor with the same shape as logits. Otherwise the shape of output tensor is (1,).

Raises
  • TypeError – If beta is not a float.

  • ValueError – If reduction is not one of ‘none’, ‘mean’, ‘sum’.

  • TypeError – If dtype of logits or labels is neither float16 nor float32.

  • ValueError – If beta is less than or equal to 0.

  • ValueError – If shape of logits is not the same as labels.

Supported Platforms:

Ascend GPU CPU

Examples

>>> from mindspore.ops import functional as F
>>> logits = Tensor(np.array([1, 2, 3]), mindspore.float32)
>>> labels = Tensor(np.array([1, 2, 2]), mindspore.float32)
>>> output = F.smooth_l1_loss(logits, labels)
>>> print(output)
[0.  0.  0.5]