Python 如何更改Pytorch数据集的大小?
假设我正在从torchvision.datasets.MNIST加载MNIST,但我只想总共加载10000个图像,如何对数据进行切片以将其限制在一些数据点?我知道DataLoader是一个生成器,生成的数据大小与指定的批处理大小相同,但是如何分割数据集呢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,
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,并且非常清楚。