如何让火车装载机使用特定数量的图像?

Dr.*_*ohn 4 python pytorch dataloader

假设我正在使用以下调用:

trainset = torchvision.datasets.ImageFolder(root="imgs/", transform=transform)
trainloader = torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True,num_workers=1)
Run Code Online (Sandbox Code Playgroud)

据我所知,这将 定义trainset为由文件夹“images”中的所有图像组成,并具有由特定文件夹位置定义的标签。

我的问题是 - 是否有任何直接/简单的方法可以将 定义trainset为该文件夹中图像的子样本?例如,定义trainset为每个子文件夹中 10 张图像的随机样本?

Fáb*_*rez 5

您可以将该类DatasetFolder(或 ImageFolder)包装在另一个类中以限制数据集:

class LimitDataset(data.Dataset):
    def __init__(self, dataset, n):
        self.dataset = dataset
        self.n = n

    def __len__(self):
        return self.n

    def __getitem__(self, i):
        return self.dataset[i]
Run Code Online (Sandbox Code Playgroud)

您还可以在索引LimitDataset和原始数据集中的索引之间定义一些映射,以定义更复杂的行为(例如随机子集)。

如果您想限制每个时期的批次而不是数据集大小:

from itertools import islice
for data in islice(dataloader, 0, batches_per_epoch):
    ...
Run Code Online (Sandbox Code Playgroud)

请注意,如果使用此 shuffle,数据集大小将相同,但每个 epoch 看到的数据将受到限制。如果不打乱数据集,这也会限制数据集的大小。