Наборы данных
Вы должны использовать структуру torch.utils.data.Dataset
, чтобы определить ее. Вот как вы можете сделать это простым pytorch
(я использую pillow
для загрузки изображений и torchvision
для их преобразования в torch.Tensor
объекты):
import torch
import torchvision
from PIL import Image
class MyDataset(torch.utils.data.Dataset):
def __init__(self, dataframe):
self.dataframe = dataframe
def __len__(self):
return len(self.dataframe)
def __getitem__(self, index):
row = self.dataframe.iloc[index]
return (
torchvision.transforms.functional.to_tensor(Image.open(row["Path"])),
row["Score"],
)
dataset = MyDataset(dataframe)
В качестве альтернативы вы можно использовать torchdata
( заявление об отказе: бесстыдная самореклама, поскольку я автор ... ), которое позволяет вам отделить Path
и Scores
следующим образом:
import torchvision
from PIL import Image
import torchdata
class ImageDataset(torchdata.datasets.FilesDataset):
def __getitem__(self, index):
return Image.open(self.files[index])
class Labels(torchdata.Dataset):
def __init__(self, scores):
super().__init__()
self.scores = scores
def __len__(self):
return len(self.scores)
def __getitem__(self, index):
return self.scores[index]
# to_numpy for convenience
# I assume all your images are in /folder and have *.jpg extension
dataset = ImageDataset.from_folder("/folder", regex="*.jpg").map(
torchvision.transforms.ToTensor()
) | Labels(dataframe["Score"].to_numpy())
(или вы могли бы реализовать это так же, как в обычном pytorch
, но наследуя от torchdata.Dataset
и вызывая super().__init__()
в конструкторе).
torchdata
позволяет вам кэшировать ваши изображения легко или применить некоторые другие преобразования с помощью .map
, как показано там, проверьте github-репозиторий для получения дополнительной информации или спросите в комментарии.
DataLoader
В любом случае вы выберите, что вы должны обернуть свой набор данных в torch.utils.data.DataLoader
, чтобы создать пакеты и выполнить итерации по ним, как показано ниже:
dataloader = torch.utils.data.DataLoader(dataset, batch_size=64, shuffle=True)
for images, scores in dataloader:
# Rest of your code to train neural network or smth
...
Делайте с этими изображениями и счетами то, что вы хотите в l oop.