我对pytorch完全陌生,以前曾在keras和fastai工作。 当前正在尝试图像回归任务,而面临的挑战是我必须从pandas数据框中加载数据。 数据框结构:
ID Path Score
fig1 /folder/fig1.jpg 2
fig2 /folder/fig2.jpg 3
.....
我以前曾致力于直接从文件夹将图像加载到pytorch,因为这是一个简单的分类任务,但现在有点卡住了。
我浏览了pytorch论坛,但并没有安静地了解如何实现。 任何帮助将不胜感激。
答案 0 :(得分:1)
您必须使用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
和{{ 1}}:
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
应用其他转换,如图所示,check github repository for more info或在评论中提问。
您选择的任何一种方式都应将数据集包装在.map
中,以创建批次并对其进行迭代,如下所示:
torch.utils.data.DataLoader
对这些图像进行处理,并对循环中想要的内容进行评分。