GNN学习/GCN学习/GNN环境配置cuda安装/GCN代码展示

news2024/11/17 13:50:07

参考:

  • A Gentle Introduction to Graph Neural Networks https://distill.pub/2021/gnn-intro/
  • Understanding Convolutions on Graphs https://distill.pub/2021/understanding-gnns/
  • Graph neural networks: A review of methods and applications https://arxiv.org/pdf/1812.08434.pdf(没怎么看)
  • 【零基础多图详解图神经网络(GNN/GCN)【论文精读】-哔哩哔哩】 https://b23.tv/1zxRCPD
  • 【论文精讲】利用图神经网络进行阿尔兹海默症分类,基于神经影像模式融合,20小时带你快速学懂GNN原理模型及应用,超详细!!!-哔哩哔哩】 https://b23.tv/9bjwS2a
  • 【简单粗暴带你快速理解GNN-哔哩哔哩】 https://b23.tv/drBKOzW
  • 【【PyTorch】B站首个,终于有人把 GPU/ CUDA/ cuDNN 讲清楚了-哔哩哔哩】 https://b23.tv/ctxG5HQ

x.1 前言

相比较CNN假设的平移不变性是二维的,RNN假设的时序不变性是一维的,GNN假设的图的对称性是多维的。

1. CNN的平移不变性

CNN(卷积神经网络)的平移不变性指的是,当输入图像在平移时,CNN仍能识别出相同的特征和模式。

在卷积层中,卷积核通过滑动窗口的方式在输入图像上移动,对每个窗口进行卷积操作。由于卷积核的权重是固定的,因此当输入图像平移时,卷积核所卷积的图像区域也会相应地平移,从而保证了卷积操作的平移不变性。

通过具有平移不变性的卷积操作,CNN能够学习到对于输入图像中不同位置的相同特征的表示,从而使得其在识别目标时具有一定的位置不变性。这种位置不变性使得CNN在图像识别、目标检测等任务中表现出色。

2. RNN的时序不变性

RNN(循环神经网络)的时序不变性指的是,RNN能够对时序信息进行建模,并且其处理过程对输入序列的时间顺序不敏感,即具有不变性。

在RNN中,隐藏状态会保存之前输入的信息,并将其用于当前时间步的计算。因此,RNN在处理输入序列时会考虑到其时序关系,可以学习到输入序列中时间相关的模式和规律。然而,RNN的处理过程并不受输入序列的时间顺序影响,即输入序列的顺序可以任意调整,RNN仍将输出相同的结果。这种时序不变性使得RNN可以对具有不同时间顺序的输入序列进行建模,并且能够在不考虑时间顺序的情况下对其进行处理。

时序不变性使得RNN在处理自然语言处理、语音识别等需要考虑时序信息的任务时非常有用。例如,对于文本分类任务,可以将文本的句子顺序任意调整,而不影响RNN的分类结果。这种特性也为RNN在生成式任务中的应用提供了便利,如机器翻译、音乐生成等任务。

3. GNN的图的对称性

GNN(图神经网络)的图的对称性指的是,在一个无向图中,如果存在一种对称变换,可以将图中的任意两个节点进行交换而不改变图的结构,则该图具有对称性。

通过上面的3种神经网络假设性质的对比,发现图的应用范围更多维,例如社交网络,推荐算法等等。

x.2 对GNN的大致解释

而如何简单粗暴理解GNN(Graph Neural Networks)呢,你可以想象GNN为一个MLP,它可以大致分为三个主要部分:输入层,隐藏层和输出层。其中隐藏层通常由多个GCN(Graph Convolutional Network)组成。而GCN则主要由聚合(Aggregation),更新(Update)和多层(Multi-layer)。

在GCN中,聚合、更新和循环分别指以下几个步骤:

  1. 聚合(Aggregation):将邻居节点的信息进行聚合并加权得到当前节点的表征向量。

  2. 更新(Update):将当前节点的表征向量与其它特征(例如节点属性)结合起来,更新当前节点的表征向量。

  3. 多层(Multi-layer):为了捕获不同层次的节点特征,通常需要将上述两个步骤叠加多次。这些步骤的重复层数可以根据问题的复杂程度和计算资源的可用性来确定。

在每一层GCN中,聚合操作和更新操作都是可学习的。因此,每个GCN层可以学习到不同的邻居聚合策略和节点更新规则,从而提高整个网络的表征能力。

