# Function Differences with torch.nn.GaussianNLLLoss

[![View Source On Gitee](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.0/resource/_static/logo_source_en.png)](https://gitee.com/mindspore/docs/blob/r2.0/docs/mindspore/source_en/note/api_mapping/pytorch_diff/GaussianNLLLoss.md)

## torch.nn.GaussianNLLLoss

```text
class torch.nn.GaussianNLLLoss(
    *,
    full=False,
    eps=1e-06,
    reduction='mean'
)(input, target, var) -> Tensor/Scalar
```

For more information, see [torch.nn.GaussianNLLLoss](https://pytorch.org/docs/1.8.1/generated/torch.nn.GaussianNLLLoss.html).

## mindspore.nn.GaussianNLLLoss

```text
class mindspore.nn.GaussianNLLLoss(
    *,
    full=False,
    eps=1e-06,
    reduction='mean'
)(logits, labels, var) -> Tensor/Scalar
```

For more information, see [mindspore.nn.GaussianNLLLoss](https://www.mindspore.cn/docs/en/r2.0/api_python/nn/mindspore.nn.GaussianNLLLoss.html).

## Differences

PyTorch: Obey the negative log-likelihood loss of the Gaussian distribution.

MindSpore: Implements the same function as PyTorch. If there is a number less than 0 in var, PyTorch will report an error directly, while MindSpore will calculate max(var, eps) and then pass the result to log for calculation.

| Categories | Subcategories |PyTorch | MindSpore | Differences |
|-----|-----|-----------|-----------|------------|
| Parameters  | Parameter 1 | full      | full      | Same function       |
|     | Parameter 2 | eps       |eps         | Same function       |
|     | Parameter 3 | reduction | reduction   | Same function       |
| Inputs  | Input 1 | input     | logits    | Same function, different parameter names |
|     | Input 2 | target    | labels    | Same function, different parameter names |
|     | Input 3 | var       | var       | Same function       |

### Code Example

> The two APIs implement basically the same functionality and usage, but PyTorch and MindSpore handle the case of input `var<0` differently.

```python
# PyTorch
import torch
from torch import nn
import numpy as np

arr1 = np.arange(8).reshape((4, 2))
arr2 = np.array([2, 3, 1, 4, 6, 4, 4, 9]).reshape((4, 2))
logits = torch.tensor(arr1, dtype=torch.float32)
labels = torch.tensor(arr2, dtype=torch.float32)
loss = nn.GaussianNLLLoss(reduction='mean')
var = torch.tensor(np.ones((4, 1)), dtype=torch.float32)
output = loss(logits, labels, var)
# tensor(1.4375)

# If there are elements in the var that are less than 0, PyTorch will directly report an error
var[0] = -1
output2 = loss(logits, labels, var)
# ValueError: var has negative entry/entries

# MindSpore
import numpy as np
from mindspore import Tensor
import mindspore.nn as nn
from mindspore import dtype as mstype

arr1 = np.arange(8).reshape((4, 2))
arr2 = np.array([2, 3, 1, 4, 6, 4, 4, 9]).reshape((4, 2))
logits = Tensor(arr1, mstype.float32)
labels = Tensor(arr2, mstype.float32)
loss = nn.GaussianNLLLoss(reduction='mean')
var = Tensor(np.ones((4, 1)), mstype.float32)
output = loss(logits, labels, var)
print(output)
# 1.4374993

# If there are elements that are less than 0 in var, MindSpore will use the result of max(var, eps)
var[0] = -1
output2 = loss(logits, labels, var)
print(output2)
# 499999.22
```