从PyTorch DataLoader获取单个随机示例

Tom*_*ale 5 python pytorch

如何从PyTorch获得单个随机exmaple DataLoader

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

请注意,我不希望每个小批量单个图像和标签,我想要一个例子.

小智 13

如果你想从你的 Trainloader/Testloader 中选择特定的图像,你应该查看Subsetmaster的功能:

这是一个如何使用它的示例:

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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这为您提供了数据集中的第一个元素,**不是**随机的。 (2认同)

joh*_*d12 7

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

通过迭代dataset没有返回“随机”的例子,你应该使用:

# Recovers the original `dataset` from the `dataloader`
dataset = dataloader.dataset
n_samples = len(dataset)

# Get a random sample
random_index = int(numpy.random.random()*n_samples)
single_example = dataset[random_index]
Run Code Online (Sandbox Code Playgroud)


par*_*gar 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]
Run Code Online (Sandbox Code Playgroud)

备选方案1:
您可以使用RandomSampler获取随机样本以获取随机样本.

备选方案2:在DataLoader中
使用batch_size1.

备选方案3:
直接从您的DataSet中获取样本,如下所示:

mnist_test = datasets.MNIST('../MNIST/', train=False, transform=transform, target_transform=None)
Run Code Online (Sandbox Code Playgroud)

现在使用此数据集来获取样本:

for image, label in mnist_test:
     # do something with image and other attributes
Run Code Online (Sandbox Code Playgroud)

备选方案4 :(可能是最好的)

inputs, classes = next(iter(dataloader))  
Run Code Online (Sandbox Code Playgroud)

在这里看到它.


Tom*_*ale 6

特尔;博士:

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

list = [ x[0] for x in iter(trainloader).next() ]
Run Code Online (Sandbox Code Playgroud)

特别是对于所提出的问题,返回 minbatches 图像和标签的位置:

image, label = [ x[0] for x in iter(trainloader).next() ]
Run Code Online (Sandbox Code Playgroud)

可能有趣的信息:

要从 中获取单个小批量DataLoader,请使用:

iter(trainloader).next()
Run Code Online (Sandbox Code Playgroud)

当运行类似for images, labels in dataloader:引擎盖下发生的事情时,通过创建迭代器iter(dataloader),然后.next()在每次循环执行时调用迭代器。


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

image = iter(trainloader).next()[0][0]
Run Code Online (Sandbox Code Playgroud)

这与执行以下操作相同:

images, labels = iter(trainloader).next()
image = images[0]
Run Code Online (Sandbox Code Playgroud)


uke*_*emi 6

随机样本来自DataLoader

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

example = next(iter(dataloader))[0]
Run Code Online (Sandbox Code Playgroud)

随机样本来自Dataset

如果情况并非如此,您可以使用以下命令从数据集中抽取一个随机示例:

idx = torch.randint(len(dataset), (1,))
example = dataset[idx]
Run Code Online (Sandbox Code Playgroud)