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

【Deep Learning 11】Graph Neural Network

🌞欢迎来到图神经网络的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

📆首发时间:🌹2024年3月20日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


 目录

GNN起源

图的矩阵表示

层内与层间的消息传递

GCN

GraphSAGE

代码实战

GAT

代码实战


GNN起源

  (1)数学中的空间有很多种,大部分都是定义在欧氏里德空间的,比如图像,文本。除此之外还存在着大量的非欧空间,比如分子结构。

 (2) 图嵌入常⻅模型有DeepWalk,Node2Vec等,然而,这些方法方法有两种严重的缺点,首先就是节点编码中权重未共享,导致权重数量随着节点增多而线性增大,另外就是直接嵌入方法缺乏泛化能力,意味着无法处理动态图以及泛化到新的图。

如何把这种图结构嫁接到神经网络上,图神经网络就诞生了。和传统的神经网络结构相比,它解决了两个问题。

  • 图结构的矩阵画表示
  • 层内与层间的消息传递
图的矩阵表示
  • 借用邻接矩阵
  • 考虑稀疏性,还可以使用邻接表。

层内与层间的消息传递

聚合

     简单来说一个节点或者边的特征,不光看它自己,还要由它相邻元素的加权求和决定。层内的聚合常常被称之为池化

    层级间的关系传递,通过节点的连接关系进行,也可以看成是一种聚合,根据聚合方法的差异形成了不同的算法,最简单的是图卷积网络GCN。就是在层间经过邻域聚合实现卷积特征提取。左乘于邻接矩阵表示对每个节点来说,该节点的特征为邻域节点的特征,相加之后的结果。

如果聚合的时候没有用全部的邻域节点,而是先采样再聚合,就是GraphSAGE算法。

如果聚合的时候考虑了领域节点的权重,也就是运用了注意力机制,那么就是图注意力网络GAT

聚合还可以用在非监督模型上,比如把图和变自分编码器相结合,形成GAE算法

除此之外还有更复杂的图生成网络,和图时空网络


GCN

原理解析:

代码实战:

     

import torch
import torch.nn as nn
import dgl
import dgl.function as fn
import networkx as nx
import matplotlib.pyplot as plt
from rdkit import Chem
from rdkit.Chem import Draw# 构建阿司匹林分子
aspirin_smiles = "CC(=O)OC1=CC=CC=C1C(=O)O"
aspirin_mol = Chem.MolFromSmiles(aspirin_smiles)# 构建分子图
aspirin_graph = dgl.from_networkx(nx.Graph(Chem.rdmolops.GetAdjacencyMatrix(aspirin_mol)))# 可视化分子结构
Draw.MolToImage(aspirin_mol)# 定义GCN模型
class GCN(nn.Module):def __init__(self, in_feats, hidden_size, num_classes):super(GCN, self).__init__()self.conv1 = dgl.nn.GraphConv(in_feats, hidden_size)self.conv2 = dgl.nn.GraphConv(hidden_size, num_classes)def forward(self, g, features):h = self.conv1(g, features)h = torch.relu(h)h = self.conv2(g, h)return h# 初始化GCN模型
input_dim = 1  # 输入特征维度为1,因为我们只考虑一个原子的属性
hidden_size = 64
num_classes = 2  # 为简单起见,假设我们的任务是二分类
gcn_model = GCN(input_dim, hidden_size, num_classes)# 可视化GCN模型结构
print(gcn_model)# 可视化分子图
plt.figure(figsize=(8, 6))
nx.draw(aspirin_graph.to_networkx(), with_labels=True, node_color='skyblue', node_size=800, font_size=12, font_weight='bold', edge_color='gray')
plt.title('Molecular Graph')
plt.show()


GraphSAGE

代码实战

   我们来实现了一个简单的 GraphSAGE 模型,并对阿司匹林的分子结构进行预测。首先,我们需要构建一个简单的图结构来表示阿司匹林的分子。然后,我们将定义一个GraphSAGE 模型,并使用该模型对阿司匹林分子的属性进行预测。

