前言:
结合阿里算法工程师写的关于DGL库文章中的例子和DGL的文档,写了这篇关于DGL的笔记(代码可以跑通)。
安装图神经网络库DGL:
通过pip install dgl==0.4.1
1问题描述:
空手道俱乐部(Zachary's karate club)一共包含34个成员,成员之间有交互的关系。俱乐部后来分类成以指导员(节点0)和俱乐部主席(节点33)为首两个团队。任务是预测每个节点会加入哪一边。
2 代码实现
1构建karate_club图。
注释:
对于无向图而言,需要构建一个双向图。另一种双向图的构建方法可以使用dgl.to_bidirected()。
构建图神经网络
图卷积审计网络框架
在第l层,每个节点用一个节点向量表示
GCN的每一层目的是聚合每一个节点的邻居节点们用来生成下一层的向量表示,然后接一个非线性的仿射变换。上面整个可以看成message-passing:每个节点会接受邻居节点表示。
注释:
message function的输入是DGL中的edges,每个的edges有三个元素src(开始节点的特征),dst(终止节点的特征)和data(边的特征);reduce function的输入是nodes。点通过mailbox收集它邻居的信息并且发送给它。reduce 的基本运算包括sum,max,min等。update function的输入是nodes,这步结合从reduce function的结果,在最后一步结合了点的特征。
数据初始化:使用one-hot向量初始化节点。因为一个半监督的设定,仅有指导员(节点0)和俱乐部主席(节点33)被分为0和1.
训练:使用adam优化器,然后输入input数据,计算loss,最后反向传导
展示最终结果:从训练中得到每个节点的压缩后的两维的向量,然后可视化最终结果。
Reference:
DGL文档:https://docs.dgl.ai/guide/graph.html
秦蓁的机器学习笔记:https://www.zhihu.com/column/c_1173319214768201728