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
, Это хороший урок о классификации изображений. Вы можете узнать, как они это делают.