【问题标题】:DataLoader messing up transformed dataDataLoader 弄乱了转换后的数据
【发布时间】:2020-01-15 09:28:20
【问题描述】:

我正在 Pytorch 中测试 MNIST 数据集,在我对 X 数据应用转换后,DataLoader 似乎将所有值置于原始顺序之外,这可能会扰乱训练步骤。

我的转换是将所有值除以 255。应该注意到转换本身不会改变位置,如第一个散点图所示。但是在将数据传递给 DataLoader 并将其检索回来之后,它们就出现了故障。如果我不进行任何转换,一切都很好(未显示)。 beforeafter1(除以 255/DataLoader 之前)和 after2(除以 255/DataLoader 之后)的值分布相同)(也未显示),似乎只有顺序受到影响。

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 应该可以解决),但我真的很想了解发生了什么。

谢谢!

【问题讨论】:

    标签: pytorch dataloader


    【解决方案1】:

    所以...我posted this same question at Pytorch's GitHub page,他们回答如下:

    它与数据加载器无关。你在搞乱一个属性 然而,特定的数据集对象,实际的__getitem__ 对象做得更多: https://github.com/pytorch/vision/blob/6de158c473b83cf43344a0651d7c01128c7850e6/torchvision/datasets/mnist.py#L92

    特别是这一行 (mode='L') 假定 uint8 输入。自从你 换成float,错了。

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

    【讨论】:

    • 这个数据集MNIST(VisionDataset): 远没有你想象的那么棒。我have similar answer你可能会觉得有帮助。
    【解决方案2】:

    原来我没有测试你写的代码。 改写原文:

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

    【讨论】:

    • 它没有用。 shuffle 参数仅与整个实例相关,与实例内数据结构无关。事实上,正是这种内部结构使任何预测成为可能,改组它是没有意义的。顺便说一句,当我不应用该转换时,离开 shuffle = True 不会影响数据结构。 (另外,shuffle = False 默认情况下。)
    • D,我不知道为什么原始代码不起作用,如果您知道,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2022-01-25
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多