目录

一.基础1-[图论、图算法、CNN]

二.基础2-[图卷积神经网络GCN]

三.torch-geometric.nn工具包安装(包含各种算法和数据集)

四.GCN任务[节点分类-Cora 数据集]

五.图注意力网络(GAT)

六.图自编码器(GAE)

七.图循环神经网络 (GRNN)

八.门控图神经网络(GGNN)

九. 应用场景


        图神经网络(GNN)的概念由 Franco Scarselli Bruna 等人于 2009 年首次提出。在他们名为“图神经网络模型”的论文中,提出了现有神经网络的扩展,用于处理以图结构表示的数据,这些数据往往是非欧几里得结构数据,即节点间连接关系是任意的,无法用固定网格表示(如社交网络中的朋友关系)。

        李沐老师有一篇【2021GNN】论文解读:  A Gentle Introduction to Graph Neural Networks

        本文参考的B站课程链接:【图神经网络GNN/GCN教程】

        GNN中输入也是特征,输出也是特征,邻接矩阵不变。多层GNN,可以使感受野越来越大,直至获取全局特征。

        GNN 模型可以处理非循环图、循环图、有向图和无向图。应用主要有:

  • [节点分类]:通过考虑邻居的标签来预测节点的标签。
  • [链接预测]:预测图中各个实体之间的关系。 例如,社交网络的预测连接。
  • [图聚类]:将图的节点划分为簇。 基于边权重或边距离或通过将图视为对象并将相似对象分组在一起来完成划分。
  • [图分类]:将图分类为类别。 这可以应用于社交网络分析和自然语言处理中的文档分类。 NLP 中的其他应用包括文本分类、提取文本之间的语义关系和序列标记。
  • [计算机视觉]:在计算机视觉领域,GNN 可用于生成目标检测的感兴趣区域。 它们还可以用于图像分类,从而生成场景图。 然后场景生成模型识别图像中的对象以及它们之间的语义关系。 该领域的其他应用包括交互检测和区域分类。

        GNN 的核心思想是通过迭代地聚合每个节点邻居的信息来更新节点的表示。这种聚合操作可以概括为以下步骤:

  • 消息传递(Message Passing):每个节点从其邻居接收信息。
  • 特征更新:使用某种函数(通常是神经网络)来更新节点特征。
  • 迭代更新:多次迭代上述步骤,直到节点特征达到稳定状态。

        节点特征更新公式:

        研究方向可能包括:

  • 提高图神经网络的计算效率,以便处理更大规模的图数据。
  • 提高图神经网络的泛化能力,以便在更多的应用场景中取得更好的性能。
  • 研究如何处理非静态图数据,以便更好地处理实际应用中的图数据。

一.基础1-[图论、图算法、CNN]

        基本概念:(1)Level Graph;(2)S-T cut;(3)Bipartite Graph;(4)Hungarian Algorithm;(5)Shapley Algorithm;(6)蒙特卡洛算法(Monte carlo Algorithm),随机梯度下降采用的是该算法。主要是依据大数定律验证正确性。 课程可学习:Monte Carlo Algorithms_哔哩哔哩_bilibili

  • 邻接矩阵(Adjacency Matrix):一个用于表示图中节点之间关系的矩阵。
  • 特征矩阵(Feature Matrix):一个用于表示节点特征的矩阵。
  • 卷积核矩阵(Kernel Matrix):一个用于表示卷积操作的矩阵。

二.基础2-[图卷积神经网络GCN]

         只要知道每一个节点和每个节点间的关系,就可以往图上套用。但是计算机视觉(CV)和自然语言处理(NLP)不常用,因为图像和文本数据的格式是固定的。比如,将图像resize成固定大小,进行卷积操作即可得到特征。

        传统NN中,一定要求格式是固定的。GNN用于输入是不同长度的情形。GNN目的就是重构(更新)特征。采用的方法叫嵌入(embedding),在自然语言处理(NLP)中词嵌入中也用到了。

        GCN思路是:针对一个节点计算特征后,平均其邻居特征和自身特征后传入NN。涉及到邻接矩阵、度矩阵、特征矩阵。        

        [归一化处理]​​:对聚合结果进行归一化,避免节点度数不同带来的偏差。                

        具体来说,(省略了矩阵头上的~)

        1.把对角均为1的对角矩阵(自己的特征)加入邻接矩阵\mathbf{A},x特征矩阵\mathbf{X}\mathbf{AX}

        2.度矩阵\mathbf{D},和倒数\mathbf{D}^{-1},为了求它的平均\mathbf{D}^{-1}(\mathbf{AX})=(\mathbf{D}^{-1}\mathbf{A})\mathbf{X}

          (相当于 行归一化)。同理对列做归一化,(\mathbf{D}^{-1}\mathbf{A})\mathbf{X}\mathbf{D}^{-1}=\mathbf{D}^{-1}\mathbf{A}\mathbf{D}^{-1}\mathbf{X}

        3.\mathbf{D}^{-1}\mathbf{A}\mathbf{D}^{-1}\mathbf{X}--->\mathbf{D}^{-\frac{1}{2}}\mathbf{A}\mathbf{D}^{-\frac{1}{2}}\mathbf{X}

                 为什么度要1--->1/2,有些点度很大,有些点度很小。而度很小的点,计算不一定准确。

       GCN通过 \frac{1}{\sqrt{deg(v_i)} \sqrt{deg(v_j)}}将权重重新更新。

       GCN 的单层传播规则如下:

        其中可以看成是归一化后的邻接矩阵,相当于给l层所有节点的embedding做了一次线性变换,左乘邻接矩阵表示对于每个节点来说,该节点的特征变为邻居节点特征相加后的结果。 

        两个GCN层输出embedding计算为:

 