为了方便理解,我们将Aggregation,Update和Multi-layer再以图片的形式理解一遍:

  1. Aggregation

在这里插入图片描述

如上图所示,例如对于节点A,它所连的节点有B,C,D,我们需要将A的相邻节点乘以对应的权重值,得到A的聚合信息即N。

  1. Update

在这里插入图片描述

如上图所示我们将A和上一步得到的聚合信息N做一些数学处理,得到了A的更新信息。

  1. Multi-layer

在这里插入图片描述

如上图所示,每一次循环后都会得到上一层的更多节点的信息,最终几乎能得到其余节点的全部信息。

请添加图片描述

GNN就是对邻近节点的特征信息进行融合,在了解了大致框架后,对后续GNN的理解会简单的多。

x.3 GNN的前储知识::图知识

和数据结构中的图的知识如出一辙,邻接矩阵是比较重要的,邻接表的链式表达和GNN中的邻接表没有太多关系。待补充

x.4 GNN的前储知识::数学知识

主要使用了Fourier transformation(傅里叶变换)和laplacian(拉普拉斯算子),这和数字图像处理的知识差不离。待补充。

x.5 GCN介绍

x.5.1 GCN的一些基本术语

请添加图片描述

A是左边这个图的邻接矩阵, I N I_N IN是单位矩阵, A ~ = A + I N \tilde{A} = A+I_N A~=A+IN即是增加了自身到自身连线的邻接矩阵, D ~ \tilde{D} D~则是将每一行的度相加到对角线上, D ~ − 1 2 \tilde{D}^{-\frac{1}{2}} D~21是将对角线元素求倒数后再开方得到的矩阵;

H ( l ) H^{(l)} H(l)是指输入的本层的所有的点(每一行是一个点的特征向量)的特征矩阵, H ( l + 1 ) H^{(l+1)} H(l+1)是指输出的点的特征矩阵, W ( l ) W^{(l)} W(l)是指可学习的参数。

在公式2的计算公式如下:

请添加图片描述

x.5.2 GCN计算实例

以下图二为例,点1,2,3组成了特征矩阵,对于公式解释如下:

  • A H AH AH表示H聚合它周围节点的特征
  • A ~ H \tilde{A}H A~H表示H聚合它周围节点的特征,再加节点本身的信息
  • D A D DAD DAD指做归一化

请添加图片描述

x.5.3 GCN多层

请添加图片描述

GCN的使用类似MLP,input layer做输入,多层hidden layer,output layer做输出,输入输出中图的结构不改变,但是节点的特征向量被改变了。最终NxC维度的特征向量变成了NxF维度的特征向量。

x.6 GNN环境配置cuda安装

待补充。

GNN环境配置,conda文件安装,pip安装,使用.whl文件安装

安装带有cuda的pytorch pip install torch==1.11.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113

x.7 GCN代码展示

这里采用的是pygcn的代码https://github.com/tkipf/pygcn

在这里插入图片描述

在这个代码的数据集中cora.cites保存的是边的连接信息;cora.content保存的是点和邻接矩阵的信息,其中第一列是点的序号,最后一列是label标签,从[1:-1]是邻接矩阵,我们通过下式计算最终点的输出。

请添加图片描述

最终我们通过网络输入[2708, 1433]的信息,输出[2708, 7]的信息,其中2708为样本数量batch_size,7为最终的类别数。

请添加图片描述

x.7.1 torch.nn.parameter是什么函数,如何使用,例子

torch.nn.Parameter是一个类,用于将张量标记为模型的参数。在训练期间,这些参数可以被优化器调整以最小化损失函数。下面是一个例子,说明如何使用torch.nn.Parameter来创建一个简单的线性模型:

import torch
import torch.nn as nn

class LinearModel(nn.Module):
    def __init__(self, input_size, output_size):
        super(LinearModel, self).__init__()
        self.weight = nn.Parameter(torch.randn(output_size, input_size))
        self.bias = nn.Parameter(torch.randn(output_size))

    def forward(self, input):
        return torch.matmul(input, self.weight.t()) + self.bias

在这个例子中,LinearModel是一个简单的线性模型,它有一个权重矩阵和一个偏置向量。在__init__方法中,我们使用nn.Parameter来将这些张量标记为模型的参数。在模型的前向传递过程中,我们使用这些参数来计算模型的输出。

下面是一个使用LinearModel的例子:

