When I run the program below, it gives me an error. The problem seems to be in the loss function but I can’t find it. I have read the Pytorch Documentation for nn.CrossEntropyLoss but still can’t find the problem.
Image size is (1 x 256 x 256), Batch size is 1
I am new to PyTorch, thanks.
import torch import torch.nn as nn from PIL import Image import numpy as np torch.manual_seed(0) x = np.array(Image.open("cat.jpg")) x = np.expand_dims(x, axis = 0) x = np.expand_dims(x, axis = 0) x = torch.from_numpy(x) x = x.type(torch.FloatTensor) # shape = (1, 1, 256, 256) def Conv(in_channels, out_channels, kernel=3, stride=1, padding=0): return nn.Conv2d(in_channels, out_channels, kernel, stride, padding) class model(nn.Module): def __init__(self): super(model, self).__init__() self.sequential = nn.Sequential( Conv(1, 3), Conv(3, 5), nn.Flatten(), nn.Linear(317520, 1), nn.Sigmoid() ) def forward(self, x): y = self.sequential(x) return y def compute_loss(y_hat, y): return nn.CrossEntropyLoss()(y_hat, y) model = model() y_hat = model(x) loss = compute_loss(y_hat, torch.tensor([1]))
Error:
Traceback (most recent call last): File "D:/Me/AI/Models/test.py", line 38, in <module> **loss = compute_loss(y, torch.tensor([1]))** File "D:/Me/AI/Models/test.py", line 33, in compute_loss return nn.CrossEntropyLoss()(y_hat, y) File "D:SoftwaresAnacondaenvsdeeplearninglibsite-packagestorchnnmodulesmodule.py", line 1054, in _call_impl return forward_call(*input, **kwargs) File "D:SoftwaresAnacondaenvsdeeplearninglibsite-packagestorchnnmodulesloss.py", line 1120, in forward return F.cross_entropy(input, target, weight=self.weight, File "D:SoftwaresAnacondaenvsdeeplearninglibsite-packagestorchnnfunctional.py", line 2824, in cross_entropy return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index) **IndexError: Target 1 is out of bounds.** Process finished with exit code 1
Advertisement
Answer
This looks like a binary classifier model: cat or not cat. But you are using CrossEntropyLoss which is used when you have more than 2 target classes. So what you should use is Binary Cross Entropy Loss.
def compute_loss(y_hat, y): return nn.BCELoss()(y_hat, y)