如何从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 并构建字典以获取要使用的图像的索引。
(此答案是对@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)
前一天我有机会在这方面工作.
如果你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)
在这里看到它.
从 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)
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)
| 归档时间: |
|
| 查看次数: |
5085 次 |
| 最近记录: |