Aks*_*ali 2 python pandas deep-learning pytorch
我是 pytorch 的新手,之前曾在 keras 和 fastai 上工作过。目前正在尝试图像回归任务,挑战是我必须从 Pandas 数据框中加载数据。数据帧结构:
ID Path Score
fig1 /folder/fig1.jpg 2
fig2 /folder/fig2.jpg 3
.....
Run Code Online (Sandbox Code Playgroud)
我之前一直致力于将图像直接从文件夹加载到 pytorch,因为这是一项简单的分类任务,但现在有点卡住了。
我查看了 pytorch 论坛,但并没有安静地了解如何实施。任何帮助,将不胜感激。
您必须使用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)
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用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())
Run Code Online (Sandbox Code Playgroud)
(或者您可以像在常规中一样实现它,pytorch
但继承torchdata.Dataset
并调用super().__init__()
构造函数)。
torchdata
允许您轻松缓存图像或通过.map
如图所示应用一些其他转换,查看 github 存储库以获取更多信息或在评论中询问。
无论您选择哪种方式,您都应该包装数据集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
...
Run Code Online (Sandbox Code Playgroud)
使用这些图像并在循环中为您想要的内容打分。