PyTorch DataLoader-“ IndexError:维度0的张量的索引太多”

时间:2019-06-25 00:46:24

标签: python machine-learning pytorch

我正在尝试实现CNN以标识MNIST数据集中的数字,并且我的代码在数据加载过程中出现错误。我不明白为什么会这样。

target/surefire-reports

错误:

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]

2 个答案:

答案 0 :(得分:1)

问题是meanstd必须是序列(例如元组),因此您应该在值后面添加逗号:

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

请注意(0.5)(0.5,)之间的区别。您可以检查here如何使用这些值。如果您应用相同的过程,您将看到:

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'>

答案 1 :(得分:0)

检查trainset是否为空,简单的打印输出,与Trainloader相同,如果仍然无法正常运行,我更喜欢使用

手动加载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)