图神经网络_GNN从入门到入门

文章目录

  • 0 提出背景
  • 1 网络结构
  • 2 GNN算法
    • 2.1 算法描述
    • 2.2 举个栗子
  • 3 GNN本质
  • 4 应用领域
  • 5 代码案例
    • 5.1 PyG的下载
    • 5.2 常用数据集介绍
    • 5.3 one demo

0 提出背景

经典的深度神经网络适用于 欧几里得数据(Euclidean data),比如我们常常用卷积神经网络来处理图像这种2维矩阵数据,用循环神经网络来处于文本这种1维向量数据。

but 现实世界中常常有许多 非欧几里得数据(non-Euclidean data),如:社交网络、蛋白质网络、推荐系统、食物链等一些 图(Graph) 类型数据。它们没有传统意义上的上下左右前后之分,难以用方方正正的矩阵或向量来表示。

为了解决对非欧几里得数据的学习问题,图神经网络应运而生。

图神经网络(GNN)-5.图神经网络简介 - 知乎

1 网络结构

图神经网络从入门到入门 - 知乎

GNN以图数据作为输入,经过多层图卷积、激活、正则等各种操作,输出下游各种任务的预测结果。

常见的下游任务有:

  • 节点分类: 预测某一节点的类型
  • 边预测: 预测两个节点之间是否存在边、存在什么类型的边
  • 社区预测: 识别密集连接的节点所形成的簇(子图)
  • 网络相似性: 两个子图是否相似
    在这里插入图片描述

2 GNN算法

2.1 算法描述

Main函数:
在这里插入图片描述

FORWARD函数:
在这里插入图片描述
BACKWARD(x,w)
在这里插入图片描述

2.2 举个栗子

举个例子来简单说明上述算法:
在这里插入图片描述

  • 初始化节点特征: 上图中节点特征向量(1,1,1,1,1)、 (2,2,2,2,2) 等,可以是提取到的,也可以是标签。如果没有标签也没有特征,就随机初始化一个特征向量,做为可训练的变量,参与后续的训练。

  • 执行聚合计算: 将邻居的信息结合到自己身上,作为自己特征的补充。

    以A节点为例,邻居信息N = a∗(2,2,2,2,2) + b∗(3,3,3,3,3) + c∗(4,4,4,4,4),其中a,b,c是边的权重,假如b对a很重要,则a的值就可以设置的高一些,假如c对a不是很重要,则c的值就可以设置的低一些。

  • 执行参数更新: A节点的总特征,就是自己的特征 加上α倍的邻居信息N,再乘权重W,再经过一个激活函数σ,最终得到的是经过一层GNN操作之后A的最终信息。

    以A节点为例,A的信息=σ (W((1,1,1,1,1)+α∗N))
    其中,σ为激活函数 (relu,sigmoid等),W是模型需要训练的参数。

  • 重复上述操作: 第一次聚合后,A中有它的邻居B,C,D的信息;B中有A,C的信息;C中有A,B,D,E的信息;D中有A,C的信息;E中有C的信息。第二次聚合以此类推。GNN层数越多,GNN的“感受野”越大,每个点考虑其他点的信息越多,考虑越全面。

    以A节点为例,此时A聚合C的时候,由于C中有上一层聚合得到的E的信息,这时A获得了二阶邻居E的特征。

3 GNN本质

归根到底,GNN就是一个提取特征的方法。

通过重复的聚合更新运算,我们能够得到每个节点的嵌入表达,也就是节点最终的特征向量。

4 应用领域

1. 知识图谱

  • 问答系统
  • 推理
通过COVID-19认识知识图谱 | Knowledge Graph-CSDN博客

2. 推荐系统

  • 个性化推荐
  • 协同过滤

3. 生物学、化学

  • 蛋白质结构预测
  • 化学分子结构预测

4. 交通与物流

  • 交通流量预测
  • 路径规划
  • 物流调度

5 代码案例

5.1 PyG的下载

不建议pip install torch_geometric直接下载,后续可能会出一些问题…

可以先把一些文件下载到本地,再执行pip install +本地地址,链接如下:
pyg-team/pytorch_geometric: Graph Neural Network Library for PyTorch (github.com)

在这里插入图片描述

比如我的torch版本2.3.1 python版本3.9,那我就需要下载以下几个文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对上面每个文件执行以下命令,只举一例说明:
在这里插入图片描述
最后:
在这里插入图片描述
到这里,PyG的安装就ok了。

