Spektral,一个使用TF2 和Keras 实现经典GNN 的开源库

发布时间:浏览:20

其实Spektral,一个使用TF2 和Keras 实现经典GNN 的开源库的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Spektral,一个使用TF2 和Keras 实现经典GNN 的开源库的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

这里为您推荐一个简单但灵活的开源GNN库。

Spektral 是一个基于Keras API 和TensorFlow 2 的用于图深度学习的开源Python 库。该项目的主要目的是提供一个简单而灵活的图神经网络(GNN) 框架。

我们可以使用Spektral 对网络节点进行分类、预测分子属性、使用GAN 生成新的拓扑图、聚类节点、预测链接以及使用拓扑图描述任意数据的其他任务。

Spektral实现了多种当前经典的图深度学习层:

图卷积网络(GCN)

切比雪夫网络(ChebNets)

图圣人

ARMA 卷积

边缘条件卷积(ECC)

图注意力网络(GAT)

神经预测的近似个性化传播(APPNP)

图同构网络(GIN)

它还包括以下各种池化层:

差异池

MinCUT 池化

Top-K 池化

自注意力图(SAG)池化

全局总和、平均值和最大池化

全球门控注意力池

项目地址:https://github.com/danielegrattarola/spektral/

效果展示

我们先来看看这个项目的效果。以下是用Spektral 编写的图神经网络在MNIST 数据集上的训练结果:

验证结果如下:

我们将网络权值可视化后,可以得到如下效果:

下图显示了两个图卷积层的可视化。我们可以用它来观察图神经网络是否能够学习到与传统卷积神经网络类似的特征。

动手测试

Spektral 是根据Keras API 的准则设计的,对初学者友好,同时为专家和研究人员提供灵活性。 Layers.CNN和layers.pooling是Spektral中最重要的两个模块,它们为构建GNN提供了各种经典的网络层。由于Spektral 被设计为Keras 的扩展,因此我们可以将任何Spektral 层添加到现有的Keras 模型中,而无需进行任何更改。

安装方法

Spektral支持Python 3.5及以上版本,并在Ubuntu 16.04+和MacOS上进行了测试。暂时不支持Windows(抱歉)。这里我们以Ubuntu为例安装相关依赖:

sudo apt install graphviz libgraphviz-dev libcgraph6

安装Spektral 最简单的方法是通过PyPi:

pip 安装spektral

使用以下命令从源安装Spektral:

git clone https://github.com/danielegrattarola/spektral.gitcd spektralpython setup.py install # 或'pip install .'

机器之心友情提醒:由于TensorFlow API的变化是个谜,建议使用TensorFlow 2.2版本并从源安装Spektral(不要问我怎么知道的)。

使用GNN 解决Cora 数据集中的分类问题

我们以2017 年ICLR 论文《SEMI-SUPERVISED CLASSIFICATION With GRAPH CONVOLUTIONAL NETWORKS》中提出的图卷积网络(GCN)为例,介绍如何使用Spektral 轻松快速地构建和训练图神经网络。

这里GCN的训练问题属于直推推理(transconductive Learning),即训练时所有节点和边都作为输入,但只有部分输入有标签。训练的目标是使网络能够预测未标记的样本。下图是GCN的示意图。

左图是多层GCN的示意图。右图显示了使用t-SNE 的两层GCN 中隐藏层激活的可视化结果。

我们使用Cora 数据集训练GCN,该数据集由机器学习领域的7 类论文组成,分别是:

基于案例

遗传算法

神经网络

概率方法

强化学习

规则学习

理论

Cora数据集总共包含2708篇论文,每篇论文至少引用了数据集中的一篇其他论文,或者被其他论文引用。剔除停用词并去除文档频率小于10的单词后,最终词汇表共有1433个单词。

使用Spektral 中的datasets.itation 模块,我们可以轻松下载和阅读Cora、Citeseer 和Pubmed 等引文数据集。以下代码展示了如何读取Cora数据集:

来自spektral.datasets *导入* 引用A、X、y、train_mask、val_mask、test_mask=引用.load_data('cora')

N=A.shape[0]F=X.shape[-1]n_classes=y.shape[-1]

其中A是形状(N,N)的网络邻接矩阵,X是形状(N,F)的节点特征,y表示形状(N,n_classes)的标签。

构建GNN

这里我们使用GraphConv 网络层和其他一些Keras API 来构建GCN:

从spektral.layers 导入GraphConvfromtensorflow.keras.models 导入模型从tensorflow.keras.layers 导入输入,Dropout

构建GCN的方式与构建其他Keras模型没有什么不同,但是需要注意GraphConv层的输入是X和A:

X_in=输入(形状=(F, ))A_in=输入((N, ), 稀疏=*真*)

X_1=GraphConv(16, 'relu')([X_in, A_in])X_1=Dropout(0.5)(X_1)X_2=GraphConv(n_classes, 'softmax')([X_1, A_in])

模型=模型(输入=[X_in,A_in],输出=X_2)

至此,我们已经完成了GCN的搭建。是不是很简单呢?

训练GNN

在训练GCN之前,我们首先需要对邻接矩阵进行预处理。静态类方法preprocess() 提供了每一层所需的预处理方法。在这个GCN示例中,我们使用以下方法进行预处理:

