PyTorch DataLoader - «IndexError: слишком много индексов для тензора измерения 0» - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь реализовать CNN для идентификации цифр в наборе данных MNIST, и мой код обнаруживает ошибку в процессе загрузки данных. Я не понимаю, почему это происходит.

import torch
import torchvision
import torchvision.transforms as transforms

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5), (0.5))
])

trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=20, shuffle=True, num_workers=2)

testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=20, shuffle=False, num_workers=2)

for i, data in enumerate(trainloader, 0):
    inputs, labels = data[0], data[1]

Ошибка:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-6-b37c638b6114> in <module>
      2 
----> 3     for i, data in enumerate(trainloader, 0):
      4         inputs, labels = data[0], data[1]

# ...

IndexError: Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/site-packages/torch/utils/data/_utils/worker.py", line 99, in _worker_loop
    samples = collate_fn([dataset[i] for i in batch_indices])
  File "/opt/conda/lib/python3.6/site-packages/torch/utils/data/_utils/worker.py", line 99, in <listcomp>
    samples = collate_fn([dataset[i] for i in batch_indices])
  File "/opt/conda/lib/python3.6/site-packages/torchvision/datasets/mnist.py", line 95, in __getitem__
    img = self.transform(img)
  File "/opt/conda/lib/python3.6/site-packages/torchvision/transforms/transforms.py", line 61, in __call__
    img = t(img)
  File "/opt/conda/lib/python3.6/site-packages/torchvision/transforms/transforms.py", line 164, in __call__
    return F.normalize(tensor, self.mean, self.std, self.inplace)
  File "/opt/conda/lib/python3.6/site-packages/torchvision/transforms/functional.py", line 208, in normalize
    tensor.sub_(mean[:, None, None]).div_(std[:, None, None])
IndexError: too many indices for tensor of dimension 0

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Проблема в том, что mean и std должны быть последовательностями (например, кортежами), поэтому вы должны добавить запятую после значений:

transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

Обратите внимание на разницу между (0.5) и (0.5,). Вы можете проверить здесь , как используются эти значения. Если вы примените тот же процесс, вы увидите, что:

import torch

x1 = torch.as_tensor((0.5))
x2 = torch.as_tensor((0.5,))

print(x1.shape, x1.ndim)  # output: torch.Size([]) 0
print(x2.shape, x2.ndim)  # output: torch.Size([1]) 1

Может быть, вы не знаете, но они также отличаются в Python:

type((0.5))   # <type 'float'>
type((0.5,))  # <type 'tuple'>
0 голосов
/ 25 июня 2019

проверить, не является ли набор поездов пустым, простая распечатка, то же самое для загрузчика поездов, если он все еще не работает, я предпочитаю загружать mnist вручную с помощью

def load_mnist_labels(fnlabel):
f = gzip.open(fnlabel, 'rb')
f.read(8)
return np.frombuffer(f.read(), dtype = np.uint8)

def load_mnist_images(fnlabel):
f = gzip.open(fnlabel, 'rb')
f.read(16)
return np.frombuffer(f.read(), dtype = np.uint8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...