Python 如何更改Pytorch数据集的大小?

Python 如何更改Pytorch数据集的大小?,python,machine-learning,dataset,torch,pytorch,Python,Machine Learning,Dataset,Torch,Pytorch,假设我正在从torchvision.datasets.MNIST加载MNIST,但我只想总共加载10000个图像,如何对数据进行切片以将其限制在一些数据点?我知道DataLoader是一个生成器,生成的数据大小与指定的批处理大小相同,但是如何分割数据集呢 tr = datasets.MNIST('../data', train=True, download=True, transform=transform) te = datasets.MNIST('../data', train=False,

假设我正在从torchvision.datasets.MNIST加载MNIST,但我只想总共加载10000个图像,如何对数据进行切片以将其限制在一些数据点?我知道DataLoader是一个生成器,生成的数据大小与指定的批处理大小相同,但是如何分割数据集呢

tr = datasets.MNIST('../data', train=True, download=True, transform=transform)
te = datasets.MNIST('../data', train=False, transform=transform)
train_loader = DataLoader(tr, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs)
test_loader = DataLoader(te, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs)

需要注意的是,当您创建
DataLoader
对象时,它不会立即加载所有数据(这对于大型数据集是不切实际的)。它为您提供了一个迭代器,您可以使用它访问每个示例

不幸的是,
DataLoader
无法控制要提取的样本数量。您必须使用切片迭代器的典型方法

最简单的方法(没有任何库)是在达到所需的样本数后停止

nsamples = 10000
for i, image, label in enumerate(train_loader):
    if i > nsamples:
        break

    # Your training code here.
或者,你可以用它来获取前10k个样本。像这样

for image, label in itertools.islice(train_loader, stop=10000):

    # your training code here.

另一种快速切片数据集的方法是使用
torch.utils.data.random_split()
(PyTorch v0.4.1+中支持)。它有助于将数据集随机拆分为给定长度的非重叠新数据集

因此,我们可以有如下内容:

tr = datasets.MNIST('../data', train=True, download=True, transform=transform)
te = datasets.MNIST('../data', train=False, transform=transform)

part_tr = torch.utils.data.random_split(tr, [tr_split_len, len(tr)-tr_split_len])[0]
part_te = torch.utils.data.random_split(te, [te_split_len, len(te)-te_split_len])[0]

train_loader = DataLoader(part_tr, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs)
test_loader = DataLoader(part_te, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs)

在这里,您可以将
tr_split_len
te_split_len
分别设置为训练和测试数据集所需的分割长度。

您可以使用
torch.utils.data.Subset()
例如,对于前10000个元素:

将torch.utils.data作为数据导入
指数=torch.arange(10000)
tr_10k=数据实用子集(tr,索引)

此方法的警告:如果您在循环变量
epoch
中多次迭代
train\u loader
,您可能已经使用了所有训练样本。。。因为
DataLoader
中的
shuffle=True
选项将对每个历元的样本进行洗牌。我不断收到错误,如
DataLoader worker(pid(s)9579)使用这些方法意外退出(在OSX上),这会修改数据集而不是DataLoader,并且非常清楚。