Keras实现图注意力模型GAT

简介:本文实现了一个GAT图注意力机制的网络层,可以在Keras中像调用Dense网络层、Input网络层一样直接搭积木进行网络组合。

一,基本展示

        如下图所示,我们输入邻接矩阵和节点特征矩阵之后,可以直接调用myGraphAttention网络层得到每一头的注意力输出(节点emdbeding),十分的方便。

        注意:上图有个BUG,最终的输出层应该是8,和输入节点特征保持一致,上图只是举一个例子。

二,代码实现

2.1 GAT网络层

        GAT网络层的代码如下。

from __future__ import absolute_import
from keras.activations import relu
from keras import activations, constraints, initializers, regularizers
from keras import backend as K
from keras.layers import Layer, Dropout, LeakyReLU

# 定义图卷积层
class myGraphAttention(Layer):

    def __init__(self,
                 F_,
                 activation='relu',
                 use_bias=True,
                 drop_rate = 0,
                 kernel_initializer='glorot_uniform',
                 bias_initializer='zeros',
                 attn_kernel_initializer='glorot_uniform',
                 kernel_regularizer=None,
                 bias_regularizer=None,
                 attn_kernel_regularizer=None,
                 activity_regularizer=None,
                 kernel_constraint=None,
                 bias_constraint=None,
                 attn_kernel_constraint=None,
                 **kwargs):

        self.F_ = F_  # 输出的节点embeding维度
        self.activation = activations.get(activation) # 输出结果之前的激活函数
        self.use_bias = use_bias

        """
        其他代码………………
        """
        super(myGraphAttention, self).__init__(**kwargs)

    def build(self, input_shape):
        """
        其他代码………………
        """

    def call(self, inputs):
        X = inputs[0]  # 节点特征 (N x F)
        A = inputs[1]  # 邻接矩阵 (N x N)
 
        """
        其他代码………………
        """
  
        # 加上偏置
        if self.use_bias:
            node_features = K.bias_add(node_features, self.bias)

        # 最终的输出之前得激活一下
        output = self.activation(node_features)
        return output

    def compute_output_shape(self, input_shape):
        output_shape = input_shape[0][0], self.output_dim
        return output_shape

2.2 模型搭建

        模型搭建的代码如下。

from keras.layers import Layer,Input,Dense,add,Lambda
from keras.models import Model

inp_adj_martrix = Input(shape=(5,5),name='adj_martrix')
inp_node_features = Input(shape=(5,8),name='node_features_martrix')

# 在这里直接调用网络层
flat0 = myGraphAttention(12,name="head_0")([inp_node_features,inp_adj_martrix])
flat1 = myGraphAttention(12,name="head_1")([inp_node_features,inp_adj_martrix])
flat2 = myGraphAttention(12,name="head_2")([inp_node_features,inp_adj_martrix])

flat = add([flat0,flat1,flat2])

lorder = 1
one_node = Lambda(lambda inp: inp[:,0,:],name = "the-first-node-feature")(flat)


o1 = Dense(32,activation="relu")(one_node)
o2 = Dense(32,activation="relu")(o1)
out = Dense(12)(o2)

model = Model([inp_adj_martrix,inp_node_features],[out])

        创作不易,需要完整代码4_liao我哦。还有很多预测网络结构。

【项目介绍】 基于Keras+cora和citeseer数据集实现GAT训练及节点分类测试python源码+数据集+项目说明.zip 环境: CUDA:11.6.134 cuDNN:8.4.0 keras:2.9.0 tensorflow:2.9.1 注意: 项目内目录中两个文件夹: 1. /datasets:将数据集文件解压至此 2. /save_models:保存训练好的模型权重文件,包括生成器权重和判别器权重两个文件 GAT概述 神经网络(Graph Neural Network, GNN)是指神经网络在上应用的模型的统称,根据采用的技术不同和分类方法的不同, 又可以分为下中的不同种类,例如从传播的方式来看,神经网络可以分为卷积神经网络(GCN),注意力网络(GAT),Graph LSTM等等 注意力网络(Graph Attention Network, GAT),一种基于结构数据的新型神经网络架构,利用隐藏的自我注意层来解决之前基于卷积或其近似的方法的不足。通过堆叠层,节点能够参与到邻居的特征,可以(隐式地)为邻域中的不同节点指定不同的权值,而不需要任何代价高昂的矩阵操作(如反转),也不需要预先知道的结构。通过这种方法,该模型克服了基于频谱的故神经网络的几个关键挑战,并使得模型适用于归纳和推理问题。 数据集: cora:包含2708篇科学出版物网络,共有5429条边,总共7种类别。 数据集中的每个出版物都由一个 0/1 值的词向量描述,表示字典中相应词的缺失/存在。 该词典由 1433 个独特的词组成。 链接:https://pan.baidu.com/s/1u7v3oJcTvnFWAhHdSLHwtA?pwd=52dl 提取码:52dl citeseer:包含3312个节点,4723条边构成的引文网络。标签共6个类别。数据集的特征维度是3703维。 链接:https://pan.baidu.com/s/11n2AQCVSV6OevSkUhYWcNg?pwd=52dl 提取码:52dl 通过测试,采用以下设置: train_nodes = 140# 训练节点数量 epochs = 100# 迭代次数 hidden_dim=128# 隐层维度 att_heads=6# 注意力头数量 dropout_rate = 0.5# dropout概率率 Adam LR = 5e-3# 学习率 GAT在cora数据集和citeseer数据集上具有70%和80%左右的准确率,上面参数随便设置的,调好超参数应该还能提高一点。 【备注】 1.项目代码均经过功能验证,确保稳定可靠运行。欢迎下载食用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值