【问题标题】:how to adjust dataloader and make a new dataloader?如何调整数据加载器并制作新的数据加载器?
【发布时间】:2019-12-19 15:02:30
【问题描述】:

假设我有一个 cifar10 的数据加载器
如果我想从数据加载器中删除一些值并创建一个新的数据加载器
我该怎么做?

def load_data_cifar10(batch_size=128,test=False):
    if not test:
        train_dset = torchvision.datasets.CIFAR10(root='/mnt/3CE35B99003D727B/input/pytorch/data', train=True,
                                                download=True, transform=transform)
    else:
        train_dset = torchvision.datasets.CIFAR10(root='/mnt/3CE35B99003D727B/input/pytorch/data', train=False,
                                               download=True, transform=transform)
    train_loader = torch.utils.data.DataLoader(train_dset, batch_size=batch_size, shuffle=True)
    print("LOAD DATA, %d" % (len(train_loader)))
    return train_loader

【问题讨论】:

  • 您想对数据加载器进行哪些更改?

标签: numpy pytorch dataloader


【解决方案1】:

您可以使用Subset 数据集。这需要另一个数据集作为输入以及一个索引列表来构建一个新的数据集。假设您想要前 1000 个条目,那么您可以这样做

subset_train_dset = torch.utils.data.Subset(train_dset, range(1000))

您还可以使用ConcatDataset 数据集或ConcatDatasetSubset 的组合来构建由多个数据集组成的数据集,以构建您喜欢的任何东西

frankenstein_dset = torch.utils.data.ConcatDataset((
    torch.utils.data.Subset(dset1, range(1000)),
    torch.utils.data.Subset(dset2, range(100)))

在您的情况下,您需要查看实现细节以确定要保留哪些索引,或者您可以编写一些代码先遍历原始数据集并保存您要保留的所有索引,然后定义一个 @ 987654329@ 带有适当的索引。

【讨论】:

  • subset_train_dset.dataset.data.shape。不适用于真正的数据加载器。对于枚举(dataloader)中的idx,(img,target):吐出错误:TypeError:'DataLoader'对象不可下标
  • subset_train_dset = torch.utils.data.Subset(dataloader, range(1000)) for idx,(img,target) in enumerate(subset_train_dset): print(idx ,':' ,img.shape )
  • 数据集通常没有.data 成员(用于特定数据集)。阅读文档以获取更多信息,但唯一需要实现数据集的是 __getitem____len__。因此,如果您想要数据集对象的长度,您必须使用len(dataset) 作为通用解决方案。
猜你喜欢
  • 2023-03-29
  • 2019-11-27
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多