RuntimeError: Ошибка утверждения "THIndexTensor_(size)(target, 0) == batch_size". at ...ClassNLLCriterion.c:79

Я работаю над проектом машинного обучения. Моя задача - классифицировать спутниковые снимки. У меня есть 5 классов в качестве моих ярлыков. Все данные в формате Matlab. Опубликовать весь код было бы слишком много, поэтому я решил опубликовать важную его часть.

Вот фрагмент кода:

...

from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 5)

    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x


net = Net()


import torch.optim as optim

criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

for epoch in range(2):  # loop over the dataset multiple times

    running_loss = 0.0
    for i in range(1):
        print(i)
        # get the inputs
        #inputs, labels = data
        inputs=in_data
        labels=in_labels
        print("A:",labels.shape)
        print("B:",inputs.shape)


        # wrap them in Variable
        inputs, labels = Variable(inputs), Variable(labels)
        print("A_2:",inputs.size())
        print("A_3:",labels.size())

        # zero the parameter gradients
        optimizer.zero_grad()

        # forward + backward + optimize
        outputs = net(inputs)
        labels = labels.squeeze_()
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

...

Как вы можете легко видеть, это CNN (Convolutional Neural Network). Если я выполню свой код, будут отображены следующие ошибки:

0
A: torch.Size([100])
B: torch.Size([100, 3, 64, 64])
A_2: torch.Size([100, 3, 64, 64])
A_3: torch.Size([100])
Traceback (most recent call last):
  File "datasetAnalyser.py", line 283, in <module>
    main(args)
  File "datasetAnalyser.py", line 139, in main
    run(torchImage,torchLabel)
  File "datasetAnalyser.py", line 114, in run
    loss = criterion(outputs, labels)
  File "/home/qais/anaconda2/envs/Python3/lib/python3.6/site-packages/torch/nn/modules/module.py", line 325, in __call__
    result = self.forward(*input, **kwargs)
  File "/home/qais/anaconda2/envs/Python3/lib/python3.6/site-packages/torch/nn/modules/loss.py", line 601, in forward
    self.ignore_index, self.reduce)
  File "/home/qais/anaconda2/envs/Python3/lib/python3.6/site-packages/torch/nn/functional.py", line 1140, in cross_entropy
    return nll_loss(log_softmax(input, 1), target, weight, size_average, ignore_index, reduce)
  File "/home/qais/anaconda2/envs/Python3/lib/python3.6/site-packages/torch/nn/functional.py", line 1049, in nll_loss
    return torch._C._nn.nll_loss(input, target, weight, size_average, ignore_index, reduce)
RuntimeError: Assertion `THIndexTensor_(size)(target, 0) == batch_size' failed.  at /opt/conda/conda-bld/pytorch_1513368888240/work/torch/lib/THNN/generic/ClassNLLCriterion.c:79

Ну, я гуглил и нашел много тем об этой проблеме. Почему-то никто из них не решил мою проблему. Вот почему я спрашиваю тебя снова.

Что я должен делать? Я думаю, что я должен изменить целочисленные значения в

class Net(nn.Module)

но я точно не знаю, какие значения следует изменить.

Спасибо за вашу помощь!

1 ответ

Ошибка определенно вызвана несовместимым размером между labels а также outputs, Мне любопытно, почему вы бы использовать label = label.squeeze_(), Я думаю, что это не нужно.

Попробуй удалить label = label.squeeze_() и отрегулируйте размер labels чтобы соответствовать outputs, Это хороший урок о классификации изображений. Вы можете узнать, как они это делают.

Другие вопросы по тегам