前情回顾
- 图神经网络:图数据表示及应用
- 图神经网络:消息传递图神经网络
- 图神经网络:基于GNN的节点表征学习
- 图神经网络:基于GNN的节点预测任务及边预测任务
- 图神经网络:超大图上的节点表征学习
- 图神经网络:基于图神经网络的图表征学习
1 图预测任务描述
1.1 任务简述
本次任务所涉及的图预测任务,是一个回归任务。其目的是,学习图结构的一个合理的图表征方式,学习目标的检测方式是与benchmark数据集上打好的数值标签进行对比。
这个数值标签可以是药物疗效评价等。
具体一点描述的话,就是对某一个已有标签(y)的数据集,我们要学习一种图表征的模型,使得这个图表征模型的计算结果与标签(y)最接近,即回归任务。
1.2 数据集
本次所用数据集,是OGB LSC中Graph level的数据集PCQM4M-LSC,是一个量子化学数据集,任务是预测给定分子的重要分子特性,即 HOMO-LUMO 间隙(图形回归)。
这个数据集的详细介绍可以看OGB官网。
这个数据的下载大小为58MB,但是是以smile字符串形式存储,将它们处理成图形对象后,最终的文件大小将在 8GB 左右,因此需要采用合适的数据读取形式来减少内存负担。
2 任务实现
本次任务分为两个部分,一个部分是按需获取数据集类的创建,第二个部分是图表示学习的实现。
2.1 数据集创建及获取
2.1.1 按需获取数据集类的创建
在前面的学习中我们只接触了数据可全部储存于内存的数据集,这些数据集对应的数据集类在创建对象时就将所有数据都加载到内存。然而在一些应用场景中,数据集规模超级大,我们很难有足够大的内存完全存下所有数据。因此需要一个按需加载样本到内存的数据集类。在此上半节内容中,我们将学习为一个包含上千万个图样本的数据集构建一个数据集类。
共有三种方法可以实现这样的数据集类的创建
- 通过继承
torch_geometric.data.Dataset
基类来自定义一个按需加载样本到内存的数据集类
import os.path as osp
import torch
from torch_geometric.data import Dataset, download_url
class MyOwnDataset(Dataset):
def __init__(self, root, transform=None, pre_transform=None):
super(MyOwnDataset, self).__init__(root, transform, pre_transform)
@property
def raw_file_names(self):
return ['some_file_1', 'some_file_2', ...]
@property
def processed_file_names(self):
return ['data_1.pt', 'data_2.pt', ...]
def download(self):
# Download to `self.raw_dir`.
path = download_url(url, self.raw_dir)
...
def process(self):
i = 0
for raw_path in self.raw_paths:
# Read data from `raw_path`.
data = Data(...)
if self.pre_filter is not None and not self.pre_filter(data):
continue
if self.pre_transform is not None:
data = self.pre_transform(data)
torch.save(data, osp.join(self.processed_dir, 'data_{}.pt'.format(i)))
i += 1
def len(self):
return len(self.processed_file_names)
def get(self, idx):
data = torch.load(osp.join(self.processed_dir, 'data_{}.pt'.format(idx)))
return data
- 直接生成一个
Dataloader
对象
from torch_geometric.data import Data, DataLoader
data_list = [Data(...), ..., Data(...)]
loader = DataLoader(data_list, batch_size=32)
- 将一个列表的
Data
对象组成一个batch
from torch_geometric.data import Data, Batch
data_list = [Data(...), ..., Data(...)]
loader = Batch.from_data_list(data_list, batch_size=32)
#上述代码运行失败,暂未解决
接下来,也可对图样本封装成批(BATCHING)与DataLoader
类,有几种方式
- 合并小图成大图
- 小图的属性增值与拼接
2.1.2 创建预测任务所需数据集
我们定义的数据集类如下:
import os
import os.path as osp
import pandas as pd
import torch
from ogb.utils.mol import smiles2graph
from ogb.utils.torch_util import replace_numpy_with_torchtensor
from ogb.utils.url import download_url, extract_zip
from rdkit import RDLogger
from torch_geometric.data import Data, Dataset
import shutil
RDLogger.DisableLog('rdApp.*')
class MyPCQM4MDataset(Dataset):
def __init__(self, root):
self.url = 'https://dgl-data.s3-accelerate.amazonaws.com/dataset/OGB-LSC/pcqm4m_kddcup2021.zip'
super(MyPCQM4MDataset, self).__init__(root)
filepath = osp.join(root, 'raw/data.csv.gz')
data_df = pd.read_csv(filepath)
self.smiles_list = data_df['smiles']
self.homolumogap_list = data_df['homolumogap'