import torch
import torch.nn as nn
import dgl
import dgl.function as fn
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np# 构建一个简单的分子图来表示阿司匹林的结构
aspirin_graph = dgl.graph(([0, 1, 1, 2], [1, 0, 2, 1]))  # 定义边的连接关系# 可视化分子图
plt.figure(figsize=(4, 4))
nx.draw(aspirin_graph.to_networkx(), with_labels=True, node_color='skyblue', node_size=800, font_size=12, font_weight='bold', edge_color='gray')
plt.title('Molecular Graph')
plt.show()# 定义GraphSAGE模型
class GraphSAGE(nn.Module):def __init__(self, in_feats, hidden_size, num_classes):super(GraphSAGE, self).__init__()self.conv1 = dgl.nn.SAGEConv(in_feats, hidden_size, 'mean')self.conv2 = dgl.nn.SAGEConv(hidden_size, num_classes, 'mean')def forward(self, g, features):h = self.conv1(g, features)h = torch.relu(h)h = self.conv2(g, h)return h# 初始化GraphSAGE模型
input_dim = 1  # 输入特征维度为1,因为我们只考虑一个原子的属性
hidden_size = 64
num_classes = 2  # 为简单起见,假设我们的任务是二分类
graphsage_model = GraphSAGE(input_dim, hidden_size, num_classes)# 生成随机的示例数据
num_samples = aspirin_graph.number_of_nodes()
node_features = torch.randn(num_samples, input_dim)# 随机生成二分类标签(示例)
labels = torch.randint(0, 2, (num_samples,))# 将标签添加到图中的节点
aspirin_graph.ndata['features'] = node_features
aspirin_graph.ndata['labels'] = labels# 定义损失函数
loss_fn = nn.CrossEntropyLoss()# 模型训练
optimizer = torch.optim.Adam(graphsage_model.parameters(), lr=0.001)
epochs = 50for epoch in range(epochs):logits = graphsage_model(aspirin_graph, aspirin_graph.ndata['features'])loss = loss_fn(logits, aspirin_graph.ndata['labels'])optimizer.zero_grad()loss.backward()optimizer.step()if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item()}')# 使用模型进行预测(示例)
with torch.no_grad():predicted_labels = torch.argmax(graphsage_model(aspirin_graph, aspirin_graph.ndata['features']), dim=1)print("Predicted Labels:", predicted_labels)

GAT

代码实战
import torch
import torch.nn as nn
import dgl
import dgl.function as fn
import networkx as nx
import matplotlib.pyplot as plt# 构建阿司匹林分子的简单图结构
aspirin_graph = dgl.graph(([0, 0, 0, 1, 2], [1, 2, 3, 3, 3]))  # 使用边列表构建图# 定义节点特征
node_features = torch.tensor([[0.1, 0.2],[0.2, 0.3],[0.3, 0.4],[0.4, 0.5]
], dtype=torch.float)# 将节点特征设置到图中
aspirin_graph.ndata['feat'] = node_features# 可视化分子图
plt.figure(figsize=(8, 6))
nx.draw(aspirin_graph.to_networkx(), with_labels=True, node_color='skyblue', node_size=800, font_size=12, font_weight='bold', edge_color='gray')
plt.title('Molecular Graph')
plt.show()
class GAT(nn.Module):def __init__(self, in_dim, hidden_dim, out_dim, num_heads):super(GAT, self).__init__()self.conv1 = dgl.nn.GATConv(in_dim, hidden_dim, num_heads)self.conv2 = dgl.nn.GATConv(hidden_dim * num_heads, out_dim, num_heads)def forward(self, g, features):h = self.conv1(g, features)h = torch.relu(h)h = self.conv2(g, h)return h# 初始化 GAT 模型
input_dim = 2  # 输入特征维度
hidden_dim = 64
out_dim = 1  # 输出维度,这里假设我们只需要一个输出维度进行二分类
num_heads = 2
gat_model = GAT(input_dim, hidden_dim, out_dim, num_heads)# 输出 GAT 模型结构
print(gat_model)

相关文章:

【Deep Learning 11】Graph Neural Network

🌞欢迎来到图神经网络的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 🌟本文由卿云阁原创! 📆首发时间:🌹2024年3月20日…...

http和https的工作原理是什么?

HTTP(HyperText Transfer Protocol)和HTTPS(HyperText Transfer Protocol Secure)是两种用于在互联网上传输数据的主要协议,它们均用于在客户端(通常是Web浏览器)与服务器之间交换信息。尽管它们…...

STL中容器、算法、迭代器

STL标准模板库封装了常用的数据结构和算法,让程序员无需太关心真实的数据结构实现。 容器 容器:用来存放数据的。 STL容器就是将运用最广泛的的一些数据结构实现出来。 常用的数据结构有:数组、链表、树、栈、队列、集合、映射表。 这些…...

深入并广泛了解Redis常见的缓存使用问题

Redis 作为一门主流技术,缓存应用场景非常多,很多大中小厂的项目中都会使用redis作为缓存层使用。 但是Redis作为缓存,也会面临各种使用问题,比如数据一致性,缓存穿透,缓存击穿,缓存雪崩&#…...

nginx界面管理工具之nginxWebUI 搭建与使用