input_size = 5
output_size = 2
batch_size = 10

model = LinearModel(input_size, output_size)
input = torch.randn(batch_size, input_size)
output = model(input)

print(output.shape)

在这个例子中,我们创建了一个LinearModel对象,并将它应用于一批大小为batch_size的输入张量。我们打印输出张量的形状,以确认输出张量的形状为(batch_size, output_size)。

x.7.2 torch.spmm是什么意思,例子

torch.spmm是PyTorch中用于执行稀疏矩阵乘法的函数。它接受三个参数:稀疏矩阵、密集矩阵和一个可选的beta参数,用于控制输出与之前的累加权重。它返回一个密集矩阵,其形状为稀疏矩阵的行数和密集矩阵的列数。

以下是一个使用torch.spmm函数的简单示例:

import torch

# 创建稀疏矩阵
sparse_mat = torch.sparse_coo_tensor(
    indices=[[0, 1, 1], [2, 0, 1]],
    values=[3, 4, 5],
    size=(2, 3)
)

# 创建密集矩阵
dense_mat = torch.tensor([[1, 2], [3, 4], [5, 6]])

# 使用torch.spmm函数执行稀疏矩阵乘法
result = torch.spmm(sparse_mat, dense_mat)

print(result)

在这个示例中,我们首先创建了一个形状为(2, 3)的稀疏矩阵sparse_mat,然后创建了一个形状为(3, 2)的密集矩阵dense_mat。我们将这两个矩阵传递给torch.spmm函数,以获得一个形状为(2, 2)的密集矩阵result。这个结果矩阵是由稀疏矩阵sparse_mat和密集矩阵dense_mat相乘得到的。

x.7.3 如何打印稀疏矩阵sparse_mat

import torch

# 创建稀疏矩阵
sparse_mat = torch.sparse_coo_tensor(
    indices=[[0, 1, 1], [2, 0, 1]],
    values=[3, 4, 5],
    size=(2, 3)
)

# 将稀疏矩阵转换为密集矩阵并打印结果
print(sparse_mat.to_dense())

运行这个代码会输出以下结果:

tensor([[0, 0, 3],
        [4, 5, 0]])

在这个结果中,稀疏矩阵中的非零元素被放置在正确的位置上,其余位置都填充为零。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/497013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】认识异常

