从PyTorch DataLoader获取单个随机示例

时间:2018-12-01 12:24:37

标签: python pytorch

如何从PyTorch DataLoader获取单个随机样本?

如果我的DataLoader给出了多个图像和标签的小片段,如何获得单个随机图像和标签?

请注意,我不希望每个小批量都有一个图像和标签,我只希望有一个示例。

6 个答案:

答案 0 :(得分:8)

如果要从Trainloader / Testloader中选择特定的图像,则应从主菜单中检出Subset功能:https://pytorch.org/docs/stable/data.html#torch.utils.data.Subset

以下是使用方法的示例:

testset = ImageFolderWithPaths(root="path/to/your/Image_Data/Test/", transform=transform)

subset_indices = [0] # select your indices here as a list

subset = torch.utils.data.Subset(testset, subset_indices)

testloader_subset = torch.utils.data.DataLoader(subset, batch_size=1, num_workers=0, shuffle=False)

这样,您可以只使用一个图像和标签。但是,您当然可以在subset_indices中使用多个索引。

如果要使用DataFolder中的特定图像,则可以使用dataset.sample并构建字典以获取要使用的图像的索引。

答案 1 :(得分:6)

前一天,我有机会进行这项工作。
如果您的DataLoader是这样的:
test_loader = DataLoader(image_datasets['val'], batch_size=batch_size, shuffle=True) 它为您提供了batch_size大小的批处理,您可以通过直接索引获得的样本来挑选一个随机示例,如下所示:

for test_images, test_labels in test_loader:  
    sample_image = test_images[0]    # Reshape them according to your needs.
    sample_label = test_labels[0]

替代1
您可以使用RandomSampler获取随机样本,以获得随机样本。

替代2
在您的DataLoader中使用1的batch_size

替代3
像这样直接从您的DataSet中取样:

mnist_test = datasets.MNIST('../MNIST/', train=False, transform=transform, target_transform=None)

现在使用此数据集进行采样:

for image, label in mnist_test:
     # do something with image and other attributes

替代方法4 :(可能是最好的)

inputs, classes = next(iter(dataloader))  

查看here

答案 2 :(得分:3)

此答案是对@parthagar答案的替代3 的补充

  1. 有时候原始dataset变量是不可追踪的,那么您可以使用dataloader.dataset来获取原始dataset
  2. 由于迭代dataset给出的示例不是“随机”顺序的不是,要获得“随机”示例,应使用

    dataset = dataloader.dataset
    n_samples = len(dataset)
    
    # to get a random sample
    random_index = int(numpy.random.random()*n_samples)
    single_example = dataset[random_index]
    

答案 3 :(得分:0)

TL; DR:

DataLoader中获取单个示例的一般形式是:

list = [ x[0] for x in iter(trainloader).next() ]

特别是在所问的问题中,图像和标签的小片段返回到哪里:

image, label = [ x[0] for x in iter(trainloader).next() ]

可能有趣的信息:

要从DataLoader获得一个小批量,请使用:

iter(trainloader).next()

运行类似for images, labels in dataloader:之类的东西时,实际上是通过iter(dataloader)创建了一个迭代器,然后在每次循环执行时调用迭代器的.next()


要从DataLoader获取单个图像并返回图像和标签,请使用:

image = iter(trainloader).next()[0][0]

这与这样做相同:

images, labels = iter(trainloader).next()
image = images[0]

答案 4 :(得分:0)

获取随机样本的关键是将shuffle=True设置为DataLoader,获取单个图像的关键是将批处理大小设置为1。

以下是loading the mnist dataset之后的示例。

from torch.utils.data import DataLoader, Dataset, TensorDataset
bs = 1
train_ds = TensorDataset(x_train, y_train)
train_dl = DataLoader(train_ds, batch_size=bs, shuffle=True)

for xb, yb in train_dl:
    print(xb.shape)
    x = xb.view(28,28) 
    print(x.shape)
    print(yb)
    break #just once

from matplotlib import pyplot as plt
plt.imshow(x, cmap="gray")

enter image description here

答案 5 :(得分:0)

来自DataLoader的随机样本

假设在其构造中使用了 DataLoader(shuffle=True),可以从 DataLoader 中抽取一个随机示例:

example = next(iter(dataloader))[0]

来自Dataset的随机样本

如果不是这种情况,您可以使用以下命令从数据集中抽取一个随机示例:

idx = torch.randint(len(dataset), (1,))
example = dataset[idx]