GCN实现3

参考 :

首先看两篇论文,大概了解一下原理性的东西:

GRAPH CONVOLUTIONAL NETWORKS THOMAS KIPF, 30 SEPTEMBER 2016
http://tkipf.github.io/graph-convolutional-networks/

Multi-layer Graph Convolutional Network (GCN) with first-order filters.

Overview综述
许多重要的现实世界数据集以图表或网络的形式出现:社交网络、知识图表、蛋白质交互网络、万维网等等(仅举几例)。然而,直到最近,很少有人关注神经网络模型泛化到这样的结构化数据集。在过去的几年里,许多论文重新探讨了将神经网络推广到任意结构图上的问题(Bruna等,ICLR 2014;Henaff等,2015;Duvenaud等,NIPS 2015;Li等人,ICLR 2016;Defferrard等,NIPS 2016;Kipf和Welling, ICLR 2017),他们中的一些人现在在一些以前由基于内核的方法、基于图的正则化技术等领域取得了非常有前途的结果。

在这篇文章中,我将简要概述这一领域的最新发展,并指出各种方法的优缺点。这里的讨论主要集中在最近的两篇论文上:

  1. Kipf & Welling (ICLR 2017), Semi-Supervised Classification with Graph Convolutional Networks
  2. Defferrard et al. (NIPS 2016), Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering

