
PyG中QM9数据集从零到跑通的4步加载与训练路径【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric刚clone完PyTorch Geometric仓库、装好依赖你想跑通第一条分子属性预测任务QM9数据集加载是绕不开的第一步。第一次实例化QM9时它会替你完成下载、解析、缓存三件事但每个环节里都有几个只有踩过才知道的细节。下面按拿到数据 → 喂给模型 → 换模型与目标的顺序把整条管线走完。 把QM9数据集加载进InMemoryDataset第一次实例化130,831个分子怎么变成图你在一个空项目里敲下第一条数据代码from torch_geometric.datasets import QM9 path data/QM9 dataset QM9(path) print(len(dataset)) # 130831第一条输出就确认加载成功了。QM9共有130,831个分子、19个回归目标每个分子平均约18个节点、37条边。每个Data对象里原子是节点、化学键是边data.y是形状为(1, 19)的标签从偶极矩排到三个转动常数单位和量级各不相同。后面的流程是固定的三段式download()→process()→load()。QM9继承自InMemoryDataset首次处理后会把整批图拼成一个张量存进processed/data_v3.pt——这个目录就是PyG的缓存区第二次QM9(path)直接读文件不再重复处理。想确认内部逻辑可以看 qm9.py 源码。不装RDKit也能加载QM9download()里有一个分支能否import rdkit决定了拉哪份原始数据。装了rdkit下载SDF原始包并现场解析产出11维节点特征原子类型one-hot加杂化、氢数等、z原子序数、pos三维坐标、edge_index和SMILES没装的话直接取预处理的qm9_v3.ptstderr里会打一句提示图数据与手动处理版本一致只是没有SMILES字段。需要SMILES或想自己改处理逻辑conda install -c conda-forge rdkit只想用图数据什么都不装预处理版完全够用处理结果出问题想重跑构造时传force_reloadTrue⚙️ 用DynamicBatchSampler把训练循环稳下来先抽出一个目标再归一化、切分data.y有19列但一次训练通常只盯一个性质。qm9_nn_conv.py的官方做法是先用transform把标签抽成单列import copy from torch_geometric.datasets import QM9 target 0 # 偶极矩 class PickTarget: def __call__(self, data): data copy.copy(data) data.y data.y[:, target] return data dataset QM9(path, transformPickTarget()).shuffle()注意copy.copytransform在每次访问时都会执行浅拷贝保证不在缓存上原地改写。接着把标签归一化到零均值单位方差——InMemoryDataset把全部图拼成了全局张量统计量一行就能算出来mean dataset.data.y.mean(dim0, keepdimTrue) std dataset.data.y.std(dim0, keepdimTrue) dataset.data.y (dataset.data.y - mean) / std test_dataset dataset[:10000] val_dataset dataset[10000:20000] train_dataset dataset[20000:]shuffle()之后再切三段各自独立不需要额外的划分工具。按节点数而不是样本数控制批次QM9里分子有大有小按固定batch_size采样时偶尔凑出一批大分子就会让显存尖峰。换成DynamicBatchSampler按每个批次的节点总数设上限训练步长立刻均匀from torch_geometric.loader import DataLoader, DynamicBatchSampler sampler DynamicBatchSampler(train_dataset, max_num2000, modenode, shuffleTrue, skip_too_bigTrue) train_loader DataLoader(train_dataset, batch_samplersampler)PyG的DataLoader自带collater会把一批Data拼成Batch并建好data.batch向量训练循环只剩核心几行model.train() for data in train_loader: optimizer.zero_grad() loss F.mse_loss(model(data), data.y.view(-1)) loss.backward() optimizer.step()如果你的消息传递依赖原子间距SchNet、PNN这类空间模型再加一个Distance(normFalse)它会把边上的欧氏距离写进data.edge_attrnormFalse保留原始数值、不做归一化。 扩展到预训练模型与多目标DimeNet的7→12索引重排与from_qm9_pretrained不同模型对第7个目标的期望不一样。DimeNet系列要的是原子化能量qm9_pretrained_dimenet.py里先把列重排import torch # DimeNet uses the atomization energy for targets U0, U, H, and G, i.e.: # 7 - 12, 8 - 13, 9 - 14, 10 - 15 idx torch.tensor([0, 1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 11]) dataset.data.y dataset.data.y[:, idx]如果只想评测官方预训练权重更省事的路是直接走SchNet.from_qm9_pretrained(path, dataset, target)权重下载、列对齐、数据集划分都在一个类方法里完成qm9_pretrained_schnet.py就是完整示范。一次预测19个目标或换到磁盘存储要同时输出全部19个性质就不要在transform里抽列让data.y保持(1, 19)模型输出19列、逐目标算MAE即可能量类目标索引2、3、4、6、7、8、9、10报告时乘1000换成meV。另外如果机器内存吃不下全部13万个图dataset.to_on_disk_dataset()可以把数据落到SQLite后端改成按需读取适合共享内存受限的场景。把target换成1极化率或14原子化焓改两行代码就能重跑用dataset.atomref(target)做原子参考能量校正再试一次U0目标同一套管线平移到仓库里的PCQM4M、ZINC数据集【免费下载链接】pytorch_geometricGraph Neural Network Library for PyTorch项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考