​        

        [卷积层数]:根据六度分离原理,卷积层数不会很大。 

        GCN 主要有两种类型:

  • 空间卷积网络: 相邻节点的特征被组合成中心节点, 特征的求和类似于普通的卷积运算。
  • 谱卷积网络:在谱网络中,卷积运算是通过计算在傅里叶域中定义的拉普拉斯特征分解完成。

三.torch-geometric.nn工具包安装(包含各种算法和数据集)

        依赖的下载地址: https://pytorch-geometric.com/whl/ ,选对应版本复制链接或下载本地,安装即可。

        cp是指python的版本,cp39-mac。

         官方介绍: 如数据集:torch_geometric.datasets — pytorch_geometric documentation

pip install torch-cluster https://data.pyg.org/whl/torch-2.7.0%2Bcpu/torch_cluster-1.6.3-cp39-cp39-macosx_10_9_universal2.whlpip install torch-scatter https://data.pyg.org/whl/torch-2.7.0%2Bcpu/torch_scatter-2.1.2-cp39-cp39-macosx_10_9_universal2.whlpip install torch-sparse https://data.pyg.org/whl/torch-2.7.0%2Bcpu/torch_sparse-0.6.18-cp39-cp39-macosx_11_0_universal2.whl#torch-spline-conv下载后本地安装
pip install torch-spline-conv torch_spline_conv-1.2.2-cp39-cp39-macosx_10_9_universal2.whlpip install torch-geometric

