Ну, ответ довольно прост (кроме ошибки, упомянутой в другом ответе).
DataLoader
не имеет __getitem__
метода (см. в исходном коде для себя).
Используется для итерации, а не произвольного доступа к данным (или пакетам данных). Если вы хотите получить доступ к определенному элементу, вы должны использовать torch.utils.data.Dataset
, в вашем случае:
trainset = torchvision.datasets.ImageNet('/media/farshid/DataStore/temp/Imagenet/', split='train', )
trainset[0]
Получение партии
Если вы хотите получить пакет, вы можете перебрать его и потом разбить:
for batch in dataloader:
print(batch) # or anything else you want to do
break
DataLoader
создает случайные индексы по умолчанию или заданным способом (см. samplers ), следовательно, нет __getitem__
, так как это не имело бы смысла для этого объекта.
Вы также можете наследовать от DataLoader
и создавать свою собственную функцию __getitem__
, делающую то, что вы хотите (хотя и более сложную).
Полный пример
# torch.utils.data.Dataset object
trainset = datasets.ImageNet('/media/farshid/DataStore/temp/Imagenet/', split='train', download=True)
# torch.utils.data.DataLoader object
trainloader =torch.utils.data.DataLoader(trainset, batch_size=1, shuffle=False)
for batch in trainloader:
print(batch)
break
Вверху должна быть напечатана первая партия, которая находится внутри.