欢迎光临散文网 会员登陆 & 注册

一般人我不告诉他这些图数据处理干货!

2022-03-01 19:18 作者:深度之眼官方账号  | 我要投稿

来源:投稿 作者:张宇

编辑:学姐


看完给学姐点个赞!一个赞就能给学姐的午饭加个鸡腿🍗!


单张图被PyG表示为 torch_geometric.data.Data 类型,有如下属性:


data.x : 节 点 的 特 征 矩 阵 , 形 状 为 [num_nodes, num_node_features] 

data.edge_index : COO格式的图的边 shape [2, num_edges] and type torch.long

data.edge_attr :边的特征矩阵 shape [num_edges, num_edge_features]

data.y : 训练数据的标签,节点级的目标 shape [num_nodes, *] or 图级的目标 shape [1, *]

data.pos : 节点的位置矩阵 shape [num_nodes, num_dimensions]



对于data提供了如下方法进行访问:



对于Data类的更多方法可以看这里:


https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data


常用的基准数据集


PyG提供了大量的基准数据集,比如Planetoid datasets (Cora, Citeseer, Pubmed),更多图的数据集可

以看这个链接👇 


https://pytorch-geometric.readthedocs.io/en/latest/modules/data.html#torch_geometric.data.Data


https://github.com/nd7141/graph_datasets


使用PyG处理数据非常简单,并且下载下来就是源文件格式(raw file,可能在一些程序中看见这个单词),并且会自动处理为Data格式,例如:


我们可以看到数据集中的第一个图包含37个节点,每个节点有3个特性。有168/2 = 84条无向边,图被分配到一个类中。此外,数据对象只持有一个图级目标


我们甚至可以使用切片、long或bool张量来分割数据集。例如,要创建90/10的训练/测试分割,输入:


让我们再试一个!让我们下载Cora,半监督图节点分类的标准基准数据集,这个数据集是图神经网络论文中经常看见的数据集,是一个论文的引用图,节点的特征为论文的词向量:


Data对象保存每个节点的标签,以及额外的节点级属性:


train_mask、val_mask和test_mask,其中Train_mask表示要训练哪个节点(140个节点),


Val_mask表示使用哪些节点进行验证,例如,执行早期停止(500个节点),


Test_mask表示要测试哪个节点(1000个节点)。


比如data.train_mask 是一个一维的bool类型的tensor,里面的数据是True就代表是训练数据。

Mini-Batches

神经网络通常以批处理方式进行训练。PyG通过创建稀疏块对角邻接矩阵(由edge_index定义)和连接节点维上的特征和目标矩阵来实现小批量的并行化。这种组合允许在一个批处理中不同数量的节点和边:


PyG包含它自己的torch_geometric.loader.DataLoader ,它已经处理了这个连接过程。其实使用的过程和torch里面的DataLoader是一样的:

torch_geometric.data.Batch从torch_geometric.data.Data 继承,并包含称为batch 的附加属性。


batch是一个列向量,保存了batch中每个节点和对应图的映射关系。


可以使用batch来计算batch中每个图中各个节点的平均特征。


Data Transforms


下面以一个例子来解释,ShapeNet数据集是包含17000个3D点云的数据集。

我们可以通过transforms将点云生成最近邻图,将点云数据集转换为图数据集:

pre_transform参数可以在数据存入磁盘之前进行转换,在下次使用时,数据集将自动包含边。


此外,我们可以使用transform参数来随机增强一个Data对象,例如,将每个节点的位置转换为一个小数字:

图学习方法


在学习了PyG中的数据处理、datasets, loader 以及 transforms之后,是时候实现我们的第一个图形神经网络了!

我们将使用一个简单的GCN层,并在Cora引文数据集上复制实验。关于GCN的解释,请看 http://tkipf.g ithub.io/raph-convolutional-networks/ 。


首先,加载数据集:

然后定义一个两层的GCN,和torch里面的定义方式一样,只是在传入GCN网络时传的是两个参数,第一个是数据特征,第二个是边的index。数据特征x就是每个节点的特征向量,edge_index就是(2,节点数)的Tensor,表示哪两个节点之间有边。卷积层后面的ReLU激活函数以及dropout层也是常用的,也不做介绍。

然后对网络进行训练,训练的方式也是和torch中形式一样的:

最后网络新的训练精度进行测试

总结


最后做个总结的话就是,使用PyG的图神经网络,其实和torch总体使用过程是差不多的,最重要的就是DataLoader的写法。如果使用 torch_geometric.datasets 中没有的数据集的话,将数据转化为图的形式可能需要一些时间。

代码排版有点问题

关注公众号【学姐带你玩AI】回复:“1”

领取代码原文



一般人我不告诉他这些图数据处理干货!的评论 (共 条)

分享到微博请遵守国家法律