Pytorch错误:RuntimeError: 预期1D目标张量,不支持多目标

我目前正在开发一个能够分类猫、狗以及非猫非狗的其他物体的神经网络。我的程序出现了以下无法解决的错误:

” File “/home/johann/Schreibtisch/NN_v0.01/classification.py”, line 146, in train(epoch)File “/home/johann/Schreibtisch/NN_v0.01/classification.py”, line 109, in trainloss = criterion(out, target)File “/home/johann/.local/lib/python3.8/site-packages/torch/nn/modules/module.py”, line 889, in _call_implresult = self.forward(*input, **kwargs)File “/home/johann/.local/lib/python3.8/site-packages/torch/nn/modules/loss.py”, line 1047, in forwardreturn F.cross_entropy(input, target, weight=self.weight,File “/home/johann/.local/lib/python3.8/site-packages/torch/nn/functional.py”, line 2693, in cross_entropyreturn nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)File “/home/johann/.local/lib/python3.8/site-packages/torch/nn/functional.py”, line 2388, in nll_lossret = torch._C._nn.nll_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index)RuntimeError: 1D target tensor expected, multi-target not supported”

代码如下:


import osfrom torchvision import transformsfrom PIL import Imagefrom os import listdirimport randomimport torch.optim as optimfrom torch.autograd import Variableimport torch.nn.functional as Fimport torch.nn as nnimport matplotlib.pyplot as pltfrom tqdm import tqdmnormalize = transforms.Normalize(    mean = [0.485, 0.456, 0.406],    std = [0.229, 0.224, 0.225])transform = transforms.Compose([     transforms.Resize(256),     transforms.CenterCrop(256),     transforms.ToTensor(), normalize])train_data_list = []target_list = []train_data = []waited = Falsefiles = listdir('catsanddogs/train/')for i in range(len(listdir('catsanddogs/train/'))):    if len(train_data) == 58 and not waited:        waited = True        continue    f = random.choice(files)    files.remove(f)    img = Image.open("catsanddogs/train/" + f)    img_tensor = transform(img)    train_data_list.append(img_tensor)    isSomething = 0    isCat = 1 if 'cat' in f else 0    isDog = 1 if 'dog' in f else 0    if isDog == 0 and isCat == 0:        isSomething = 1    target = [isCat, isDog, isSomething] #, isSomthing    target_list.append(target)    if len(train_data_list) >= 256:        train_data.append((torch.stack(train_data_list), target_list))        train_data_list = []        target_list = []        print('Loaded batch ', len(train_data), 'of ', int(len(listdir('catsanddogs/train/')) / 64))        print('Percentage Done: ', 100 * len(train_data) / int(len(listdir('catsanddogs/train/')) / 64), '%')        if len(train_data) > 2:            breakclass Netz(nn.Module):    def __init__(self):        super(Netz, self).__init__()        self.conv1 = nn.Conv2d(3, 6, kernel_size=(5, 5))        self.conv2 = nn.Conv2d(6, 12, kernel_size=(5, 5))        self.conv3 = nn.Conv2d(12, 18, kernel_size=(5, 5))        self.conv4 = nn.Conv2d(18, 24, kernel_size=(5, 5))        self.fc1 = nn.Linear(3456, 1000)        self.fc2 = nn.Linear(1000, 3)    def forward(self, x):       x = self.conv1(x)       x = F.max_pool2d(x, 2)       x = F.relu(x)       x = self.conv2(x)       x = F.max_pool2d(x, 2)       x = F.relu(x)       x = self.conv3(x)       x = F.max_pool2d(x, 2)       x = F.relu(x)       x = self.conv4(x)       x = F.max_pool2d(x, 2)       x = F.relu(x)       x = x.view(-1, 3456)       x = F.relu(self.fc1(x))       x = self.fc2(x)       return F.softmax(x, dim=1)model = Netz()#if os.path.isfile('catdognetz.pt'):    #model = torch.load('catdognetz.pt')optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)def count_parameters(model):  return sum(p.numel() for p in model.parameters() if p.requires_grad)count_parameters(model)train_losses = []train_accu = []def train(epoch):    print('\nEpoch : %d' % epoch)    model.train()    running_loss = 0    correct = 0    total = 0    for data, target in tqdm(train_data):        target = torch.Tensor(target)        data = Variable(data)        target = Variable(target)        optimizer.zero_grad()        out = model(data)        criterion = nn.CrossEntropyLoss()        loss = criterion(out, target)        loss.backward()        optimizer.step()        running_loss += loss.item()        predicted = out.max(1)        total += target.size(0)        correct += predicted.eq(target).sum().item()    train_loss = running_loss / len(train_data)    accu = 100. * float(correct) / total    train_accu.append(accu)    train_losses.append(train_loss)    print('Train Loss: %.3f | Accuracy: %.3f' % (train_loss, accu))def test():    model.eval()    file = listdir('catsanddogs/test/')    f = random.choice(file)    img = Image.open('catsanddogs/test/' + f)    img_eval_tensor = transform(img)    img_eval_tensor.unsqueeze_(0)    data = Variable(img_eval_tensor)    out = model(data)    what = "It's a cat"    print(out.data.max(1, keepdim=True)[1].cpu().numpy()[0])    if out.data.max(1, keepdim=True)[1].cpu().numpy()[0] != 0:        what = "It's a Dog"    if out.data.max(1, keepdim=True)[1].cpu().numpy()[0] != 0 and out.data.max(1, keepdim=True)[1].cpu().numpy()[0] != 1:        what = "Neither"    print(what)    img.show()    #x = input('')epochs = 10for epoch in range(1, epochs + 1):    train(epoch)    #test()    torch.save(model, 'catdognetz.pt')plt.plot(train_accu,'-o')plt.xlabel('epoch')plt.ylabel('accuracy')plt.legend(['Kurve: Training'])plt.title('Train Accuracy')plt.show()plt.plot(train_losses,'-o')plt.xlabel('epoch')plt.ylabel('loss bzw. Verlust')plt.legend(['Kruve : Training'])plt.title('Train Loss')plt.show()

回答:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注