目录 1.异常概念和分类 2.异常的抛出 3.异常的捕获 3.1异常声明throws 3.2异常捕获try-catch 3.3finally 3.4.异常的处理流程 4.自定义异常类 1.异常概念和分类 public class Test {public static void test() {test();}public static void main(String[] args) {Sy…

详解数据集safety-pilot-model-deployment-data

safety-pilot-model-deployment-data这个数据集是由美国交通部的联邦航空管理局(FAA)和交通运输部(DOT)主导的“安全试点”(Safety Pilot Model Deployment)项目所提供的。该项目旨在研究汽车与飞机之间的通…

Vue电商项目--开发Search模块与mockjs模拟数据

Search模块中商品分类与过度动画 现在完成了在/home路由下实现三级导航组件的显示隐藏 通过this.$route.path!/home在搜索页面显示,通过方法鼠标移入移出从而又控制在search路由下的显示隐藏 过渡动画:前提组件|元素必要又v-if| v-show指令才可以进行…

Linux进程状态及优先级

本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 进程状态及优先级 前言正文进程状态就绪运行状态R阻塞睡眠状态 S休眠状态D挂起 暂停状态T前台与后台进程待追踪暂停状态t 死亡状态 X僵尸状态 Z 孤儿进程进程优先级查…

nginx(七十三)nginx与Location响应头细节探讨

一 nginx与Location响应头细节探讨 ① 重定向和Location回顾 多种重定向跳转方式的差异 nginx之absolute_redirect、server_name_in_redirect、port_in_redirect 共同控制Location响应头 ② STS响应头导致307重定向 "第一次访问 http://www.baidu.com" 观察…

基于Qt、C++的毕业设计课设数学绘图工具(平面图、图表、立体图绘制-附下载链接)

基于Qt、C的毕业设计课设数学绘图工具(平面图、图表、立体图绘制) 介绍 这是我的毕业设计,基于Qt Creator 4.11.1,c语言。 效果图如下 点我下载项目源码(含打包软件) 使用说明 1. 二维函数绘制 开始界面…

python 系列 07 - 基于easyocr的ocr识别

OCR,光学文字识别,对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。本示例通过easyocr库来演示。easyocr是一个比较流行的库,支持超过80种语言。安装的时候注意会附带安装torch库(一个深度学…

将ROS1和ROS2安装到同一个ubuntu系统中,ROS2安装??????????????

1. 本文测试环境: ubuntu:20.04,虚拟机 ROS1:noetic ROS2:foxy 2. 先说结论 ROS1 与 ROS2 共存,需要考虑三个问题: 1) 不同Ubuntu版本,有不同版本的ROS1和ROS2推荐,尽量不要任性地乱装; 2)ROS1和ROS2安装过程中,是否会出现文件“删改”的问题?目前使用下来,并…

拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

前置知识 有向无环图 在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 如图所示。 入度 对于一个有向图,若x点指向y点,则称x点为y点的入度。 出度…

Redis --- 多级缓存

一、什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&#xff…

python每日一练:硬币划分(多方法详解)

文章目录 前言0、题目一、暴力总是不能解决问题的二、还能更暴力一点三、减少暴力思想四、引入先进思想总结 前言 这题挺有意思的,典型的背包组合问题,虽然没有要求各种组合方式,不过我们可以试试给出组合方式。当然这题不太可能用一行代码解…

STM32 从入门到精通系列讲解 - 总目录

👦 作者介绍:Bazinga bingo,专注C语言应用硬核干货分享,潜心修炼,虚心学习,立志做嵌入式相关赛道的Top。 📕 本文收录于《STM32开发》专栏,包含STM32内部模块介绍、片内资源开发、不…

如何使用bingChat(使用方法+遇到的问题+感受)

文章目录 前言一、如何使用Bing Chat1. 下载new Bing2.重新注册一个microsoft(此步骤可略过,如有问题再操作此步骤)3. 使用 Bing Chat 二、常见问题1.Chat mode is only available when you have access to the new Bing.2. 网页上没有“聊天…

leetcode 104——二叉树的最大深度

文章目录 题目详情方法一 万能的递归方法二 通过使用层序遍历的方式Java完整代码递归实现非递归实现——借助队列 题目详情 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 l…

yolov5图像识别voc转yolo代码解析

https://github.com/ultralytics/JSON2YOLO https://blog.csdn.net/qq_51831335/article/details/127237772 目标检测数据集标签转换COCO2VOC、YOLO2VOC、JSON2YOLO <annotation><folder>VOC2007</folder><filename>000001.jpg</filename><s…

x265码控分析

D和R的关系 高分辨率量化 均匀量化&#xff1a;量化区间 ‘ Δ k y k − y k − 1 ‘ \Delta_ky_k-y_{k-1} ‘Δk​yk​−yk−1​‘&#xff0c;近似为常数&#xff1b;p(x)为信源概率密度函数&#xff0c;且 ‘ Δ k ‘ \Delta_k ‘Δk​‘的大小相对于p(x)的变化率充分小&…

【模拟IC学习笔记】 反馈

反馈的作用&#xff1a;增益灵敏度降低 采用开环的方式实现一个精确的增益比较困难&#xff0c;但是可以实现高增益。 增益灵敏度衍生出来的另外两个特点 1、增加系统带宽。 2、改变输出阻抗&#xff0c;提高驱动能力。 反馈的作用&#xff1a;增加带宽 带宽的增加来源于…

对传递函数的零极点、频率响应、稳定性的理解

对传递函数的零极点、频率响应、稳定性的理解 零极点 从传递函数求零极点 令传递函数分子为0求出零点&#xff0c;令分母为0求出零点。 频率响应 单极点系统的频率响应 A v A v d c ∗ ( 1 / ( 1 s R C ) ) AvAv_dc*(1/(1sRC)) AvAvd​c∗(1/(1sRC))&#xff0c;系统的极…

python通过SSH管道访问ClickHouse

目录 前言什么是跳板机什么是SSH协议SSH管道访问ClickHouse参考文献 前言 因为新业务需要&#xff0c;数据都存储在阿里云服务器的ClickHouse数据库里&#xff0c;最近想取点数探索一下&#xff0c;于是下载了客户端工具DBeaver并成功连接ClickHouse&#xff0c;然后想通过pyt…

【前端面试题】这些js功能你一定要学会

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 1.图片失败&#xff0c;重新加载 如果图片资源不存在&#xff0c;那可以设置图片失败的占位…