5.2 常用数据集介绍

torch_geometric.datasets — pytorch_geometric 文档 (pytorch-geometric.readthedocs.io)

在这里插入图片描述
本次demo使用第一个数据集KarateClub

5.3 one demo

%matplotlib inline
import torch
import networkx as nx
import matplotlib.pyplot as plt
from torch_geometric.datasets import KarateClub
from torch_geometric.utils import to_networkx
from torch.nn import Linear
from torch_geometric.nn import GCNConv
import timedef visualize_graph(G,color):plt.figure(figsize=(8,8))plt.xticks([])plt.yticks([])nx.draw_networkx(G, pos=nx.spring_layout(G, seed=42), with_labels=False, node_color=color, cmap="Set2")plt.show()def visualize_embedding(h, color, epoch=None, loss=None):plt.figure(figsize=(8,8))plt.xticks([])plt.yticks([])h = h.detach().cpu().numpy()plt.scatter(h[:,0], h[:,1], s=140, c=color, cmap="Set2")if epoch is not None and loss is not None:plt.xlabel(f'Epoch:{epoch}, Loss:{loss.item():.4f}',fontsize=16)plt.show()dataset = KarateClub()
print(f'Dataset:{dataset}')
print(f'Number of graphs:{len(dataset)}')
print(f'Number of features:{dataset.num_features}')
print(f'Number of classes:{dataset.num_classes}')data = dataset[0] # 获得第一个图
# x=[节点数,节点特征维度];
# edge_index=[2,边数];
# y=[边数,边特征维度];
# train_mask=[节点数],是一个布尔型张量,指示哪些节点参与训练。
print(data) G = to_networkx(data, to_undirected=True)
visualize_graph(G, color=data.y)# 一个简单的图神经网络定义
class GCN(torch.nn.Module):def __init__(self):super().__init__()torch.manual_seed(66)self.conv1 = GCNConv(dataset.num_features, 4) # 图卷积层,用作提取特征self.conv2 = GCNConv(4, 4)self.conv3 = GCNConv(4, 2)self.classifier = Linear(2, dataset.num_classes) # 全连接层,用作分类输出def forward(self, x, edge_index):h = self.conv1(x, edge_index)h = h.tanh()h = self.conv2(h, edge_index)h = h.tanh()h = self.conv3(h, edge_index)h = h.tanh()out = self.classifier(h)return out, hmodel = GCN()
print(model)_,h = model(data.x, data.edge_index)
print(f'Embedding shape:{list(h.shape)}')
visualize_embedding(h, color=data.y)criterion = torch.nn.CrossEntropyLoss() # 损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=0.01) # 优化器def train(data):optimizer.zero_grad()out, h = model(data.x, data.edge_index)loss = criterion(out[data.train_mask], data.y[data.train_mask])loss.backward()optimizer.step()return loss, hfor epoch in range(501):loss, h = train(data)if epoch%10 == 0:visualize_embedding(h, color =data.y, epoch=epoch, loss=loss)time.sleep(0.3)

可视化图结构:
在这里插入图片描述

可视化图嵌入结构:
在这里插入图片描述

训练过程:

epoch0

在这里插入图片描述

epoch500
在这里插入图片描述

结论:随着学习过程的进行,网络逐渐优化节点的嵌入表示,损失不断减小,分类更加准确。

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

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

相关文章

CDGA数据治理工程师-学习笔记

目录 第一章 数据管理 组织管理数据的目标: 数据管理的原则: 数据生命周期: 数据管理战略的组成应包括: 第二章 数据伦理 目标 数据伦理活动 数据处理伦理问题 贝尔蒙特 数据伦理准则 违背伦理进行数据处理的风险 建立…

AWS K8s 部署架构

Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部,构成了一个帧。接收端在收到物理层上交的比特流后…

网页单机版五子棋小游戏项目练习-初学前端可用于练习~

今天给大家分享一个 前端练习的项目,技术使用的是 html css 和javascrpit 。希望能对于 刚刚学习前端的小伙伴一些帮助。 先看一下 实现的效果图 1. HTML(HyperText Markup Language) HTML 是构建网页的基础语言,它的主要作用是定…

同三维T80004ES H.265高清SDI编码器

