Datawhale 6月学习——图神经网络:图预测任务实践

前情回顾

  1. 图神经网络:图数据表示及应用
  2. 图神经网络:消息传递图神经网络
  3. 图神经网络:基于GNN的节点表征学习
  4. 图神经网络:基于GNN的节点预测任务及边预测任务
  5. 图神经网络:超大图上的节点表征学习
  6. 图神经网络:基于图神经网络的图表征学习

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 按需获取数据集类的创建

在前面的学习中我们只接触了数据可全部储存于内存的数据集,这些数据集对应的数据集类在创建对象时就将所有数据都加载到内存。然而在一些应用场景中,数据集规模超级大,我们很难有足够大的内存完全存下所有数据。因此需要一个按需加载样本到内存的数据集类。在此上半节内容中,我们将学习为一个包含上千万个图样本的数据集构建一个数据集类。

共有三种方法可以实现这样的数据集类的创建

  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
  1. 直接生成一个Dataloader对象
from torch_geometric.data import Data, DataLoader

data_list = [Data(...), ..., Data(...)]
loader = DataLoader(data_list, batch_size=32)
  1. 将一个列表的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类,有几种方式

  1. 合并小图成大图
  2. 小图的属性增值与拼接

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'
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SheltonXiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值