我目前正在开发一个能够分类猫、狗以及非猫非狗的其他物体的神经网络。我的程序出现了以下无法解决的错误:
” 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()
回答: