Function Differences with torch.nn.NLLLoss

View Source On Gitee

torch.nn.NLLLoss

torch.nn.NLLLoss(
    weight=None,
    size_average=None,
    ignore_index=-100,
    reduce=None,
    reduction='mean'
)

For more information, see torch.nn.NLLLoss.

mindspore.ops.NLLLoss

class mindspore.ops.NLLLoss(
    reduction='mean'
)(logits, labels, weight)

For more information, see mindspore.ops.NLLLoss.

Differences

PyTorch: Supports both 2-dimensional (N, C) input data and n-dimensional (N, C, d1, d2, …, dK) input data.

MindSpore: Supports only 2-dimensional (N, C) input data.

Migration advice: If you need MindSpore NLLLoss operator to calculate on input of higher dimensions, separate data in dimensions higher than 2, calculate each piece of data with NLLLoss operator, then pack the outputs together.

Code Example

import mindspore as ms
import mindspore.nn as nn
import mindspore.ops as ops
import torch
import numpy as np

# In MindSpore
m = nn.LogSoftmax(axis=1)
loss = ops.NLLLoss()
input = ms.Tensor(np.random.randn(3, 5), ms.float32)
labels = ms.Tensor([1, 0, 4], ms.int32)
weight = ms.Tensor(np.random.rand(5), ms.float32)
loss, weight = loss(m(input), labels, weight)
print(loss)
# Out:
# 1.3557988


# In PyTorch
m = torch.nn.LogSoftmax(dim=1)
loss = torch.nn.NLLLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward()
print(output)
# Out:
# tensor(1.7451, grad_fn=<NllLossBackward>)