Получить случайный пример из PyTorch DataLoader - PullRequest
0 голосов
/ 01 декабря 2018

Как получить один случайный пример из PyTorch DataLoader?

Если мой DataLoader дает минимальные пакеты из нескольких изображений и меток, как получить один случайныйизображение и метка?

Обратите внимание, что я не хочу, чтобы одно изображение и метка на мини-пакет, я хочу всего один пример.

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

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]
0 голосов
/ 19 июня 2019

Ключ для получения случайной выборки - установить shuffle=True для DataLoader, а ключ для получения одного изображения - установить размер пакета равным 1.

Вот пример после загрузка набора данных mnist .

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

0 голосов
/ 01 декабря 2018

У меня была возможность поработать над этим за день до этого.
Если ваш 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 :
Используйте batch_size из 1 в вашем DataLoader.

Альтернатива 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))  

Смотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...