Ferenc Huszar的评论:图卷积有多强大?(https://www.inference.vc/how-powerful-are-graph-convolutions-review-of-kipf-welling-2016-2/)讨论了这类模型的一些局限性。
在这里(在这篇文章的最后)对Ferenc的评论写了一个简短的评论。

Outline
*Short introduction to neural network models on graphs 简要介绍图上的神经网络模型
*Spectral graph convolutions and Graph Convolutional Networks (GCNs) 谱图卷积和图卷积网络
*Demo: Graph embeddings with a simple 1st-order GCN model 演示:图嵌入与一个简单的一阶GCN模型
*GCNs as differentiable generalization of the Weisfeiler-Lehman algorithm GCNs作为weisfeler - lehman算法的可微推广

图卷积网络有多强大?
最近的文献概括了像RNNs或CNNs这样已经建立的神经模型来处理任意结构的图是一个具有挑战性的问题。最近的一些论文介绍了特定问题的专用体系结构(如Duvenaud等人,NIPS 2015;Li等人,ICLR 2016;Jain et al., CVPR 2016),其他人则利用光谱图理论中已知的图卷积(Bruna et al., ICLR 2014;定义多层神经网络模型中使用的参数化过滤器,类似于我们所知道和喜爱的“经典”CNNs。最近的工作重点是弥合快速启发法和较慢但更有原则的光谱方法之间的差距。Defferrard等人(NIPS 2016)使用Chebyshev多项式在光谱域近似平滑滤波器,使用在类神经网络模型中学习的自由参数。它们在常规域(如MNIST)上取得了令人信服的结果,与简单的2D CNN模型非常接近。Kipf &威灵电机(ICLR 2017),我们采取类似的方法,从框架通过卷积谱图,然而介绍简化(稍后我们将得到这些post),在很多情况下允许显著更快的训练时间和更高的预测精度,达到最先进的基准图的数据集的分类结果。

GCNs第一部分:定义
目前,大多数图神经网络模型都有一个通用的体系结构。我将这些模型称为图卷积网络(GCNs);卷积,因为过滤器参数通常在图中的所有位置共享(或其中的一个子集,如Duvenaud等人,NIPS 2015)。
对于这些模型,目标是学习图上信号/特征的函数

让我们来看看我们的简单GCN模型(见前一节或Kipf & Welling, ICLR 2017)是如何在一个著名的图形数据集上工作的:Zachary的空手道俱乐部网络(见上图)。我们取一个3层的GCN,它的权值是随机初始化的。现在,甚至在训练权值之前,我们只需将图的邻接矩阵和X=IX=I(即单位矩阵,因为我们没有任何节点特征)插入到模型中。3层的GCN现在在前向传递中执行三个传播步骤,并有效地对每个节点的3阶邻域进行卷积(所有节点到3“跳”远)。值得注意的是,该模型生成了这些节点的嵌入,它们与图中的社区结构非常相似(见下图)。请记住,我们已经完全随机地初始化了权值,并且还没有执行任何训练更新(到目前为止)!

这似乎有点令人惊讶。最近一篇关于DeepWalk模型的论文(Perozzi et al., KDD 2014)表明,他们可以在复杂的无监督训练过程中学习非常类似的嵌入。怎么可能得到这样一个嵌入或多或少“免费”使用我们简单的未经训练的GCN模型?通过将GCN模型解释为众所周知的图上的weisfeler - lehman算法的广义可微版本,我们可以对此提供一些启发。(1维)weisfeler - lehman算法如下:

实际上,weisfeler - lehman算法为大多数图分配了一组独特的特征。这意味着每个节点都被分配了一个唯一描述其在图中的角色的特性。例外情况是高度规则的图形,如网格、链等。对于大多数不规则图,这种特征分配可以用来检查图的同构性(即两个图是否相同,直到节点的排列)。
回到我们的Graph Convolutional layer -wise propagation rule (now in vector form):

GCNs Part IV:半监督学习
由于我们的模型中的所有东西都是可微分和参数化的,我们可以添加一些标签,训练模型并观察嵌入的反应。我们可以使用Kipf & Welling (ICLR 2017)中引入的GCNs半监督学习算法。我们只是为每个类/社区标记一个节点(在下面的视频中突出显示的节点),并开始进行一些迭代训练5:
http://tkipf.github.io/graph-convolutional-networks/images/video.mp4
注意,该模型直接产生了一个二维的潜在空间,我们可以立即可视化。我们观察到,3层的GCN模型能够线性地分离社区,每个类只给出一个标记的示例。考虑到模型没有收到节点的特征描述,这是一个有点值得注意的结果。同时,可以提供初始的节点特征,这正是我们在论文(Kipf & Welling, ICLR 2017)中描述的实验中所做的,以实现对大量图数据集的最新分类结果。

关于这一课题的研究才刚刚开始。过去几个月出现了令人兴奋的发展,但迄今为止,我们可能只触及了这些类型模型的皮毛。如何将图上的神经网络进一步应用于特定类型的问题,如在有向图或关系图上的学习,以及如何将学习过的图嵌入用于未来的任务,这些都有待观察。这个列表绝不是详尽的,我期望在不久的将来会出现更多有趣的应用程序和扩展。
We have released the code for Graph Convolutional Networks on GitHub: https://github.com/tkipf/gcn.

【GCN+AE代码逐行学习】参考资料记录:
https://www.baidu.com/link?url=0VitAaCEOfc60eW_bXCRmiuYV7SV5O7cuElOGJaoGk1D-QZHlckKtwv8YXoLYrfB7TONrsN-y46R6702byd7o9ecz1eW3-3SdNOBgnS44BG&wd=&eqid=9d04d9070008d75a000000065d9eae5a

keras版本:https://codeload.github.com/tkipf/keras-gcn/zip/master

tensorflow版本:https://github.com/tkipf/gcn.

pytorch框架下实现的GCN代码:https://github.com/tkipf/pygcn

接下来分析tensorflow版本的:
首先下载相关文件:

然后准备数据:
为了使用您自己的数据,您必须提供:
一个N×N的邻接矩阵(N是节点的数量),
一个N×D的特征矩阵(D是每个节点的特征数量),
一个N×E的二进制标签矩阵(E是类的数量)。

以utils.py中的load_data()函数为例。
Have a look at the load_data() function in utils.py for an example. In this example, we load citation network data (Cora, Citeseer or Pubmed). The original datasets can be found here: http://linqs.cs.umd.edu/projects/projects/lbc/. In our version (see data folder) we use dataset splits provided by https://github.com/kimiyoung/planetoid (Zhilin Yang, William W. Cohen, Ruslan Salakhutdinov, Revisiting Semi-Supervised Learning with Graph Embeddings, ICML 2016). You can specify a dataset as follows: python train.py --dataset citeseer (or by editing train.py)

模型选择:
You can choose between the following models: gcn: Graph convolutional network (Thomas N. Kipf, Max Welling, Semi-Supervised Classification with Graph Convolutional Networks, 2016) gcn_cheby: Chebyshev polynomial version of graph convolutional network as described in (Michaël Defferrard, Xavier Bresson, Pierre Vandergheynst, Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering, NIPS 2016) dense: Basic multi-layer perceptron that supports sparse inputs

图分类Graph classification:
我们的框架还支持使用每个邻接矩阵对多个图实例(可能大小不同)进行分批分类。最好是将各自的特征矩阵串联起来,构建一个(稀疏的)块对角矩阵,其中每个块对应一个图实例的邻接矩阵。对于池(在图级输出而不是节点级输出的情况下),最好指定一个简单的池矩阵,从各自的图实例中收集特性,如下图所示:

代码结构:

.── data // 图数据
├── inits // 初始化的一些公用函数
├── layers // GCN层的定义
├── metrics // 评测指标的计算
├── models // 模型结构定义
├── train // 训练
└── utils // 工具函数的定义

训练结果:

原文地址:https://www.cnblogs.com/Ann21/p/11654086.html