IndexError: 目标1超出范围。

6
当我运行下面的程序时,出现了一个错误。问题似乎在损失函数中,但我找不到它。我已经阅读了PyTorch文档中的nn.CrossEntropyLoss,但仍然找不到问题。
图片尺寸为(1 x 256 x 256),批大小为1。
我是PyTorch新手,谢谢。
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]))

错误:

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:\Softwares\Anaconda\envs\deeplearning\lib\site-packages\torch\nn\modules\module.py", line 1054, in _call_impl
    return forward_call(*input, **kwargs)
  File "D:\Softwares\Anaconda\envs\deeplearning\lib\site-packages\torch\nn\modules\loss.py", line 1120, in forward
    return F.cross_entropy(input, target, weight=self.weight,
  File "D:\Softwares\Anaconda\envs\deeplearning\lib\site-packages\torch\nn\functional.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

3个回答

15

看起来这是一个二元分类器模型:猫或非猫。但是您正在使用CrossEntropyLoss,而这通常用于具有多个目标类的情况。所以您应该使用Binary Cross Entropy Loss

def compute_loss(y_hat, y):
    return nn.BCELoss()(y_hat, y)

3

我认为需要进行以下更改
nn.Linear(317520, 1) 改为 nn.Linear(317520, 2)


0
尝试:loss = compute_loss(y_hat, torch.tensor([0]))

它能工作,但除了0以外的任何值都不行。 - Sanskar Kumar
@SanskarKumar Python中的列表和元组在列表或元组内部使用0作为第一个索引。如果您的列表或元组只有1个元素,则0以上的所有内容都将返回IndexError,而0将返回第一个元素。如果它对您有用,请将答案标记为已接受 :) - ilikeapples1234
你在谈论哪个列表/元组? - Sanskar Kumar
任何列表。例如:考虑:my_list = ['hello world']my_list[0]将返回'hello world',而my_list[1]将返回IndexError。 - ilikeapples1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接