四.GCN任务[节点分类-Cora 数据集]

          [GCN的论文出处]:Kipf T, Welling M. Semi-supervised classification with graph convolutional networks[C]. The fifth International Conference on Learning Representations, Toulon, France, 2017.

        有一篇博主的解读备阅:GNN教程:图神经网络“开山之作”!    

        图卷积操作的基本思想是将图数据映射到特定的特征空间,以便更好地捕捉图数据中的模式和关系。具体来说,图卷积操作可以看作是一种线性操作,它可以将图数据表示为一种特定的矩阵形式,然后通过矩阵乘法和线性变换来实现映射。   

        图神经网络的具体操作步骤如下;

        (原博主链接:https://juejin.cn/post/7325131333964120101)

  1. (1)将图数据转换为矩阵形式,以便进行图卷积操作。具体来说,将邻接矩阵、特征矩阵和卷积核矩阵构成一个矩阵形式的图数据。

  2. (2)对图数据进行卷积操作,以便将节点特征映射到特定的特征空间。具体来说,使用卷积核矩阵对图数据进行线性变换,以实现节点特征的映射。

  3. (3)对映射后的节点特征进行激活函数处理,以引入非线性性。具体来说,我们可以使用常见的激活函数,如ReLU、Sigmoid等,对映射后的节点特征进行处理。

        举个例子:使用 PyTorch Geometric 加载 Cora 数据集,并实现了一个简单的两层 GCN 模型。第一层将节点特征映射到16维空间,第二层将其映射到类别数,并使用 ReLU 激活函数进行非线性变换。

        若加载数据集报错,那可能是Github访问问题,先解决一下:

#找到并打开终端,可用【Command + 空格】聚焦搜索"终端" 回车打开。#修改hosts文件,Mac的hosts文件路径: /etc/hostssudo vi /etc/hosts#编辑hosts文件,在最后加上:20.27.177.113 github.com# 输入:wq命令保存#访问下Github.com 试试
import torch
import torch.nn.functional as F
from torch_geometric.nn import GCNConv
from torch_geometric.datasets import Planetoid
import matplotlib.pyplot as plt
import networkx as nx
from sklearn.manifold import TSNE# 加载Cora数据集
dataset = Planetoid(root='datadownload', name='Cora')data = dataset[0]class GCN(torch.nn.Module):def __init__(self):super(GCN, self).__init__()self.conv1 = GCNConv(dataset.num_node_features, 16)self.conv2 = GCNConv(16, dataset.num_classes)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.conv1(x, edge_index)x = F.relu(x)x = F.dropout(x, p=0.2, training=self.training)  # Dropout操作,减少过拟合风险x = self.conv2(x, edge_index)#x = F.log_softmax(x, dim=1)return x#return # 创建模型并训练
print(f'dataset.num_node_features:{dataset.num_node_features}')
model = GCN()
print(model)
device = torch.device('mps')
model = model.to(device)
data = data.to(device)
loss_function = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)# 训练函数
def train():model.train()optimizer.zero_grad()out = model(data)loss = loss_function(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()return loss.item(),out# 测试函数
def test():model.eval()with torch.no_grad():logits = model(data)accs = []for mask in [data.train_mask, data.val_mask, data.test_mask]:pred = logits[mask].max(1)[1]acc = pred.eq(data.y[mask]).sum().item() / mask.sum().item()accs.append(acc)return accs# 训练过程
train_losses = []
train_accs = []
val_accs = []
test_accs = []for epoch in range(200):loss,out = train()train_acc, val_acc, test_acc = test()train_losses.append(loss)train_accs.append(train_acc)val_accs.append(val_acc)test_accs.append(test_acc)if epoch % 10 == 0:print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}, 'f'Train: {train_acc:.4f}, Val: {val_acc:.4f}, Test: {test_acc:.4f}')# 可视化图结构
def visulize_graph(h, color):z = TSNE(n_components=2).fit_transform(h.detach().cpu().numpy())plt.figure(figsize=(10, 10))plt.xticks([])plt.yticks([])plt.scatter(z[:, 0], z[:, 1], s=70, c=color.cpu().numpy(), cmap='Set2')plt.axis('off')plt.savefig('datadownload/cora-graph.png', dpi=300, bbox_inches='tight')plt.close()visulize_graph(out, data.y)

       节点分类结果: Train Accuracy: 1.0000,Validation Accuracy: 0.7720, Test Accuracy: 0.8030 

五.图注意力网络(GAT)

        [论文出处]:Veličković, P., et al. (2018). Graph Attention Networks. ICLR.

        图注意力网络(Graph Attention Network, GAT)通过引入注意力机制来聚合邻居节点的特征。GAT 使用注意力系数来衡量邻居节点的重要性。

        GAT使用 GATConv 代替了 GCNConv。

from torch_geometric.nn import GATConvclass GAT(torch.nn.Module):def __init__(self):super(GAT, self).__init__()self.gat1 = GATConv(dataset.num_node_features, 8, heads=8, concat=True)self.gat2 = GATConv(8 * 8, dataset.num_classes, heads=1, concat=False)def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.gat1(x, edge_index)x = F.elu(x)x = self.gat2(x, edge_index)return F.log_softmax(x, dim=1)# 创建并训练GAT模型
model = GAT()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)model.train()
for epoch in range(200):optimizer.zero_grad()out = model(data)loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')

        结果:Train Accuracy: 1.0000,Validation Accuracy: 0.7320, Test Accuracy: 0.7730

六.图自编码器(GAE)

        图自编码器(Graph Autoencoder, GAE)是一种用于无监督学习图嵌入的方法。GAE 通过编码器和解码器来学习节点的低维表示。

        使用了 Variational Graph Autoencoder (VGAE) 来进行图的无监督学习。GAE 可以有效地学习图的潜在结构,特别适合于节点嵌入和链接预测任务。

from torch_geometric.nn import GCNConv, VGAEclass Encoder(torch.nn.Module):def __init__(self, in_channels, out_channels):super(Encoder, self).__init__()self.conv1 = GCNConv(in_channels, 2 * out_channels, cached=True)self.conv2 = GCNConv(2 * out_channels, out_channels, cached=True)def forward(self, data):x, edge_index = data.x, data.edge_indexx = F.relu(self.conv1(x, edge_index))return self.conv2(x, edge_index)  # 定义模型和优化器
encoder = Encoder(dataset.num_node_features, 16)
model = VGAE(encoder)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)model.train()
for epoch in range(200):optimizer.zero_grad()z = model.encode(data.x, data.edge_index)loss = model.recon_loss(z, data.edge_index)loss.backward()optimizer.step()print(f'Epoch {epoch}, Loss: {loss.item()}')

        结果:Train Accuracy: 1.0000,Validation Accuracy: 0.7900, Test Accuracy: 0.7990 