A=GraphConv.preprocess(A).astype('f4')

现在一切准备工作都已准备就绪。使用以下代码编译模型:

model.compile(optimizer='adam',loss='categorical_crossentropy',weighted_metrics=['acc'])model.summary()

输出如下:

接下来我们可以使用Keras中提供的fit()方法来训练模型:

# 准备dataX=sample_weight=train_mask,validation_data=validation_data,batch_size=N,shuffle=False)

以下是训练过程的输出:

验证模型

同样,我们可以轻松地使用Keras 中提供的方法来验证模型:

# 评估模型eval_results=model.evaluate([X, A], y,sample_weight=test_mask,batch_size=N)print('完成。\n''测试损失: {}\n''测试精度: {}'.format(eval_results ))

结果如下:

下图是GCN论文中的分类结果:

可以看到,论文中Cora数据集上GCN的分类准确率为81.5%,而我们训练的模型准确率为74.9%。经过一些简单的超参数调整(例如增加epoch),Heart of Machine的实际测量可以达到与论文中几乎相同的精度。有兴趣的读者可以自行测试一下。

参考连接:

https://www.kaggle.com/kmader/mnist-graph-deep-learning

用户评论

娇眉恨

终于有个可以轻松玩转GNN的库了!之前一直没机会深入研究GNN,有了Spektral这块儿工具,感觉一下子打开了新世界的大门。希望后续也能集成更多模型和应用案例!

    有6位网友表示赞同!

来自火星的我

作为一个机器学习新手,对于GNN了解还比较浅显,看到这个开源库非常欣喜,希望能尽快上手,然后通过实践更深入地理解GNN的原理和应用场景。

    有12位网友表示赞同!

无望的后半生

Spektral基于TF2和Keras开发的GNN库确实很友好,对初学者来说更容易上手。以前使用TensorFlow构建GNN需要更多的定制代码,这方面我觉得Spektral做得很棒!

    有17位网友表示赞同!

失心疯i

之前用PyTorch实现一个经典的GNN模型走了很长时间,这个开源库简直是太棒了!希望以后能加入更多预训练模型和数据集,这样可以更方便地进行研究和应用。

    有9位网友表示赞同!

孤者何惧

这篇文章介绍的很清楚,让我对Spektral的特性有了初步了解。感觉可以利用它来处理一些图数据,比如推荐系统、知识图谱等领域的数据分析和预测问题

    有5位网友表示赞同!

哽咽

这个开源库的命名很有意思—"Spektral",让人立刻联想到光谱分析和图结构的关系。希望在未来能看到更多基于Spektral的创新应用。

    有19位网友表示赞同!

看我发功喷飞你

我觉得这篇文章缺少一些更具体的实操细节,比如对不同GNN模型的实现细节、性能对比等方面的阐述,能够丰富文章内容

    有14位网友表示赞同!

墨染殇雪

很高兴看到一个专门用于经典GNN的开源库!相信Spektral能帮助许多研究者和开发者更容易地深入理解和应用GNN。

    有14位网友表示赞同!

♂你那刺眼的温柔

其实很多时候 GNN 的模型实现细节差别不大,重点在于数据的处理和特征提取。希望Spektral可以提供一些更实用的预处理和特征降维工具

    有17位网友表示赞同!

余温散尽ぺ

这个开源库在实际使用中遇到的问题有哪些?期待作者分享一些实践经验和建议

    有7位网友表示赞同!

爱情的过失

最近一直在研究GNN用于社会网络分析,Spektral这块开源库正好能帮到我!希望看到它能够支持更多主流的图数据库接口。

    有8位网友表示赞同!

男神大妈

文章没有提及Spektral与其他GNN库(如GraphCore、Deep Graph)的差异和优劣势对比,可以增强文章的可读性和参考价值。

    有12位网友表示赞同!

如梦初醒

作为一名深度学习爱好者,我一直想探索GNN算法,这个开源库简直是太棒了!希望以后能发展成一个强大且成熟的GNN生态系统。

    有8位网友表示赞同!

神经兮兮°

虽然Spektral提供了一些方便的工具,但对于复杂GNN的构建和调试依然需要一定的深度理解和编程经验。建议作者可以提供更丰富的学习资源,帮助开发者更好地上手使用

    有14位网友表示赞同!

七夏i

用 Keras 框架实现GNN 感觉很清新简洁,希望 Splenstral 能尽快完善功能,支持更多类型的图数据和模型,以便于更广泛的应用。

    有10位网友表示赞同!

■孤独像过不去的桥≈

这个开源库是研究者和开发者很好的工具,但是对于完全没有接触过GNN的人来说,需要先进行一些基础学习才能理解其使用方法。文章可以考虑加入一些更基础的知识介绍

    有12位网友表示赞同!

蝶恋花╮

感觉这个开源库挺有潜力!希望能吸引更多开发者参与,共同完善这个GNN 工具生态系统!

    有12位网友表示赞同!

?娘子汉

这是一个非常有意义的开源项目!希望Spektral能够降低GNN的技术门槛,让更多人能受益于此强大的工具

    有14位网友表示赞同!

热点资讯