Pytorch 数据加载器弄乱了转换的数据

Pytorch 数据加载器弄乱了转换的数据,pytorch,dataloader,Pytorch,Dataloader,我正在Pytorch中测试MNIST数据集,在我对X数据应用转换后,数据加载器似乎将所有值按原始顺序排列,这可能会打乱训练步骤 我的转换是将所有值除以255。应该注意,变换本身不会改变位置,如第一个散点图所示。但是,在数据被传递到DataLoader并被我检索回来之后,它们就不正常了。如果我不进行任何转换,则一切正常(未显示)。值在before、after1(除以255/数据加载器之前)和after2(除以255/数据加载器之后)(也未显示)之间的分布相同,只是顺序似乎受到影响 import t

我正在Pytorch中测试MNIST数据集,在我对X数据应用转换后,数据加载器似乎将所有值按原始顺序排列,这可能会打乱训练步骤

我的转换是将所有值除以255。应该注意,变换本身不会改变位置,如第一个散点图所示。但是,在数据被传递到DataLoader并被我检索回来之后,它们就不正常了。如果我不进行任何转换,则一切正常(未显示)。值在before、after1(除以255/数据加载器之前)和after2(除以255/数据加载器之后)(也未显示)之间的分布相同,只是顺序似乎受到影响

import torch
from torchvision import datasets
import torchvision.transforms as transforms
import matplotlib.pyplot as plt

transform = transforms.ToTensor()

train = datasets.MNIST(root = '.', train = True, download = True, transform = transform)
test = datasets.MNIST(root = '.', train = False, download = True, transform = transform)

before = train.data[0]

train.data = train.data.float()/255
after1 = train.data[0]

train_loader = torch.utils.data.DataLoader(train, batch_size = 128)
test_loader = torch.utils.data.DataLoader(test, batch_size = 128)

fig, ax = plt.subplots(1, 2)
ax[0].scatter(range(len(before.view(-1))), before.view(-1))
ax[0].set_title('Before')
ax[1].scatter(range(len(after1.view(-1))), after1.view(-1))
ax[1].set_title('After1')

after2 = next(iter(train_loader))[0][0]

fig, ax = plt.subplots(1, 2)
ax[0].scatter(range(len(before.view(-1))), before.view(-1))
ax[0].set_title('Before')
ax[1].scatter(range(len(after2.view(-1))), after2.view(-1))
ax[1].set_title('After2')

fig, ax = plt.subplots(1, 3)
ax[0].imshow(before, cmap = 'gray')
ax[1].imshow(after1, cmap = 'gray')
ax[2].imshow(after2.view(28, 28), cmap = 'gray')
我知道这可能不是处理这些数据的最佳方式(
transforms.Normalize
应该可以解决这个问题),但我真的很想了解发生了什么


谢谢大家!

最初我没有测试您编写的代码。 改写原文:

import torch
from torchvision import datasets
import torchvision.transforms as transforms
from torch.utils.data import DataLoader, Dataset, TensorDataset
import matplotlib.pyplot as plt

transform = transforms.ToTensor()

train = datasets.MNIST(root = '.', train = True, download = True, transform = transform)
test = datasets.MNIST(root = '.', train = False, download = True, transform = transform)

dl = DataLoader(train)

images = dl.dataset.data.float()/255
labels = dl.dataset.targets

train_ds = TensorDataset(images, labels)
train_loader = DataLoader(train_ds, batch_size=128)
# img, target = next(iter(train_loader))

before = train.data[0]
train.data = train.data.float()/255
after1 = train.data[0]

# train_loader = torch.utils.data.DataLoader(train, batch_size = 128)
test_loader = torch.utils.data.DataLoader(test, batch_size = 128)

fig, ax = plt.subplots(1, 2)
ax[0].scatter(range(len(before.view(-1))), before.view(-1))
ax[0].set_title('Before')
ax[1].scatter(range(len(after1.view(-1))), after1.view(-1))
ax[1].set_title('After1')

after2 = next(iter(train_loader))[0][0]

fig, ax = plt.subplots(1, 2)
ax[0].scatter(range(len(before.view(-1))), before.view(-1))
ax[0].set_title('Before')
ax[1].scatter(range(len(after2.view(-1))), after2.view(-1))
ax[1].set_title('After2')

fig, ax = plt.subplots(1, 3)
ax[0].imshow(before, cmap = 'gray')
ax[1].imshow(after1, cmap = 'gray')
ax[2].imshow(after2.view(28, 28), cmap = 'gray')
所以。。。他们回答如下:

它与数据加载器无关。你搞乱了一个属性 但是,特定的dataset对象的实际 对象的作用远不止于此:

特别是这一行(
mode='L'
)采用
uint8
输入。自从你 用浮子代替了它,这是错误的


那么,我想首选的方法是在代码开始时准备数据集时应用转换。

它不起作用。
shuffle
参数仅与整个实例相关,而不与实例数据结构相关。事实上,正是这种内部结构使任何预测成为可能,对其进行洗牌将毫无意义。顺便说一下,当我不应用转换时,保留shuffle=True不会影响数据结构。(另外,默认情况下,
shuffle=False
)D,我不明白为什么原始代码不起作用,如果你明白了,请告诉我。这个数据集
MNIST(VisionDataset):
没有你想象的那么棒。我相信你会觉得有用的。