七.图循环神经网络 (GRNN)

        图循环神经网络 (GRNN:Graph Recurrent Neural Network) 利用多关系图并使用基于图的正则化器来提高平滑度并减轻过度参数化。 由于邻域的确切大小并不总是已知,因此使用循环 GNN 层使网络更加灵活。 GRNN 可以学习适合数据的最佳扩散模式。 它还能够处理节点涉及多个关系的情况。 该网络的计算成本也很低,因为操作数量根据图边的数量线性缩放。

八.门控图神经网络(GGNN)

        在具有长期依赖性的问题上,门控图神经网络(GGNN:Gated Graph Neural Network)比循环图神经网络表现更好。 长期依赖关系由节点和边缘门编码。 长期时间依赖性由时间门编码。 因此,门控图神经网络通过添加门控机制来改进循环图神经网络。 这些门负责不同状态下的信息记忆和遗忘。

class GCN_GRU(torch.nn.Module):def __init__(self):super(GCN_GRU, self).__init__()self.gru = nn.GRU(input_size=dataset.num_node_features, hidden_size=16)self.gcn = GCN()def forward(self, data):x, edge_index = data.x, data.edge_indexx = self.gru(x)x = self.gcn(data)return x

结果:Train Accuracy: 1.0000,Validation Accuracy: 0.7680, Test Accuracy: 0.7880

九. 应用场景

(1)社交网络分析

在社交网络中,GNN 可以用于节点分类(如用户兴趣预测)、边预测(如好友推荐)以及社区发现等任务。GCN 和 GAT 等模型能够有效地捕获社交网络中的复杂关系。

(2)推荐系统

在推荐系统中,用户和商品可以看作是图中的节点,用户与商品之间的交互(如评分、点击)可以作为图的边。通过 GNN,我们可以构建用户和商品的嵌入,用于预测用户对某商品的兴趣。

(3)生物信息学

在生物信息学中,GNN 被广泛用于蛋白质结构预测、药物发现和基因相互作用网络的分析。通过 GNN,可以有效地学习分子结构的表示,从而加速药物的筛选和发现。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

001 Configuration结构体构造

目录DramSys 代码分析1 Configuration结构体构造1.1 from_path 函数详解1.2 构造过程总结这种设计的好处2 Simulator 例化过程2.1 instantiateInitiatorDramSys 代码分析 1 Configuration结构体构造 好的,我们来详细解释一下 DRAMSysConfiguration.cpp 文件中 fro…

以太坊十年:智能合约与去中心化的崛起

以太坊10周年,敬开发者,敬构建者,敬还在链上的我们 以太坊即将迎来十周年纪念,作为一名在这个生态中深耕了8到9年的见证者,我亲历了它从一纸白皮书的构想到成长为全球领先去中心化平台的全过程。这十年间,以太坊经历了…

kafka 3.9.1版本: kraft + sasl+ standlone 模式完整可行安装步骤

Kafka 3.9.1 Kraft 单机模式安装 安装 OpenJDK 11 CentOS/RHEL yum install -y java-11-openjdk-develUbuntu/Debian apt install -y openjdk-11-jdk下载安装包 wget https://mirrors.aliyun.com/apache/kafka/3.9.1/kafka_2.12-3.9.1.tgz tar -zxvf kafka_2.12-3.9.1.tgz -C /…

Gitee DevOps平台深度评测:本土化优势与功能特性全面解析

Gitee DevOps平台深度评测:本土化优势与功能特性全面解析 在数字化转型浪潮下,企业软件开发流程的自动化与协作效率成为核心竞争力。作为国内领先的代码托管与DevOps平台,Gitee(码云)凭借其本土化服务与全流程支持能力…

从零开始本地化部署Dify:开源大模型应用平台搭建全指南

在AI应用开发的浪潮中,Dify作为一款开源的大语言模型(LLM)应用开发平台,正逐渐成为开发者和企业的首选工具。它巧妙地融合了后端即服务(BaaS)和LLMOps的理念,让开发者能够快速搭建生产级的生成式AI应用。无论是构建智能…

Qt 多媒体开发:音频与视频处理

Qt 多媒体模块提供了一套完整的 API,用于开发音频和视频处理应用。从简单的媒体播放到复杂的音视频编辑,Qt 都提供了相应的工具和组件。本文将从基础到高级全面解析 Qt 多媒体开发。 一、Qt 多媒体模块概述 1. 主要组件 Qt 多媒体模块包含以下核心组件&a…

