I try launch test, but get this error:
*Traceback (most recent call last):
File "<ipython-input-59-5947c660ace7>", line 26, in test_ClassNLLCriterionUnstable
torch_layer_output_var = torch_layer(torch.log(layer_input_var),
File "C:\Program Files\Python38\lib\site-packages\torch\nn\modules\module.py", line 550, in __call__
result = self.forward(*input, **kwargs)
File "C:\Program Files\Python38\lib\site-packages\torch\nn\modules\loss.py", line 205, in forward
return F.nll_loss(input, target, weight=self.weight, ignore_index=self.ignore_index, reduction=self.reduction)
File "C:\Program Files\Python38\lib\site-packages\torch\nn\functional.py", line 2115, in nll_loss
ret = torch._C._nn.nll_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)
RuntimeError: expected scalar type Long but found Int*
Test code:
class TestLayers(unittest.TestCase):
def test_ClassNLLCriterionUnstable(self):
np.random.seed(42)
torch.manual_seed(42)
batch_size, n_in = 2, 4
for _ in range(100):
# layers initialization
torch_layer = torch.nn.NLLLoss()
custom_layer = ClassNLLCriterionUnstable()
layer_input = np.random.uniform(0, 1, (batch_size, n_in)).astype(np.float32)
layer_input /= layer_input.sum(axis=-1, keepdims=True)
layer_input = layer_input.clip(custom_layer.EPS, 1. - custom_layer.EPS) # unifies input
target_labels = np.random.choice(n_in, batch_size)
target = np.zeros((batch_size, n_in), np.float32)
target[np.arange(batch_size), target_labels] = 1 # one-hot encoding
# 1. check layer output
custom_layer_output = custom_layer.updateOutput(layer_input, target)
layer_input_var = Variable(torch.from_numpy(layer_input), requires_grad=True)
torch_layer_output_var = torch_layer(torch.log(layer_input_var),
Variable(torch.from_numpy(target_labels), requires_grad=False))
self.assertTrue(np.allclose(torch_layer_output_var.data.numpy(), custom_layer_output, atol=1e-6))
ClassNLLCriterionUnstable code:
class ClassNLLCriterionUnstable(Criterion):
EPS = 1e-15
def __init__(self):
a = super(ClassNLLCriterionUnstable, self)
super(ClassNLLCriterionUnstable, self).__init__()
def updateOutput(self, input, target):
# Use this trick to avoid numerical errors
input_clamp = np.clip(input, self.EPS, 1 - self.EPS)
# Your code goes here. ################################################
return self.output
def updateGradInput(self, input, target):
# Use this trick to avoid numerical errors
input_clamp = np.clip(input, self.EPS, 1 - self.EPS)
# Your code goes here. ################################################
return self.gradInput
def __repr__(self):
return "ClassNLLCriterionUnstable"
I don’t know how to fix it. I am new to machine learning, I wanted to implement the negative loglikehood criterion and compare it with the pytorch.