nginx界面管理工具之nginxWebUI 搭建与使用 一、nginxWebUI 1.nginx网页配置工具 官网地址: http://www.nginxwebui.cn 源码地址:https://git.chihiro.org.cn/chihiro/nginxWebUI 2.功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, tcp协议…...

linux下 罗技鼠标睡眠唤醒问题的解决

sudo dmesg | grep Logitech | grep -o -P "usb.?\s" 得到3-2,用上面这条命令得到哪个usb口。 下面这条命令禁用罗技鼠标睡眠唤醒系统(3-2改成你自己电脑上得到的usb口) sudo sh -c "echo disabled > /sys/bus/usb/devic…...

架构师之路--Docker的技术学习路径

Docker 的技术学习路径 一、引言 Docker 是一个开源的应用容器引擎,它可以让开发者将应用程序及其依赖包打包成一个可移植的容器,然后在任何支持 Docker 的操作系统上运行。Docker 具有轻量级、快速部署、可移植性强等优点,因此在现代软件开…...

【动手学深度学习-pytorch】 9.4 双向循环神经网络

在序列学习中,我们以往假设的目标是: 在给定观测的情况下 (例如,在时间序列的上下文中或在语言模型的上下文中), 对下一个输出进行建模。 虽然这是一个典型情景,但不是唯一的。 还可能发生什么其…...

网际协议 - IP

文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…...

DC-9靶场

一.环境搭建 1.下载地址 靶机下载地址:https://download.vulnhub.com/dc/DC-9.zip 2.虚拟机配置 设置虚拟机为nat,遇到错误点重试和是 开启虚拟机如下图所示 二.开始渗透 1. 信息收集 查找靶机的ip地址 arp-scan -l 发现靶机的ip地址为192.168.11…...

自定义类型(二)结构体位段,联合体,枚举

这周一时兴起,想写两篇文章来拿个卷吧,今天也是又来写一篇博客了,也是该结束自定义类型的学习与巩固了。 常常会回顾努力的自己,所以要给自己的努力留下足迹。 为今天努力的自己打个卡,留个痕迹吧 2024.03.30 小闭…...

MySQL5.7源码分析--解析

select语句会走的case COM_QUERY判断 具体流程如下: 1.获取网络包数据,拿到查询语句,放入thd->query alloc_query(thd, packet, packet_length) 2.先查询缓存,缓存命中直接返回结果,未命中则解析 功能集中在mys…...

windows10搭建reactnative,运行android全过程

环境描述 win10,react-native-cli是0.73,nodeJS是20,jdk17。这都是完全根据官网文档配置的。react-native环境搭建windows。当然官网文档会更新,得完全按照配置来安装,避免遇到环境不兼容情况。 安装nodeJS并配置 这里文档有详…...

小迪学习笔记(内网安全)(常见概念和信息收集)

小迪学习笔记(内网安全)(一) 内网分布图内网基本概念工作组和域环境的优缺点内网常用命令域的分类单域父域和子域域数和域森林 Linux域渗透问题内网安全流程小迪演示环境信息收集mimikatzLazagne(all)凭据信息政集操作演示探针主机…...

Python自动连接SSH

Python自动连接SSH 在 Python 中,可以使用 paramiko 模块来编写脚本自动执行 SSH 命令。paramiko 是一个用于 SSHv2 的 Python 实现,可以帮助你在脚本中进行远程执行命令。 首先,确保安装了 paramiko: pip install paramiko然后…...

机器学习实验------AGNES层次聚类方法

