当前位置: 首页 > news >正文

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

请添加图片描述

GRAPH ATTENTION NETWORKS 代码详解

  • 前言
  • 0.引言
  • 1. 环境配置
  • 2. 代码的运行
    • 2.1 报错处理
    • 2.2 运行结果展示
  • 3.总结

前言

在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段,我们将借助强大的深度学习框架PyTorch,通过实战讲解来展示如何构建和训练一个GAT模型。这一过程不仅帮助读者巩固理论知识,更重要的是,它将引导读者从理论迈向实践,实现在处理具有图结构数据的问题上的质的飞跃。

在本章节中,我将主要介绍如何运行代码以获取计算结果。考虑到我的读者中有很多是初学者,我认为在深入探讨代码的各种细节之前,首先了解如何简单地运行模型并查看其结果是非常必要的。这不仅可以帮助读者迅速掌握操作,还能使他们对模型的工作流程有一个直观的认识。

这个原文的代码地址感兴趣的读者自行下载即可 https://github.com/2578562306/pyGAT

在这里插入图片描述

😃当然要是觉得还不错的话,烦请点赞,收藏➕关注👍

0.引言

这是 Veličković 等人在 2017 年提出的图注意力网络(GAT)模型的 PyTorch 实现(https://arxiv.org/abs/1710.10903)。该代码库最初从 https://github.com/tkipf/pygcn 分叉而来。GAT 的官方仓库(采用 TensorFlow 实现)可以在 https://github.com/PetarV-/GAT 找到。目前网络上的主流讲解基本都是以这些版本的代码为基础,因此,我们将依据这些代码深入探索 GAT,了解图神经网络中如何实现注意力机制的能力。

重要说明==此外,本 PyTorch 实现与原始的 TensorFlow 版本(见此链接)存在一些细微差异。当前的 PyTorch 版本主要旨在进行概念验证,并非旨在完全复现原论文中报告的结果。因此,复现出来的结果与原始论文中的结果存在一定的差距。在对当前代码进行讲解之后,作者将分析这些差异,并指导大家如何复原文中的实验结果。==该实现使用的是 Cora 数据集,其主要被分成了两个文件。具体细节将在下一章节的代码分析部分进行详细说明。

1. 环境配置

如果您已经配置好相关环境,可以跳过本部分。

对于计划在特定环境下运行图注意力网络(GAT)的开发者而言,了解并设置正确的系统要求是至关重要的初步步骤。以下详述了系统和软件环境的要求,以确保GAT可以被正确安装并顺利运行。

必需的软件和库:

  • PyTorch: 需要安装的版本为0.4.1。PyTorch是执行深度学习模型的核心库,尤其是在本实现中的图注意力网络(GAT)。
  • Python: 支持的版本为3.5。Python是运行这一图注意力网络代码的基本环境。由于使用了torch.sparse_coo_tensor,我们依赖特定版本的PyTorch和Python。

Python包依赖:
正确安装以下Python包是确保模型正常运行的前提条件。您可以通过运行下列命令来安装或检验这些依赖是否正确安装:

这里你可以插入具体安装依赖的命令,其中模型还是用到numpy和scipy的库,可以通过使用pip安装:

pip install numpy
pip install scipy

请确保所有的环境配置都符合要求,以便无障碍地运行和应用图注意力网络。

使用 Python 开发环境中需要使用外部库,如 numpy, torch, 和 scipy 等时,可以通过 pip 命令来安装这些库。pip 是 Python 的官方包管理系统,用于安装和管理软件包,这些包通常来自于 Python 包索引(PyPI),它是一个集中存放 Python 程序包的仓库。

如何使用 pip 在命令行中安装软件包???????:

  1. 打开命令行工具

    • 在 Windows 上,可以打开命令提示符或 PowerShell。
    • 在 macOS 或 Linux 上,可以打开终端。
  2. 输入安装命令

    • 在命令行中输入 pip install 包名 命令。例如,要安装 Numpy,就输入 pip install numpy
  3. 执行命令

    • 按回车键,pip 将自动从 PyPI 下载并安装该软件包及其依赖。

安装多个包

  • 如果要一次安装多个包,可以在同一命令行中列出所有包,用空格隔开。例如:pip install numpy torch scipy

此过程将在您的系统上安装指定的 Python 库,允许您在任何 Python 脚本或项目中导入并使用这些库。

注意事项:

  • 确保您的网络连接畅通,因为 pip 需要从互联网下载包。
  • 在某些情况下,如果默认的 pip 安装的不是针对您当前使用的 Python 版本,可能需要使用 pip3 替代 pip
  • 根据您的系统设置,可能需要管理员权限来安装包。在这种情况下,您可能需要在命令前加上 sudo(适用于 Linux 和 macOS),例如 sudo pip install numpy

通过以上步骤,您可以轻松地通过 pip 在任何支持的开发环境中安装和管理 Python 包,从而为开发工作提供必要的库支持。

大家很多同学都用 Jupyter Notebook 或 Visual Studio Code(VSCode)进行 Python 开发时,使用 pip 安装库同样是一个简单且有效的方式。以下是在这两种开发环境中安装 Python 库的详细步骤:

在 Jupyter Notebook 中安装库:

  1. 打开 Jupyter Notebook

    • 通常通过在终端中输入命令 jupyter notebook 来启动 Jupyter Notebook。
  2. 创建或打开一个笔记本

    • 在 Jupyter 的主界面,可以选择“New”(新建)然后选择“Python X”(X代表版本号)来创建一个新的笔记本。
  3. 安装库

    • 在笔记本的一个新单元中输入安装命令,例如:
      !pip install numpy
      
    • 执行单元格(按 Shift + Enter),这条命令将会在你的 Python 环境中安装 NumPy 库。

在 Visual Studio Code(VSCode)中安装库:

  1. 打开或创建一个 Python 文件

    • 在 VSCode 中打开你正在工作的项目或者新建一个 Python 文件。
  2. 打开终端

    • 在 VSCode 中,你可以通过点击顶部菜单的 “View”(视图) > “Terminal”(终端)来打开一个新的终端。或者使用快捷键 Ctrl+` (反引号)打开或切换终端。
  3. 执行安装命令

    • 在打开的终端中,输入如下的命令来安装所需的库,例如:
      pip install numpy
      
    • 按 Enter 执行,该命令将会为你的 Python 环境安装库。

在两种情况下,你都可以通过类似的方式安装任何需要的库。只需将 numpy 替换为你需要安装的库的名称即可。确保你已经配置好了 Python 和 pip。 在 VSCode 或 Jupyter Notebook 中,你可以通过这种方式方便地管理 Python 包,以满足开发需求。这使得使用这些工具进行科学计算和开发成为一件高效且愉快的事情。

2. 代码的运行

在这里我仅仅展示如何修改代码保证模型的正确运行,下面是代码的文件划分:

请添加图片描述

文件名称还是很直接的,模型使用的数据和上一节中GCN使用的一致,在这里不讨论。output输出文件仅仅是用来存放可视化结果的这里要执行代码仅仅需要修改utils.py文件。

请添加图片描述

细心的同学一定会发现这个内容和GCN中的代码一样,的确这个代码被作者重复用了。造轮子大家用,确实很很爽的一件事。

在这里插入图片描述

这个地址修改成你自己存储数据的目录地址即可。如果你不知道地址在哪里???怎么办???

在这里插入图片描述

都是些很基础的操作,同样在jupyter中打开数据的位置右键也会有复制地址的选项我在这里就不过的赘述了。然后点击train.py文件执行 文件即可。如果是说咱们的有些同学使用的是jupyter那么你还要将代码复制到一个ipynb文件中再执行文件。

请添加图片描述

2.1 报错处理

如果jupyter环境下运行的同学出现报错,那么就多半是这里出现了问题:
在这里插入图片描述
需要对代码修改如下:
在这里插入图片描述
代码我放在这里便于大家直接复制:

args = parser.parse_args(args=[]) 

2.2 运行结果展示

其输出结果与GCN相似,但值得注意的是,每次运行的epoch数量都有所不同。这是因为模型采用了早停机制,在训练过程中一旦满足特定条件即提前终止,以防止过拟合。在下一节的代码详解中,我将详细讲解早停机制的使用方法和它的工作原理。
请添加图片描述

这些数据展示了在训练图注意力网络(GAT)时的各个epoch(训练周期)的性能指标。下面是对这些数据的简单解释:

  • Epoch: 这表示当前的训练周期编号,从0001开始,每个周期均包括向前和向后传播过程。
  • loss_train: 这是训练集上的损失值,反映了模型在训练数据上的表现。损失值越低,表示模型在这组数据上的拟合越好。
  • acc_train: 这是训练集上的准确率,以百分比表示,显示了模型正确分类训练数据的能力。
  • loss_val: 这是验证集上的损失值,用于评估模型在未见过的数据上的泛化能力。在实际应用中,我们希望验证损失与训练损失相近,这表明模型没有过拟合。
  • acc_val: 这是验证集上的准确率,反映了模型在验证数据上的分类准确性。较高的验证准确率表明模型具有较好的泛化性能。
  • time: 这是完成该周期训练所需的时间,以秒为单位。这个时间包括了数据处理、模型计算和反向传播等所有步骤的时间。

从这些数据中可以观察到,随着训练周期的增加,训练和验证的损失通常会逐渐减小,而准确率则逐渐提高。这是模型学习过程的典型表现,表示模型在逐渐适应和理解训练数据。然而,重要的是要监控训练和验证损失之间的差异,以及相应的准确率,以便及时调整训练参数或提前停止训练,防止过拟合。

下面的最终运行结果是我在CPU中实验得到的给各位一个运行的参考:
请添加图片描述

至于这个准确率为和如何之高,[可以参考我这个博文的理解。]。(https://blog.csdn.net/weixin_47332746/article/details/143515332)

3.总结

现阶段,我们已经全面介绍了图注意力网络(GAT)的理论基础及模型的运行方式。在接下来的篇章中,我们将深入探讨该模型及相关论文中的核心架构和代码实现。
这一部分将为对这一主题感兴趣的读者提供一个详细的技术视角,帮助您从基本理论开始,逐步了解模型是如何通过精确的数学建模和编程实现来完成预期的机器学习任务。深入解析模型的主体架构对于理解其工作原理至关重要,对于那些希望在此基础上进行改进或希望自定义该模型以适应特定应用的研究者和开发者而言,尤其具有价值。

如果您对这些内容感兴趣,请不要忘记点赞、收藏并关注。这是对我的工作最大的支持和鼓励。非常感谢您!如果有任何疑问,欢迎随时与我联系。我期待与您的互动!
在这里插入图片描述

相关文章:

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…...

Transformer中的Self-Attention机制如何自然地适应于目标检测任务

Transformer中的Self-Attention机制如何自然地适应于目标检测任务: 特征图的降维与重塑 首先,Backbone(如ResNet、VGG等)会输出一个特征图,这个特征图通常具有较高的通道数、高度和宽度(例如CHW&#xff…...

2411rust,1.75.0

原文 Rust团队很高兴地声明推出Rust的新版本1.75.0. 如果你rustup安装了以前版本的Rust,你可如下取1.75.0: $ rustup update stable1.75.0稳定版中的功能 async fn和特征中的返回位置impl Trait. 指针字节偏移API 原始指针(*const T和*mutT)过去主要支持,T为单位的操作.如…...

远程办公新宠:分享8款知识共享软件

远程办公模式下,知识共享软件成为了团队协作和沟通的重要工具。以下是8款备受推崇的知识共享软件: 1、HelpLook AI知识库 简介:HelpLook是一款快速搭建AI知识库的系统,具备强大功能,如快速精准的知识检索、灵活定制的…...

3.9MayBeSomeAssembly

就是先从数组里,乘4得到正确地址 32(&s3),s3是基址,32是偏移量,就是先从数组里取出数到临时寄存器,然后再在临时寄存器上加上变量,最后再把临时寄存器上的变量存到数组里,偏移量&#xff0…...

i春秋-签到题

练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…...

TypeScript 中扩展现有模块的用法

declare module 是 TypeScript 中用于扩展现有模块的特性。它允许开发者在已有模块的基础上,添加新的功能(比如扩展接口、添加类型声明等)。通过 declare module,可以将额外的声明合并到原模块中。以下是用法详解: 用…...

【报错记录】解决Termux中pulseaudio启动报错,报:E: [pulseaudio] main.c: Daemon startup failed.

前言 在尝试使用Termux-X11启动Minecraft过程中,不知道怎么回事原本好好的pulseaudio居然无法启动了,一直在报: E: [pulseaudio] main.c: Daemon startup failed. 重装了好几次也没用解决方案如下。 排除重复启动 如果pulseaudio之前已经…...

Java list

在 Java 中,链表(LinkedList)是一个非常重要的数据结构,它可以动态地插入和删除元素,因此比数组更灵活。Java 提供了 LinkedList 类,该类实现了 List 接口,并且是基于双向链表实现的&#xff0c…...

MAC借助终端上传jar包到云服务器

前提:保证工程本地已打包完成:图中路径即为项目的target目录下已准备好的jar包 第一步:打开终端(先不要连接自己的服务器),输入下面的上传命令: scp /path/to/local/app.jar username192.168.1…...

对原jar包解压后修改原class文件后重新打包为jar

文章目录 背景三种修改方式1.POM中移除原jar中依赖的历史版本2.原jar它不使用pom依赖而是直接放在源码中再编译使用JarEditor 插件对源码进行修改(推荐)使用java-decompiler反编译后修改源码覆盖原class(不好用-不推荐直接跳过)提醒 参考资料-推荐阅读拓…...

YY币支付系统改源码(改良版本)

Nginx :1.20.1(版本都可以) MySQL:5.6.50(兼容该版本其他不知道) 简单优化服务器(可不安装,看要求) PHP安装扩展名称:fileinfo | opcache | imagemagick …...

【Swift】类型标注、类型安全和类型推断

文章目录 类型标注类型安全和类型推断什么是类型安全和类型推断为什么说Swift是一门安全语言类型安全带来的好处 类型标注 当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类…...

06 —— Webpack优化—压缩过程

css代码提取后想要压缩 —— 使用css-minimizer-webpack-plugin插件 下载 css-minimizer-webpack-plugin 本地软件包 npm install css-minimizer-webpack-plugin --save-dev 配置 webpack.config.js 让webpack拥有该功能 const CssMinimizerPlugin require(css-minimizer-…...

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px,一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准,750rpx恰好为屏幕宽度。屏幕变宽,rpx 实际显示效果会等比放大…...

单条推理转批量推理prompt

为了将单条推理程序改为批量推理程序,并实现您的要求,我们需要进行以下步骤: 输入的图片和视频都是随机从视频文件夹、图片文件夹挑选,组成输入对: 需要编写一个函数来读取指定文件夹中的所有图片和视频文件。 使用随…...

网络安全审计概述与分类

目录 网络安全审计概述等保五个级别对审计要求网络安全审计系统组成网络安全审计系统类型 网络安全审计概述 4A分别是认证、授权、账号、审计 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储分析和利用的工作。 网络安全审计的作用在于建立“事后”…...

【已解决】“EndNote could not connect to the online sync service”问题的解决

本人不止一次在使用EndNote软件时遇到过“EndNote could not connect to the online sync service”这个问题。 过去遇到这个问题都是用这个方法来解决: 这个方法虽然能解决,但工程量太大,每次做完得歇半天身体才能缓过来。 后来再遇到该问…...

数据脱敏工具:基于 FFmpeg 的视频批量裁剪

在数据处理和隐私保护领域,数据脱敏是一项重要的任务,尤其是在处理包含敏感信息的视频数据时。本文介绍了一种使用 Python 和 FFmpeg 实现的视频批量裁剪工具,该工具可以将视频中的敏感区域裁剪掉,从而实现数据脱敏。通过使用 PyI…...

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC

Debezium日常分享系列之:Debezium3版本Debezium connector for JDBC 概述JDBC连接器的工作原理消费复杂的Debezium变更事件至少一次的传递多个任务数据和列类型映射主键处理删除模式幂等写入模式演化引用和大小写敏感性连接空闲超时数据类型映射部署Debezium JDBC连…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【HTTP三个基础问题】

面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...