图注意力模型GAT代码分析(Keras版)

本文分享一个对Keras版GAT源码的分析。
GAT原文:https://arxiv.org/abs/1710.10903,建议参考着知乎superbrother大神的文章进行理解。
TensorFlow版可以看:GitHub - PetarV-/GAT: Graph Attention Networks (https://arxiv.org/abs/1710.10903)
源代码 github:GitHub - danielegrattarola/keras-gat: Keras implementation of the graph attention networks (GAT) by Veličković et al. (2017; https://arxiv.org/abs/1710.10903)

1 utils.py

    utils.py定义数据的加载,预处理,与normalize adj矩阵

from __future__ import print_function

import os
import pickle as pkl
import sys

import networkx as nx
import numpy as np
import scipy.sparse as sp


def parse_index_file(filename):
    """Parse index file."""
    index = []
    for line in open(filename):
        index.append(int(line.strip()))
    return index


def sample_mask(idx, l):
    """Create mask."""
    mask = np.zeros(l)
    mask[idx] = 1
    return np.array(mask, dtype=np.bool)


def load_data(dataset_str):
    """Load data."""
    """
    Loads input data from gcn/data directory

    ind.dataset_str.x => the feature vectors of the training instances as scipy.sparse.csr.csr_matrix object;
    ind.dataset_str.tx => the feature vectors of the test instances as scipy.sparse.csr.csr_matrix object;
    ind.dataset_str.allx => the feature vectors of both labeled and unlabeled training instances
        (a superset of ind.dataset_str.x) as scipy.sparse.csr.csr_matrix object;
    ind.dataset_str.y => the one-hot labels of the labeled training instances as numpy.ndarray object;
    ind.dataset_str.ty => the one-hot labels of the test instances as numpy.ndarray object;
    ind.dataset_str.ally => the labels for instances in ind.dataset_str.allx as numpy.ndarray object;
    ind.dataset_str.graph => a dict in the format {index: [index_of_neighbor_nodes]} as collections.defaultdict
        object;
    ind.dataset_str.test.index => the indices of test instances in graph, for the inductive setting as list object.

    All objects above must be saved using python pickle module.

    :param dataset_str: Dataset name
    :return: All data input files loaded (as well the training/test data).
    """
    """
    从data文件中读取数据,文档中包含3组数据'cora', 'citeseer',与'pubmed',每组数据有8种类型。
    'x'为训练数据的特征向量,
    'tx'为测试数据的特征向量,
    'allx','ally':整个graph上除test外的(包括train和val) 所有data的特征和便签,
    'y'为训练数据的标签,'ty'为测试数据的标签,
    'index'为测试数据的ID,
    'graph'为图数据。
    """
    #返回的是.py文件的绝对路径
    FILE_PATH = os.path.abspath(__file__)
    #返回的是.py文件的目录
    DIR_PATH = os.path.dirname(FILE_PATH)
    #到这里返回了data文件夹的绝对路径
    DATA_PATH = os.path.join(DIR_PATH, 'data/')

    names = ['x', 'y', 'tx', 'ty', 'allx', 'ally', 'graph']
    objects = []
    for i in range(len(names)):
        with open("{}ind.{}.{}".format(DATA_PATH, dataset_str, names[i]), 'rb') as f:
            if sys.version_info > (3, 0):
                objects.append(pkl.load(f, encoding='latin1'))
            else:
                objects.append(pkl.load(f))
    # x.shape:(140, 1433); y.shape:(140, 7);tx.shape:(1000, 1433);ty.shape:(1708, 1433);
    # allx.shape:(1708, 1433);ally.shape:(1708, 7)
    x, y, tx, ty, allx, ally, graph = tuple(objects)
    # 训练数据集
    # print(x[0][0],x.shape,type(x))  ##x是一个稀疏矩阵,记住1的位置,140个实例,每个实例的特征向量维度是1433  (140,1433)
    # print(y[0],y.shape)   ##y是标签向量,7分类,140个实例 (140,7)

    ##测试数据集
    # print(tx[0][0],tx.shape,type(tx))  ##tx是一个稀疏矩阵,1000个实例,每个实例的特征向量维度是1433  (1000,1433)
    # print(ty[0],ty.shape)   ##y是标签向量,7分类,1000个实例 (1000,7)

    ##allx,ally和上面的形式一致
    # print(allx[0][0],allx.shape,type(allx))  ##tx是一个稀疏矩阵,1708个实例,每个实例的特征向量维度是1433  (1708,1433)
    # print(ally[0],al
  • 14
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
【项目介绍】 基于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.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
好的,我会根据您的要求尽力回答。但是需要先说明一下,GAT模型主要用于神经网络中的节点分类和分类等任务,不太适用于用户贷款概率的预测任务。所以,我会使用其他适用于该任务的模型进行预测。 以下是使用Keras框架搭建一个简单的神经网络模型进行用户贷款概率预测的Python代码: ```python import numpy as np from keras.models import Sequential from keras.layers import Dense, Dropout # 准备训练数据和标签 X_train = np.random.rand(1000, 10) # 假设共有1000个用户,每个用户有10个特征 y_train = np.random.randint(2, size=(1000, 1)) # 假设标签为0或1,表示是否会在未来一个月内申请贷款 # 搭建神经网络模型 model = Sequential() model.add(Dense(64, input_dim=10, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1, activation='sigmoid')) # 编译模型 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train, y_train, epochs=20, batch_size=128) # 准备测试数据 X_test = np.random.rand(100, 10) # 假设共有100个用户需要预测 # 预测测试数据的贷款概率 y_pred = model.predict(X_test) ``` 上述代码中,我们使用了一个具有两个隐藏层的全连接神经网络,采用了ReLU激活函数和Dropout正则化技术,以防止过拟合。在训练过程中,我们使用了二元交叉熵作为损失函数,Adam优化器进行模型优化,并记录了模型的准确率。在训练完成后,我们使用训练好的模型对测试数据进行了贷款概率的预测。 注意,上述代码中的数据都是随机生成的,您需要根据实际情况进行修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值