图卷积神经网络(GCN)
一、前言
深度学习一直都是被几大经典模型给统治着,如CNN、RNN等等,它们无论再CV还是NLP领域都取得了优异的效果,那这个GCN是怎么跑出来的?是因为我们发现了很多CNN、RNN无法解决或者效果不好的问题——图结构的数据。我们做图像识别,对象是图片,是一个二维的结构,于是人们发明了CNN这种神奇的模型来提取图片的特征。CNN的核心在于它的kernel,kernel是一个个小窗口,在图片上平移,通过卷积的方式来提取特征。这里的关键在于图片结构上的平移不变性:一个小窗口无论移动到图片的哪一个位置,其内部的结构都是一模一样的,因此CNN可以实现参数共享。这就是CNN的精髓所在。再回忆一下RNN系列,它的对象是自然语言这样的序列信息,是一个一维的结构,RNN就是专门针对这些序列的结构而设计的,通过各种门的操作,使得序列前后的信息互相影响,从而很好地捕捉序列的特征。
图卷积网络是把CNN拓展到非欧几里德数据。我们知道卷积神经网络之所以效果非常好,是因为利用了数据的局部结构特性(locality),所以在GCN里必须考虑的问题是如何利用数据的局部性。根据局部性不同,可以分成两类方法:(1)频域角度(2)空域角度。以空域角度为例子,直观地说,我们需要解决两个问题:其一是CNN里,神经元除了相邻之外还具有空间位置关系。而图里面没有空间位置关系,本质上缺少区分不同相邻节点的能力。其二是图里,每个节点的相邻节点数目不固定,导致无法固定卷积核的大小,从而无法共享参数。gcn设计了一些机制来解决这些问题。
二、GCN的原理
参考文章:https://blog.csdn.net/chensi1995/article/details/77232019
三、GCN源码分析
源代码 github:https://github.com/tkipf/gcn
源码剖析:https://www.jianshu.com/p/ad528c40a08f
GCN+AE代码逐行学习】参考资料记录:https://blog.csdn.net/qq_41727666/article/details/85334984
Keras版GCN源码解析:https://blog.csdn.net/tszupup/article/details/89004637
├── gcn
│ ├── data //图数据
│ │ ├── ind.citeseer.allx
│ │ ├── ind.citeseer.ally
│ │ ├── ind.citeseer.graph
│ │ ├── ind.citeseer.test.index
│ │ ├── ind.citeseer.tx
│ │ ├── ind.citeseer.ty
│ │ ├── ind.citeseer.x
│ │ ├── ind.citeseer.y
│ │ ├── ind.cora.allx
│ │ ├── ind.cora.ally
│ │ ├── ind.cora.graph
│ │ ├── ind.cora.test.index
│ │ ├── ind.cora.tx
│ │ ├── ind.cora.ty
│ │ ├── ind.cora.x
│ │ ├── ind.cora.y
│ │ ├── ind.pubmed.allx
│ │ ├── ind.pubmed.ally
│ │ ├── ind.pubmed.graph
│ │ ├── ind.pubmed.test.index
│ │ ├── ind.pubmed.tx
│ │ ├── ind.pubmed.ty
│ │ ├── ind.pubmed.x
│ │ └── ind.pubmed.y
│ ├── __init__.py
│ ├── inits.py //初始化的公用函数
│ ├── layers.py //GCN层定义
│ ├── metrics.py //评测指标的计算
│ ├── models.py //模型结构定义
│ ├── train.py //训练
│ └── utils.py //工具函数的定义
├── LICENCE
├── README.md
├── requirements.txt
└── setup.py
四、参考资料
1、如何理解GCN
5、GCN的应用
6、关于GCN领域的方法和应用的综述:Graph Neural Networks:A Review of Methods and Applications
7、GCN相关论文