Task07: 按需获取的数据集类的创建和图预测任务实践

Datawhale提供的课程链接:https://github.com/datawhalechina/team-learning-nlp/blob/master/GNN

一、环境配置和PyG安装(Colab版)

组内服务器突然坏掉了!失去了之前在服务器上安装的环境,于是转战colab重新安装环境!

colab的一系列设置参考下面的博客,这里就不赘述啦

Colab基本使用方法及配置:https://blog.csdn.net/u011119817/article/details/108519389

先运行nvidia-smi查看cuda版本,以便后面安装正确版本的各种包。

然后安装相应的pytorch:

查看pytorch和cuda版本:

安装相应版本的pyG:

安装ogb:

安装rdkit,colab上安装rdkit参考了教程https://zhuanlan.zhihu.com/p/93598466,具体安装代码如下:

安装结束拉!!下面进入学习环节!!

二、按需获取的数据集类的创建

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

2.1 Dataset基类简介

在PyG中,我们通过继承torch_geometric.data.Dataset基类来自定义一个按需加载样本到内存的数据集类。此基类与Torchvision的Dataset类的概念密切相关,这与第6节中介绍的torch_geometric.data.InMemoryDataset基类是一样的。继承torch_geometric.data.InMemoryDataset基类要实现的方法,继承此基类同样要实现,此外还需要实现以下方法:

len():返回数据集中的样本的数量。

get():实现加载单个图的操作。注意:在内部,__getitem__()返回通过调用

get()来获取Data对象,并根据transform参数对它们进行选择性转换。

下面让我们通过一个简化的例子看继承torch_geometric.data.Dataset基类的规范:

通过下面的方式,我们可以不用定义一个Dataset类,而直接生成一个Dataloader对象,直接用于训练:

我们也可以通过下面的方式将一个列表的Data对象组成一个batch:

2.2 图样本封装成批(BATCHING)与DataLoader类

2.2.1 合并小图组成大图

图可以有任意数量的节点和边,它不是规整的数据结构,因此对图数据封装成批的操作与对图像与序列等数据封装成批的操作不同。PyTorch Geometric中采用的将多个图封装成批的方式是,将小图作为连通组件(connected component)的形式合并,构建一个大图。于是小图的邻接矩阵存储在大图邻接矩阵的对角线上。大图的邻接矩阵、属性矩阵、预测目标矩阵分别为:

此方法有以下关键的优势:

依靠消息传递方案的GNN运算不需要被修改,因为消息仍然不能在属于不同图的两个节点之间交换。

没有额外的计算或内存的开销。例如,这个批处理程序的工作完全不需要对节点或边缘特征进行任何填充。请注意,邻接矩阵没有额外的内存开销,因为它们是以稀疏的方式保存的,只保留非零项,即边。

通 过torch_geometric.data.DataLoader 类 , 多 个 小 图 被 封 装 成 一 个 大 图 。torch_geometric.data.DataLoader 是 PyTorch 的 DataLoader 的 子 类 , 它 覆 盖 了collate()函数,改函数定义了一列表的样本是如何封装成批的。因此,所有可以传递给PyTorch DataLoader的参数也可以传递给PyTorchGeometricDataLoader,例如,num_workers。

2.2.2 小图的属性增值与拼接

将小图存储到大图中时需要对小图的属性做一些修改,一个最显著的例子就是要对节点序号增值。在最一般的形式中,PyTorch Geometric的DataLoader类会自动对edge_index张量增值,增加的值为当前被处理图的前面的图的累积节点数量。比方说,现在对第 个图的edge_index张量做增值,前面 个图的累积节点数量为,那么对第 个图的edge_index张量的增值 。增值后,对所有图的edge_index张量(其形状为[2, num_edges])在第二维中连接起来。

然而,有一些特殊的场景中(如下所述),基于需求我们希望能修改这一行为。PyTorch Geometric 允 许 我 们 通 过 覆 盖 torch_geometric.data.__inc__() 和torch_geometric.data.__cat_dim__()函数来实现我们希望的行为。在未做修改的情况下,它们在Data类中的定义如下。

我们可以看到,__inc__()定义了两个连续的图的属性之间的增量大小,而__cat_dim__()定义了同一属性的图形张量应该在哪个维度上被连接起来。PyTorchGeometric为存储在Data类中的每个属性调用此二函数,并以它们各自的key和值item作为参数。

在下面的内容中,我们将学习一些对__inc__()和__cat_dim__()的修改可能是绝对必要的案例。

图的匹配(Pairs of Graphs)

如果你想在一个Data对象中存储多个图,例如用于图匹配等应用,我们需要确保所有这些图的正确封装成批行为。例如,考虑将两个图,一个源图 和一个目标图,存储在一个Data类中,在这种情况中,edge_index_s应该根据源图 的节点数做增值,即x_s.size(0),而edge_index_t应该根据目标图 的节点数做增值,即x_t.size(0)。我们可以通过设置一个简单的测试脚本来测试我们的PairData批处理行为。

到目前为止,一切看起来都很好! edge_index_s和edge_index_t被正确地封装成批了,即使在为 和 含有不同数量的节点时也是如此。然而,由于PyTorchGeometric无法识别PairData对象中实际的图,所以batch属性(将大图每个节点映射到其各自对应的小图)没有正确工作。此时就需要DataLoader的follow_batch参数发挥作用。在这里,我们可以指定我们要为哪些属性维护批信息。

可以看到,follow_batch=['x_s', 'x_t']现在成功地为节点特征x_s'和x_t'分别创建了名为x_s_batch和x_t_batch的赋值向量。这些信息现在可以用来在一个单一的`Batch'对象中对多个图进行聚合操作,例如,全局池化。

二部图(Bipartite Graphs)

二部图的邻接矩阵定义两种类型的节点之间的连接关系。一般来说,不同类型的节点数量不需要一致,于是二部图的邻接矩阵 可能为平方矩阵,即可能有 。对二部图的封装成批过程中,edge_index 中边的源节点与目标节点做的增值操作应是不同的。我们将二部图中两类节点的特征特征张量分别存储为x_s和x_t。

为了对二部图实现正确的封装成批,我们需要告诉PyTorch Geometric,它应该在edge_index中独立地为边的源节点和目标节点做增值操作。其 中 , edge_index[0] ( 边 的 源 节 点 ) 根 据 x_s.size(0) 做 增 值 运 算 , 而edge_index[1](边的目标节点)根据x_t.size(0)做增值运算。

在新的维度上做拼接

有时,Data对象的属性需要在一个新的维度上做拼接(如经典的封装成批),例如,图级别属性或预测目标。具体来说,形状为[num_features]的属性列表应该被返回为[num_examples, num_features],而不是[num_examples * num_features]。PyTorch Geometric通过在__cat_dim__()中返回一个None的连接维度来实现这一点。

2.3 创建超大规模数据集类实践

PCQM4M-LSC是一个分子图的量子特性回归数据集,它包含了3,803,453个图。注意以下代码依赖于ogb包,通过pip install ogb命令可安装此包。ogb文档可见于Get Started | Open Graph Benchmark (stanford.edu)。我们定义的数据集类如下:

运行成功拉!!

三、图预测任务实践

这个暂时没有时间试!但我会补上的!等待实验室服务器活过来(哭泣!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容