如何从PyTorch DataLoader
获取单个随机样本?
如果我的DataLoader
给出了多个图像和标签的小片段,如何获得单个随机图像和标签?
请注意,我不希望每个小批量都有一个图像和标签,我只希望有一个示例。
答案 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 的补充
dataset
变量是不可追踪的,那么您可以使用dataloader.dataset
来获取原始dataset
由于迭代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)
从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")
答案 5 :(得分:0)
DataLoader
的随机样本假设在其构造中使用了 DataLoader(shuffle=True)
,可以从 DataLoader 中抽取一个随机示例:
example = next(iter(dataloader))[0]
Dataset
的随机样本如果不是这种情况,您可以使用以下命令从数据集中抽取一个随机示例:
idx = torch.randint(len(dataset), (1,))
example = dataset[idx]