基于Pytorch的PyTorch Geometric(PYG)库构造个人数据集
一、目的
PyTorch Geometric库中虽然已经包含自带的数据集如 Cora 等,但有时我们也需要用户个人数据创建自己的数据集进行一些数据研究。当然博主也建议大家若是第一次使用PyTorch Geometric库可以先使用其自带的数据集进行理解,再创建自己的数据集做到灵活运用。
二、前期准备和参考资料
- 下载编辑器和配置程序运行环境:点击打开《基于Windows中学习Deep Learning之搭建Anaconda+Pytorch(Cuda+Cudnn)+Pycharm工具和配置环境完整最简版》文章
- 下载PyTorch Geometric包: 点击打开《基于Pytorch中安装torch_geometric简单详细完整版》文章
- PyTorch Geometric包使用的官方文档:点击打开PyTorch Geometric 使用介绍CREATING YOUR OWN DATASETS官方网页
- 基于图卷积网络的个人数据集应用案例:点击打开《基于Pytorch的图卷积网络GCN实例应用及详解》文章
三、PyTorch Geometric库构造个人数据集三种实现方式
PyG为数据集提供了三个抽象类:Data、InMemoryDataset 和 Dataset。
- torch_geometric.data.Data:用户只需要在程序运行中动态创建合成数据且不需要将数据以pt文件形式保存到磁盘时,直接可以在读取所有外部文件数据集后,只需传递一个包含torch_geometry.data.Data的常规python列表数据对象,并将其传递给torch_geometry.Data.dataloader即可进行后续数据处理操作,一般适合小规模数据集,用户个人数据集可以选这个模式处理即可,且博主的 这篇《基于Pytorch的图卷积网络GCN实例应用及详解》文章 构造个人数据集使用的便是此类方法。
- torch_geometric.data.InMemoryDataset:是继承torch_geometry.data.Dataset,并且如果整个数据集都能装入内存,则可以使用它,一般适合小规模数据集,用户个人数据集可以选这个模式处理即可。
- torch_geometry.data.Dataset:需要每读取一个Batch数据会重新从硬盘中读取这些数据再放入程序运行的缓存中,一般比较适合大规模的数据集(此篇文章不详细介绍)。
四、torch_geometric.data.InMemoryDataset基本方法
为创建一个torch_geometric.data.InMemoryDataset,需要实现以下四个基本方法:
- torch_geometric.data.InMemoryDataset.raw_file_names():首先寻找raw_dir其中的文件列表(见下图raw),文件为空时,才需要下载download()数据集,若想跳过此方法则返回一个字符串或者字节即可。
- torch_geometric.data.InMemoryDataset.processed_file_names():首先寻找processed_dir其中的文件列表(见下图processed),文件为空时,才需要进行数据集process()处理。
- torch_geometric.data.InMemoryDataset.download(): 将原始数据下载到raw_dir(见下图raw),当用户自己创建数据集时也可使用pass方法跳过此过程。
- torch_geometric.data.InMemoryDataset.process():处理原始数据集并将其保存到processed_dir(见下图processed)。在数据处理函数中,具体流程是:用户需要读取并创建一个Data对象列表并将其保存到processed_dir.。因为保存一个巨大的 python 列表速度非常慢,因此在保存前可以通过 torch_geometric.data.InMemoryDataset.collate() 方法将列表整理成一个巨大的Data对象,再返回一个Data对象切片(slices)字典和一个Data对象重建的单个示例,最后我们需要在构造函数中将这两个对象加载到属性 self.data 和 self.slices 。
五、torch_geometric.data.InMemoryDataset实现流程代码及结果
InMemoryDataset实现流程图如下:
完整代码如下:
import torch
from torch_geometric.data import InMemoryDataset, download_url
from torch_geometric<