1路SDI 1路3.5音频输入,1路SDI环出 产品简介: 同三维T80004ES高标清SDI音视频编码器支持1路高清或1路标清SDI音视频,1路3.5MM独立音频接口采集功能。编码输出双码流H.265/H.264格式,音频 MP3/AAC格式。编码码率可调,画面质量可控制…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站:https://www.jetbrains.com/pycharm/。下载社区版(免费)或专业版(收费,提供更多功能)。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm,并根…

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1) 复指数 e − j ω n e^{-j\omega n} e−jωn2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3)复指数序列求和 3.DTF…

#渗透测试#红蓝攻防#红队打点web服务突破口总结01

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…

25年1月更新。Windows 上搭建 Python 开发环境:PyCharm 安装全攻略(文中有安装包不用官网下载)

python环境没有安装的可以点击这里先安装好python环境,python环境安装教程 安装 PyCharm IDE 获取 PyCharm PyCharm 提供两种主要版本——社区版(免费)和专业版(付费)。对于初学者和个人开发者而言,社区…

JavaScript中Map与Object的区别

在JavaScript中,Map和Object是用于存储键值对数据的两种不同的数据结构(Map是ES6新增的数据结构),它们在构造方式、键的类型以及原型继承等方面存在区别。 一、主要区别 1.构造方式 Map:Map只能通过构造函数new Map…

双目视觉:reprojectImageTo3D函数

前言 reprojectImageTo3D 是 OpenCV 中用于从视差图生成三维点云的函数。它的原理是利用视差图和相机的校准参数,通过三角测量法,计算每个像素对应的三维坐标。以下内容根据源码分析所写,觉得可以的话,点赞收藏哈!&am…

Spring Boot(快速上手)

Spring Boot 零、环境配置 1. 创建项目 2. 热部署 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency&…

TTL 传输中过期问题定位

问题&#xff1a; 工作环境中有一个acap的环境&#xff0c;ac的wan口ip是192.168.186.195/24&#xff0c;ac上lan上有vlan205&#xff0c;其ip子接口地址192.168.205.1/24&#xff0c;ac采用非nat模式&#xff0c;而是路由模式&#xff0c;在上级路由器上有192.168.205.0/24指向…

MySQL中distinct和group by去重的区别

MySQL中distinct和group by去重的区别 在MySQL中&#xff0c;我们经常需要对查询结果进行去重&#xff0c;而DISTINCT和GROUP BY是实现这一功能的两种常见方法。虽然它们在很多情况下可以互换使用&#xff0c;但它们之间还是存在一些差异的。接下来&#xff0c;我们将通过创建测…

AI 驱动研发模式升级,蓝凌软件探索效率提升之道

深圳市蓝凌软件股份有限公司&#xff08;以下简称蓝凌软件&#xff09;&#xff0c;自2001年成立以来&#xff0c;一直走在数智化办公领域的前沿。作为国家认定的高新技术企业、知识管理国家标准的参编者以及信创供应商10强之一&#xff0c;蓝凌软件始终以“让组织更智慧”为使…

GPU 进阶笔记(四):NVIDIA GH200 芯片、服务器及集群组网

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; 1 传统原厂 GPU 服务器&#xff1a;Intel/AMD x86 CPU NVIDIA GPU2 新一代原厂 GPU 服务器&#xff1a;NVIDIA CPU NVIDIA GPU 2.1 CPU 芯片&#xff1a;Grace (ARM)2.2 GPU 芯片&#xff1a;Hopper/B…

SpringMVC(二)原理

目录 一、配置Maven&#xff08;为了提升速度&#xff09; 二、流程&&原理 SpringMVC中心控制器 完整流程&#xff1a; 一、配置Maven&#xff08;为了提升速度&#xff09; 在SpringMVC&#xff08;一&#xff09;配置-CSDN博客的配置中&#xff0c;导入Maven会非…

springboot集成qq邮箱服务

springboot集成qq邮箱服务 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域&#xff0c;如果当前账号未开启的话自己手动开启。 1.3 获取授权码 进入上图中的【管理服务】后&#xff1a;在【安全设置中生成授权码】,也可以直接点击【继续生成…

Word2Vec解读

Word2Vec: 一种词向量的训练方法 简单地讲&#xff0c;Word2Vec是建模了一个单词预测的任务&#xff0c;通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow&#xff0c;现在假设spiked这个单词被删掉了&#xff0c;现在要预测这个位置原本的单词是…

VBA批量插入图片到PPT,一页一图

Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…