PyTorch DataLoader – “IndexError: 张量维度为0的索引过多”

我在尝试实现一个用于识别MNIST数据集中数字的CNN,我的代码在数据加载过程中出现了错误。我不明白为什么会发生这种情况。

import torchimport torchvisionimport torchvision.transforms as transformstransform = 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

回答:

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

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

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

import torchx1 = torch.as_tensor((0.5))x2 = torch.as_tensor((0.5,))print(x1.shape, x1.ndim)  # output: torch.Size([]) 0print(x2.shape, x2.ndim)  # output: torch.Size([1]) 1

您可能不知道,但它们在Python中也是不同的:

type((0.5))   # <type 'float'>type((0.5,))  # <type 'tuple'>

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注