由于深度学习方法在图像和文本上的成功应用,人们对深度学习方法在图像数据上的扩展越来越感兴趣。受到卷积网络、循环网络和深度自动编码器的思想影响,研究者定义和设计了用于处理图数据的神经网络结构,由此产生了一个新的研究热点-图神经网络。
图神经网络对图有很多应用,对于图上节点的应用,可以是对节点的半监督或监督的节点分类(回归);对于图上的边,可以是对图上的边有监督分类;对这呢各个图的应用,可以使用无监督的方法学习到图的表示,进行图的分类等。
图像的卷积运算可以认为是基于欧式空间的运算,而在很多节点构成的图上进行卷积计算可以认为是基于非欧式空间的运算。图卷积运算是模拟传统卷积神经网络对图像的卷积运算,不同的是图卷积运算是基于节点的空间关系定义图卷积。针对图像的2D卷积,为了与图卷积关联起来,可以简单地将图像视为一种特殊的图,每个像素代表图上的一个节点。每个像素所代表的节点和其附近的像素有一条边。通过3*3的窗口,每个节点的淋浴是其周围的8个像素,再通过对每个通道上的中心节点机器相邻节点的像素值进行加权平均。对于一般的图,同样基于空间的图卷积将中心节点表示和相邻节点表示进行聚合,已获得该节点的新表示。
2017年Thomas N.Kipf提出了基于图卷积的深度学习网络,用于图上节点分类的半监督学习,其中逐层传播的规则为
H^(l+1)= σ(~D^(-1/2) ~A ~D^(-1/2) H^(l) W^(l))
式中,~A=A+I右下角标N 是无向网络图的邻接矩阵加上一个单位矩阵;~D=∑右下角标j A右下角标(ij);W^(l)是可训练的权重参数; σ(.)表示使用的激活函数。
针对两层的半监督的节点分类网络模型可以简单地概括为
Z=f(X,A)=softmax(^A RELU(^AXW^(0))W^(1))
式中,^A=~D^(-1/2) ~A~D^(-1/2);X表示节点的特殊矩阵;RELU表示Relu激活函数。
PyTorch Geometric(PyG)是在pytorch上的图深度学习扩展库。它包含了各种一发表的论文中对图和其他不规则结构进行深度学习的各种方法,即图深度学习。它包括一些简单易用的数据处理程序,支持GPU计算,包含大量公共基准数据集,以方便调用和模型的测试。
PyG主要包括深度学习的层模块torch_geometric.nn、数据预处理模块torch_geometric.data、常用数据集模块torch_geometric.datasets、数据操作模块torch_geometric.transforms及torch_geometric.utils模块和torch_geometric.io模块。下面将对这些模块中常用的类或者函数进行简单介绍。
模块 |
类或者函数 |
功能 |
torch_geometric.nn |
MessagePassing() |
建立消息传递层的类 |
GCNConv() |
论文Semi-Supervised Classification with Graph Convolutional Networks使用的图卷积层 |
|
ChebConv() |
论文Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering 使用的Chebyshev谱图卷积层 |
|
SAGEConv() |
论文Inductive Representation Learning on Large Graphs 使用的GraphSAGE算子层 |
|
GATConv() |
论文Graph Attention Networks 使用的图注意力算子层 |
|
BatchNorm() |
对一个batch的节点特征使用batch标准化操作 |
|
InstanceNorm() |
对一个batch的节点特征使用实例标准化操作 |
|
torch_geometric.data |
Data() |
网络图的数据类 |
Dataset() |
用于创建网络数据集的类 |
|
DataLoader() |
数据加载器 |
|
torch_geometric.datasets |
KarateClub() |
空手道俱乐部网络数据集 |
Planetoid() |
文献引用网络数据集,包含Cora、CiteSeer、PubMed三个引用网络数据 |
|
torch_geometric.transforms |
Compose() |
将多种操作组合到一起 |
Constant() |
为每个节点的特征加上一个常数 |
|
Distance() |
将节点的欧几里得举例保存在其边属性中 |
|
OneHotDegree() |
将节点度使用one-hot编码添加到节点特征中 |
|
KNNGraph() |
基于节点的位置创建一个K-NN图 |
|
torch_geometric.utils |
degree() |
计算指定节点的度 |
is_undirected() |
判断是否为无向图 |
|
to_undirected() |
转化为无向图 |
|
to_networkx() |
将数据转化为networkx可食用的networkx.DiGraph数据形式 |
下面将介绍如何使用torch_geometric库,针对Cora数据集使用半监督的深度图卷积网络,进行图上节点的分类任务。下面首先导入需要使用到的库和模块。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
from torch_geometric.utils import to_networkx
import networkx as nx
from sklearn.metrics import accuracy_score
from sklearn.manifold import TSNE
from sklearn.svm import SVC
from sklearn.semi_supervised import _label_propagation
上面的程序中导入了networkx库,该库中的函数用于网络图数据可视化,使用sklearn库中的TSNE方法对数据特征降维,同时导入了支持向量机分类方法和半监督的标签传播方法,这些方法同样可以对数据集进行分类,以及对图卷积模型的分类效果进行比较。
1.数据准备
Cora数据集由3708篇机器学习领域的论文构成,每个样本点都是一篇论文,这些论文主要被分为7个类别,分别为基于案例(Case_Based)、遗传算法(Genetic_Algorithms)、神经网络(Neural_Networks)、概率方法(Probabilistic_Methods)、强化学习(Reinforcement_Learning)、规则学习(Rule_Learing)与理论(Theory)。在该数据集中,每一篇论文至少引用了该数据集中另外一篇论文。针对每个节点所代表的的论文,都由一个1433维的词向量表示,即图上每个节点具有1433个特征。词向量的每个元素都对应一个词,且该元素仅有0或1两个取值,取0表示该元素对应的词不在论文中,取1表示在论文中,所有的词中来源于一个具有1433个词的字典。
针对Cora数据集,torch_geometric库已经准备好了可直接使用的图形式的数据,通过Planetoid()即可导入。该函数可导入Cora、CiteSeer和PubMed三个网络结构。我们使用下面的程序导入Cora数据集。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import torch
import torch.nn.functional as F
from torch_geometric.datasets import Planetoid
# from torch_geometric.utils import to_networkx
# import networkx as nx
# from sklearn.metrics import accuracy_score
# from sklearn.manifold import TSNE
# from sklearn.svm import SVC
# from sklearn.semi_supervised import _label_propagation