RuntimeError: измерение указано как 0, но тензор не имеет измерений - PullRequest
0 голосов
/ 19 декабря 2018

Я пытался реализовать простое NN с использованием наборов данных MNIST, и я продолжаю получать эту ошибку import matplotlib.pyplot как plt

import torch
from torchvision import models
from torchvision import datasets, transforms
from torch import nn, optim
import torch.nn.functional as F
import helper

transform = transforms.ToTensor()

train_data = datasets.MNIST(root='data', train=True,
                                   download=True, transform=transform)
test_data = datasets.MNIST(root='data', train=False,
                                  download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size = 20, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size = 20, shuffle=True)
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = nn.Linear(784,10)

    def forward(self,x):

        x = x.view(-1,784)
        x = F.relu(self.fc1(x))
        x = F.log_softmax(x, dim = 1)
        return x


model = Net()
criterion = nn.NLLLoss()
optimizer = optim.Adam(model.parameters(), lr = 0.003)

epochs = 20
model.train()
for epoch in range(epochs):
    train_loss = 0

    for image, lables in train_data:

        optimizer.zero_grad()

        output = model(image)
        loss = criterion(output, lables)
        loss.backwards()
        optimizer.step()
        train_loss += loss.item()*image.size(0)
    train_loss = train_loss/len(train_data.dataset)

    print('Epoch: {} \tTraining Loss: {:.6f}'.format(epoch+1, train_loss))

Вот ошибка RuntimeError: измерение указано как 0, но тензор не имеет измерений

1 Ответ

0 голосов
/ 19 декабря 2018

Непосредственно проблема, с которой вы сталкиваетесь, заключается в том, что потеря NLL ожидает labels (вы пишете это lables btw) тензора по крайней мере 1 измерения, и он получает 0-мерный тензор (он же скаляр).Если вы видите такого рода сообщения, просто наберите print(output.shape, labels.shape) для более легкой проверки.Источником этой ошибки является то, что вы, вероятно, по ошибке, запустите for image, labels in train_data вместо for image, labels in train_loader.В результате ваши данные не пакетируются - пакетирование скаляров, выходящих из dataset, создаст недостающее измерение, на которое жалуется NLLLoss.

Как только мы исправим это, мы приступим к исправлению backwards ->backward и, наконец, len(train_data.dataset) -> len(train_data).Затем цикл работает (если это разумная сеть и т. Д., Я не тестировал).

В качестве дополнительного замечания вы можете объединить NLLLoss и log_softmax, используя CrossEntropyLoss, что имеет преимущество дополнительной числовой стабильности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...