机器学习 — AGNES层次聚类方法 第1关:距离的计算 任务描述 本关任务:根据本关所学知识,完成calc_min_dist函数,calc_max_dist函数以及calc_avg_dist函数分别实现计算两个簇之间的最短距离、最远距离和平均距离。 import numpy as np def calc_min_dist(cluster1, clus…...

HBase常用的Filter过滤器操作

HBase过滤器种类很多,我们选择8种常用的过滤器进行介绍。为了获得更好的示例效果,先利用HBase Shell新建students表格,并往表格中进行写入多行数据。 一、数据准备工作 (1)在默认命名空间中新建表格students&#xf…...

容器安全与防御(德迅蜂巢)

通过容器可以快速的运行应用、迁移应用、快速集成、快速部署、也提高了系统的资源利用率,因此现在越来越多的企业把应用上云,来达到快速上线应用、方便运维的目的。容器安全也逐渐地被重视起来,了解容器如何检测当前企业环境内容器环境是否安…...

【面经八股】搜广推方向:面试记录(十一)

【面经&八股】搜广推方向:面试记录(十一) 文章目录 【面经&八股】搜广推方向:面试记录(十一)1. 自我介绍2. 实习经历问答4. 编程题5. 反问1. 自我介绍 。。。。。。 2. 实习经历问答 就是对自己实习事情要足够的清晰,不熟的不要写在简历上!!! 其中,有个 …...

第十四章 MySQL

一、MySQL 1.1 MySql 体系结构 MySQL 架构总共四层,在上图中以虚线作为划分。 1. 最上层的服务并不是 MySQL 独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。 2. 第二层的架构包括…...

C++项目——集群聊天服务器项目(七)Model层设计、注册业务实现

在前几节的研究中,我们已经实现网络层与业务层分离,本节实现数据层与业务层分离,降低各层之间的耦合性,同时实现用户注册业务。 网络层专注于处理网络通信与读写事件 业务层专注于处理读写事件到来时所需求的各项业务 数据层专…...

VBA语言専攻介绍(20240331更新)

VBA语言専攻简介 “VBA语言専攻”是大家汲取知识的源泉,是提高自己能力的净土,正如我对平台的介绍:社会的进步,源于对知识的尊重和敬仰。希望每一位学员,每一位关注平台的朋友,都能很好的利用这个平台来学…...

Golang- 邮件服务,发送邮件

依赖 go get -u github.com/jordan-wright/email文档 文档 示例代码 邮箱的相关配置 # email configuration email:port: 25 # 端口要配置25 否则可能出现EOF错误from: xxx1qq.comhost: smtp.qq.comis-ssl: truesecret: xxxxxnickname: 大锦余发送邮件代码 package utili…...

C语言:编译和链接

前言 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)。第2种是执行环境,它用于实际执行代码。 目录 1.翻译环境1.1 预处理(预编…...

JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 多线程安全问题概述 1.1 线程不安全的实际例子 2.0 出现线程不安全的原因 2.1 线程在系统中是随机调度且抢占式执行的模式 2.2 多个线程同时修改同一个变量 2.3 线…...

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候,确定了源 IP 地址和⽬标 IP 地址后,就会通过主机路由表确定 IP 数据包下⼀跳。然⽽,⽹络层的下⼀层是数据链路层,所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…...

正弦实时数据库(SinRTDB)的使用(7)-历史统计查询

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…...

编译和链接知识点

为什么我们在vs等编译器上写出的代码通过运行就会实现相关功能呢? 解决这个问题的关键就是关于编译与链接的知识。 首先从大的分类里有两部分:编译和链接 而编译这一大的部分又分为预处理(也叫预编译),编译&#xf…...

大话设计模式之工厂模式

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式,而无需指定将要创建的对象的确切类。通过使用工厂模式,我们可以将对象的创建和使用分离,从而使代码更具灵活性和可维护性。…...

Windows MySQL通过data 文件夹恢复数据

前言 在MySql数据库中,为了备份和恢复数据,通常会使用mysqldump工具来导出和导入数据。但是,如果数据库非常大,name导出和导入数据可能会需要很长时间。这时,一种更快速的备份和恢复数据的方式就是直接复制mysql的data文件夹。 什么是mysql的…...

如何提高wordpress访问速度/it教育培训机构排名

转载原文在win环境下使用Git与GitHub建立关联or第二篇文章or图解说...

福田莲花北网站建设/网站推广优化排名教程

第72届“世界大学生日”刚刚过去不久,这个节日本是为了在大学生中倡导追求和平、民主、自由和进步,如今,战乱过去已久,现今社会对人才的要求和期待越来越高,大学生也有着属于这个时代的使命与目标。现如今,…...

动态网站开发案例教程/站群优化公司

出现问题的code!!! 1 private void saveImage(String uri, String savePath) throws IOException {2 3 // 创建连接4 HttpURLConnection conn createConnection(uri);5 6 // 拿到输入流,此流即是图片资源本身7 InputStream imputStream conn.getInputStream(…...

建网站找汉狮/公司官网制作多少钱

扩展NSAttributedString 简单的实现方法是为NSAttributedString 添加一个category。 然后为此category添加额外的方法。 具体实现如下: [代码]c#/cpp/oc代码: interface NSAttributedString (Hyperlink) (id)hyperlinkFromString:(NSString*)inString wi…...

做拍福利爱福利视频网站/百度关键词排名优化工具

已经有两篇文章写了怎么导出json到excel,不过那个插件只能做这一项工作,为了结合excel上传导入json数据,所以用js-xlsx这个插件再弄一次 js支持 1、js-xlsx 2、filesave (如果想像我这样引入,需要在源代码中删除最前面的export…...

口碑营销的策略技巧/seo是搜索引擎营销吗

yum -y install screen screen -S lnmp 记录session会话 ssh客户端中断再连接后 screen -r lnmp 恢复会话转载于:https://blog.51cto.com/kongdq/967746...