实例介绍

通过自带的示例介绍并学习PyG。主要从以下4各方面:

图数据处理
通用基准数据集
Mini-batches
数据转换
图学习方法

图数据处理

图用于对对象(节点)之前的关系(边)进行建模。PyG中的图可以用torch_geometric.data.Data的一个实例表示,默认情况下包含以下属性:

  • data.x: 具有[num_nodes, num_node_features]形状的节点特征矩阵
  • data.edge_index: 形状为[2, num_edges],类型为Torch.long
  • data.edge_attr: 形状为[num_edges, num_edge_features]的边特征矩阵
  • data.y:标签(可能具有任意形状),例如,node-level任务形状为[num_nodes, *]或graph-level任务形状为[1, *]
  • data.pos: 节点位置矩阵,形状为[num_nodes, num_dimensions]

我们展示了一个简单的例子:一个有三个节点和四条边的无权无向图。每个节点正好包含一个特征。

import torch
from torch_geometric.data import Dataedge_index = torch.tensor([[0,1,1,2],[1,0,2,1]],dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)
data = Data(x=x, edge_index = edge_index)
>>> Data(edge_index=[2, 4], x=[3, 1])


值得注意得是,edge_index,即定义所有源节点和目标节点的张量,不是索引对的列表。如果想写成索引对的形式,则需要在将它们传递给构造函数前对他们进行转置 .t() 并调用 .contiguous() 函数:

import torch
from torch_geometric.data import Dataedge_index = torch.tensor([[0, 1],[1, 0],[1, 2],[2, 1]],dtype=torch.long)
x = torch.tensor([[-1], [0], [1]], dtype=torch.float)
data = Data(x=x, edge_index = edge_index.t().contiguous())
>>> Data(edge_index=[2, 4], x=[3, 1])

注意:此图虽然只有两条边,但是却需要四个索引对来说明一条边的两个方向。

除了持有一些node-level、edge-level或graph-level的属性外,Data 还提供了一些有用的实用功能,例如:

print(data.keys)
>>> ['x', 'edge_index']print(data['x'])
>>> tensor([[-1.0],[0.0],[1.0]])for key, item in data:print(f'{key} found in data')
>>> x found in data
>>> edge_index found in data'edge_attr' in data
>>> Falsedata.num_nodes
>>> 3data.num_edges
>>> 4data.num_node_features
>>> 1data.has_isolated_nodes()
>>> Falsedata.has_self_loops()
>>> Falsedata.is_directed()
>>> False# 将数据从cpu转移到gpu上
device = torch.device('cuda')
data = data.to(device)

更多详情可以从 torch_geometric.data.Data 源码中查看

通用基准数据集

由于我做的是node-level,这里仅记录所有的 Planetoid datasets (Cora, Citeseer, Pubmed)。

from torch_geometric.datasets import Planetoiddataset = Planetoid(root='./data/Cora/', name='Cora')
>>> Cora()len(dataset)
>>> 1dataset.num_classes
>>> 7dataset.num_node_features
>>> 1433

注意,如果本地没有数据集,会自动下载到 ./data/Cora/raw 文件夹中。如果本地已有数据集,请将 ./data/Cora/raw/ 作为 root 传入。

Cora数据集仅包含一个无向图,代表引用关系。

data = dataset[0]
>>> Data(edge_index=[2, 10556], test_mask=[2708],train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])

边有 10556 / 2条, 节点个数有 2708, 特征为 1433。test_mask – 测试集, train_mask – 训练集, val_mask – 验证集。 x – 节点特征, y – 节点标签。

data.is_undirected()
>>> Truedata.train_mask.sum().item()
>>> 140data.val_mask.sum().item()
>>> 500data.test_mask.sum().item()
>>> 1000

Mini-batches和数据转换不太适用于node-level任务(我没用到,个人见解,如有错误请指出)。

图学习方法

我们开始搭建第一个图神经网络(GNN)。我们将使用一个简单的GCN层,并在Cora引文数据集上进行复制实验。

首先我们要加载数据集:

from torch_geometric.datasets import Planetoiddataset = Planetoid(root='/data/Cora/raw', name='Cora')
>>> Cora()

我们不需要使用数据转换或dataloader。我们接下来实现一个两层的GCN:

import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConvclass GCN(torch.nn.Module):def __init__(self,):super().__init__()self.conv1 = GCNConv(dataset.num_node_features, 16)self.conv2 = GCNConv(16, dataset.num_classes)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = F.dropout(x, training=self.training)x = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = GCN().to(device)
data = dataset[0].to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)model.train()
for epoch in range(200):optimizer.zero_grad()out = model(data)loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()model.eval()
pred = model(data).argmax(dim=1)
correct = (pred[data.test_mask] == data.y[data.test_mask]).sum()
acc = int(correct) / int(data.test_mask.sum())
print(f'Accuracy: {acc:.4f}')
>>> Accuracy: 0.8150