Mac 专业图像处理 Pixelmator Pro

原文地址:Pixelmator Pro Mac 专业图像处理 Pixelmator Pro,是一款非常强大、美观且易于使用的图像编辑器,专为 Mac 设计。 采用单窗口界面、基于机器学习的智能图像编辑、自动水平检测,智能快速选择及更好的修复工具等功能优点…

iptables和IPVS比较

iptables 和 IPVS (IP Virtual Server) 都是 Linux 系统上用于处理网络流量的强大工具,但它们的设计目标、工作原理和适用场景有显著区别: 核心区别:主要目的: iptables: 核心是一个包过滤防火墙和网络地址转换工具。它…

语音识别指标计算 WER

目录 CER(Character Error Rate) WER Word Error Rate(词错误率) 🧮 WER 计算方式 📌 示例 ✅ 理解要点 CER(Character Error Rate) 语音识别中的 CER(Character …

【前端基础篇】JavaScript之jQuery介绍

文章目录前言JQuery基本介绍和使用方法引入依赖jQuery语法jQuery选择器jQuery事件操作元素获取/设置元素内容获取/设置元素属性获取/返回css属性添加元素删除元素总结:常用的jQuery方法 - 详细解释与示例事件处理拓展 - 详细解释与示例其他拓展内容前言 在阅读过程…

Vue入门:vue项目的创建和基本概念

一、vue的基本简介1. 什么是vue?Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是…

2.oracle保姆级安装教程

一、Oracle数据库安装1.找到软件的位置 D:\学习软件\Oracle,并解压软件2.双击setup.exe3.选择 是4.去掉勾,下一步5.创建和配置数据库,下一步6.桌面类,下一步7.配置安装路径地址和密码8.点完成9.正在安装,稍等片刻10.有…

STM32 软件模拟 I2C 读写 MPU6050--实现加速度与陀螺仪数据采集

演示视频: https://www.bilibili.com/video/BV1iCQRYXEBb/?share_sourcecopy_web&vd_source0e4269581b0bc60d57a80c9a27c98905一、前言在嵌入式开发中,MPU6050 六轴传感器因其集成加速度计和陀螺仪且成本低廉,广泛应用于平衡小车、飞控、…

TFLOPs与TOPS的转换关系详解:如何衡量AI芯片的算力?

在评估AI芯片或计算硬件的性能时,我们经常会遇到TFLOPs和TOPS这两个关键指标。很多开发者对它们的区别和转换关系存在疑惑。本文将深入解析这两个指标的含义、应用场景及转换方法,并提供实际应用中的注意事项。 一、基本概念解析 1.1 TFLOPs(…

C语言:第11天笔记

C语言:第11天笔记 内容提要函数函数的概述函数的分类函数的定义形参和实参函数的返回值函数的调用函数的声明函数 函数的概述 **函数:**实现一定功能的,独立的代码模块,对于函数的使用,一定是先定义,后使 ​…

java导出pdf(使用html)

引入maven <dependencies><!-- Thymeleaf --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf</artifactId><version>3.1.1.RELEASE</version> <!-- 或与 Spring Boot 匹配的版本 --></de…

Qt 远程过程调用(RPC)实现方案

在分布式系统开发中&#xff0c;远程过程调用&#xff08;RPC&#xff09;是实现跨进程、跨机器通信的重要技术。Qt 作为一个强大的跨平台框架&#xff0c;提供了多种 RPC 实现方案&#xff0c;能够满足不同场景下的通信需求。本文将深入探讨 Qt 中 RPC 的各种实现方式&#xf…

攻防世界-引导-Web_php_unserialize

题目内容&#xff1a;出现一段源代码&#xff0c;分段分析第一部分如下<?php class Demo { private $file index.php;public function __construct($file) { $this->file $file; }function __destruct() { echo highlight_file($this->file, true); }function __w…

pytorch学习笔记-自定义卷积

未完结的草稿———&#xff01;大概是准备整合一下常见的层&#xff0c;整合完感觉就可以进行搭建了&#xff08;还没进行到这一步所以不太确定版&#xff09; &#xff08;ps我将在完结这一篇的时候删除上面的小字and二编一下整篇文章的结构&#xff0c;如果看到了这部分文字…

[明道云]-基础教学2-工作表字段 vs 控件:选哪种?

本文深入解析“工作表字段”与“控件”的关系与差别,并从结构、功能、使用场景和选型建议等方面进行对比。 一、基础概念厘清 ✅ 工作表字段 = 数据模型中的列 工作表字段相当于数据库表中的列,是记录每条业务对象(如订单、客户等)属性的数据项,每个字段都有明确的名称和…