ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PyTorch Geometric 中 InMemoryDataset 图数据加载指南:1 个判断标准与最短可用代码

PyTorch Geometric 中 InMemoryDataset 图数据加载指南:1 个判断标准与最短可用代码 PyTorch Geometric 中 InMemoryDataset 图数据加载指南1 个判断标准与最短可用代码【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric在 PyTorch Geometric 里搭图神经网络数据集是最先要处理的一环。InMemoryDataset是把整批图拼成一个对象、常驻 CPU 内存的数据集基类适合能放进内存的中小规模图数据集。读完后你会知道什么规模该用它、什么时候该换成磁盘后端以及从建类到批量加载的最短路径。什么时候该用 InMemoryDataset先看一条判断标准整个数据集能否一次性放进 CPU 内存。能放进内存用InMemoryDataset。引用网络、分子集合这类中小规模数据集如单张图数万节点、或十几万张小区图都合适。放不进内存别硬扛。超大规模或共享内存受限的机器直接用基类Dataset或转向磁盘后端OnDiskDataset。拿不准时先跑一次print(len(dataset))并访问dataset[0]看进程内存曲线再决定。影响决策的 3 个机制这三个行为直接决定你怎么写代码先记住它们。合并存储。建数据集时collate把所有图拼成一个Data对象并返回一个slices字典记录每张图的边界。落盘的是“1 个大对象 切片表”而不是 N 个独立对象读取和序列化都快。实现见 in_memory_dataset.py。按索引切片 缓存。get(idx)用slices从大对象里切出单张图第一次访问后把结果存进内部列表同一索引第二次直接返回副本不再切分。所以你遍历整个集合时重复索引几乎零开销。子集是视图设备要整块转。切片、列表、布尔张量都能当索引做index_select返回的是“子集视图”而非拷贝。to(cuda)这类设备转换只允许在“完整、无缓存”状态下整块进行。最短可用代码从建类到批量加载下面是最短能跑通的建类方式。它不覆盖下载逻辑自造数据时不需要只重写processed_file_names和process用save完成合并与落盘import torch from torch_geometric.data import InMemoryDataset, Data class TinyMol(InMemoryDataset): def __init__(self, root): super().__init__(root) self.load(self.processed_paths[0]) # 读回合并存储 property def processed_file_names(self): return data.pt def process(self): # 造 5 张同构图collate 合并后一次落盘 g lambda: Data(xtorch.rand(4, 3), edge_indextorch.tensor([[0, 1, 2, 3], [1, 2, 3, 0]])) self.save([g() for _ in range(5)], self.processed_paths[0])跑通建类后接入加载器和批量推理只要几行。DataLoader会在每个 batch 里自动把同批图再合并成一个批次from torch_geometric.loader import DataLoader dataset TinyMol(rootdata/mol) print(len(dataset), dataset[0]) # 5 张图第 0 张 loader DataLoader(dataset, batch_size2) for batch in loader: out model(batch.x, batch.edge_index) # 同批图自动合并训练/测试划分不必复制数据本体。切片返回子集视图index_select还能接受整数索引列表train dataset[:4] # 前 4 张返回子集视图 test dataset[4:] full dataset.index_select([0, 2, 4]) # 按索引挑样本官方里Planetoid就是这套写法的完整范例可对照 planetoid.py 看真实数据如何save/load。常见报错与替代做法按“现象 → 原因 → 处理”来看基本能覆盖日常坑。访问dataset.data弹 warning。原因是内部不推荐直接碰合并存储且一旦有缓存你改data也不会反映到get出来的图上。处理用dataset[i]或dataset.get(i)取样本或用dataset.x这类堆叠属性确实要操作底层时读_data。内存吃紧、进程被撑满。原因是collate把全量读进了 CPU 内存。处理转成磁盘后端它正是为“分布式训练 共享内存受限”准备的# 内存吃紧时转成磁盘后端支持分布式与受限共享内存 on_disk dataset.to_on_disk_dataset(rootdata/mol_on_disk, backendsqlite)大规模图数据的切分与处理流程大致如下OnDiskDataset就是这条路的入口后端可选sqlite或rocksdb见 on_disk_dataset.py。改了pre_transform却没生效提示与预处理版本不一致。原因是processed目录里已有旧文件默认不重处理。处理传force_reloadTrue强制重跑process。异构图调to_on_disk_dataset报NotImplementedError。原因是该转换目前只支持同构图Data。处理异构场景留在内存或自行基于Dataset写磁盘读写。还能怎么搭两个真正用得上的扩展点。一是配合transform它只在每次__getitem__时应用不改落盘数据适合做随机增强、归一化等“每次不同”的操作。二是需要更灵活的数据管线时调用dataset.to_datapipe()转成 PyTorch 的DataPipe再串batch_graphs等算子。先把当前数据集按上面的最短路跑通确认len()与dataset[0]输出正确再决定要不要升级到磁盘后端完整字段与下载流程可参考 create_dataset.rst。【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表