PyG图神经网络框架学习--示例介绍相关推荐

  1. PyG图神经网络框架--构建信息传递网络(MPN)

    信息传递网络 将卷积算子泛化到不规则域中,通常表示为邻域聚合或信息传递模式.xi(k−1)∈RFx_i^{(k-1)} \in \R^Fxi(k−1)​∈RF 表示节点 iii 在第 l−1l-1l− ...

  2. PyG图神经网络框架torch-geometric安装

    最近需要使用到PyG框架,安装的时候需要注意一些问题,记录一下,方便后来者避坑! 步骤1 首先要先确定自己的torch版本 如果使用的Anaconda可以使用conda list命令查看版本号 进入官 ...

  3. 【图神经网络】图神经网络(GNN)学习笔记:GNN的通用框架

    图神经网络GNN学习笔记:GNN的通用框架 1. MPNN 2. NLNN 3. GN 参考资料 所谓通用框架,是对多种变体GNN网络结构的一般化总结,也是GNN编程的通用范式,这里介绍3类通用框架: ...

  4. 【图神经网络】图神经网络(GNN)学习笔记:基于GNN的图表示学习

    图神经网络GNN学习笔记:基于GNN的图表示学习 1. 图表示学习 2. 基于GNN的图表示学习 2.1 基于重构损失的GNN 2.2 基于对比损失的GNN 参考资料 本文主要就基于GNN的无监督图表 ...

  5. 【图神经网络】图神经网络(GNN)学习笔记:图分类

    图神经网络GNN学习笔记:图分类 1. 基于全局池化的图分类 2. 基于层次化池化的图分类 2.1 基于图坍缩的池化机制 1 图坍缩 2 DIFFPOOL 3. EigenPooling 2.2 基于 ...

  6. 图神经网络框架DGL实现Graph Attention Network (GAT)笔记

    参考列表: [1]深入理解图注意力机制 [2]DGL官方学习教程一 --基础操作&消息传递 [3]Cora数据集介绍+python读取 一.DGL实现GAT分类机器学习论文 程序摘自[1],该 ...

  7. 【图神经网络】图神经网络(GNN)学习笔记:图的基础理论

    图神经网络GNN学习笔记:图的基础理论 1. 图的概述 2.图的基本类型 2.1 有向图和无向图 2.2 非加权图与加权图 2.3 连通图与非连通图 2.4 二部图 2.5 邻居和度 2.6 子图和路 ...

  8. 开源图神经网络框架DGL升级:GCMC训练时间从1天缩到1小时,RGCN实现速度提升291倍...

    乾明 编辑整理  量子位 报道 | 公众号 QbitAI 又一个AI框架迎来升级. 这次,是纽约大学.亚马逊联手推出图神经网络框架DGL. 不仅全面上线了对异构图的支持,复现并开源了相关异构图神经网络 ...

  9. 图神经网络框架DGL学习 102——图、节点、边及其特征赋值

    101(入门)以后就是开始具体逐项学习图神经网络的各个细节.下面介绍: 1.如何构建图 2.将特征赋给节点或者边,及查询方法 这算是图神经网络最基础最基础的部分了. 一.如何构建图 DGL中创建的图的 ...

最新文章

  1. 箭头函数中的this
  2. java线程和linux线程,Java线程与Linux内核线程的映射关系
  3. android eclipse关联源码,以及源码(代码)以及jar查看软件
  4. Leet Code OJ 83. Remove Duplicates from Sorted List [Difficulty: Easy]
  5. linux里hba状态_Windows和Linux系统查看HBA卡wwn号的方法 | 系统之家官网
  6. tomcat,Jboss,weblogic区别与比较
  7. Linux虚拟机-配置文件说明
  8. 利用Power Design 进行数据库设计(超详细)
  9. 小众即时通信工具专项整治启动,关停“比邻”“聊聊”“密语”等9款违法App...
  10. 记录:英文参考文献格式
  11. 技术人的充电时刻,200分钟QA交流,尽在SDCC 2017·深圳站
  12. 计算机考研408考试关键词、专有名词、术语等英文缩写和全称
  13. python opencv 二维码定位识别
  14. 安装SSL证书的网站被谷歌提升排名权重
  15. Mysql索引有哪几种类型
  16. 计算机专业大四课程,计算机专业大学四年课表.doc
  17. 第四章:文法中的递归以及消除方法
  18. 武汉光庭导航面试经历
  19. 计算机检测维修与数据恢复招标,计算机检测维修与数据恢复实训室企业招标文件.doc...
  20. Android面试题收集(有详细答案)

热门文章

  1. 阿里专家常昊:新人如何上手项目管理?
  2. 数据结构基础(6) --顺序栈的设计与实现
  3. MySQL学习笔记_8_SQL语言基础复习
  4. 简单实现Popup弹出框添加数据
  5. Haproxy+Rabbitmq中的问题
  6. [转]Java并发编程:线程池的使用
  7. Stack View的与众不同
  8. Kingsoft AntiVirus(金山毒霸) and av-comparatives organization
  9. Net设计模式实例之装饰者模式(Decorator Pattern)(1)
  10. 售前人员应该具备的素质---理解客户的需求