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

GCN、GIN

# 使用TuDataset 中的PROTEINS数据集。
# 里边有1113个蛋白质图,区分是否为酶,即二分类问题。# 导包
from torch_geometric.datasets import TUDataset
from torch_geometric.data import DataLoader
import torch
import torch.nn  as nn
import torch.nn.functional as F
from torch.nn import Linear,Sequential,BatchNorm1d,ReLU,Dropout
from torch_geometric.nn import GCNConv,GINConv
from torch_geometric.nn import global_mean_pool,global_add_pool# 导入数据集
dataset = TUDataset(root='',name='PROTEINS').shuffle()
# 观测图数据
print(f'Dataset:{dataset}')
print(f'Number of graphs:{len(dataset)}')
print(f'Number of nodes:{dataset[1].x.shape[0]}') # 这是针对于第一个图来说,每个图的节点数会不同
print(f'Number of features:{dataset.num_features}')
print(f'Number of classes:{dataset.num_classes}')# 一个大的数据集进行拆分,按照 8 :1 :1的比列分为训练集,验证集和测试集
train_dataset = dataset[:int(len(dataset)*0.8)]
val_dataset = dataset[int(len(dataset)*0.8):int(len(dataset)*0.9)]
test_dataset = dataset[int(len(dataset)*0.9):]
# 打印验证:
print('----------------------------------------------')
print(f'training set  ={len(train_dataset)} graphs') # 890
print(f'validation set  ={len(val_dataset)} graphs')# 111
print(f'test set  ={len(test_dataset)} graphs')# 112
# 进行批处理,每个批次最多64个图
train_loader = DataLoader(train_dataset,batch_size=64,shuffle=True)
val_loader = DataLoader(val_dataset,batch_size=64,shuffle=True)
test_loader = DataLoader(test_dataset,batch_size=64,shuffle=True)# 打印验证一下:
print('------------------------------------------------')
print('\nTrain Loader')
for i,batch in enumerate(train_loader):print(f'-Batch{i}:{batch}')
print('\nVadidation Loader')
for i,batch in enumerate(val_loader):print(f'-Batch{i}:{batch}')
print('\nTest Loader')
for i,batch in enumerate(test_loader):print(f'-Batch{i}:{batch}')# 来咯,构建GCN模型,进行分类
class GCN(nn.Module):def __init__(self,dim_h):super().__init__()self.conv1 = GCNConv(dataset.num_features,dim_h)self.conv2 = GCNConv(dim_h,dim_h)self.conv3 = GCNConv(dim_h,dim_h)self.lin = Linear(dim_h,dataset.num_classes)def forward(self,x,edge_index,batch):h = self.conv1(x,edge_index)h = h.relu()h = self.conv2(h,edge_index)h = h.relu()h = self.conv3(h,edge_index)# global_mean_pool 适合用于一些数据分布不平衡的数据hG = global_mean_pool(h,batch)# 分类h = F.dropout(hG,p=0.5,training=self.training)h = self.lin(h)return F.log_softmax(h,dim=1)# 定义GIN模型
class GIN(nn.Module):def __init__(self,dim_h):super().__init__()self.conv1 = GINConv(Sequential(Linear(dataset.num_features,dim_h),BatchNorm1d(dim_h),ReLU(),Linear(dim_h,dim_h),ReLU()))self.conv2 = GINConv(Sequential(Linear(dim_h, dim_h),BatchNorm1d(dim_h),ReLU(),Linear(dim_h, dim_h),ReLU()))self.conv3 = GINConv(Sequential(Linear(dim_h, dim_h),BatchNorm1d(dim_h),ReLU(),Linear(dim_h, dim_h),ReLU()))# 进行分类# 看论文中的公式可知,计算后是讲三个特征concat在一起self.lin1 = Linear(dim_h*3,dim_h*3)self.lin2 = Linear(dim_h*3,dataset.num_classes)def forward(self,x,edge_index,batch):h1 = self.conv1(x,edge_index)h2 = self.conv2(h1,edge_index)h3 = self.conv3(h2,edge_index)# 求和全局池化相比与其他两种池化技术(Mean global Pooling 和Max global Pooling)更具有表达能力,# 要考虑所有的结构信息,就必须考虑GNN每一层产生的嵌入信息# 将GNN的k个层中每层产生的节点嵌入求和后串联起来h1 = global_add_pool(h1,batch)h2 = global_add_pool(h2,batch)h3 = global_add_pool(h3,batch)h = torch.cat((h1,h2,h3),dim=1)# 分类h = self.lin1(h)h = h.relu()h = F.dropout(h,p=0.5,training=self.training)h = self.lin2(h)return F.log_softmax(h,dim=1)# 开始训练咯
def train(model,loader):# 设置为训练模式model.train()# 损失函数criterion = nn.CrossEntropyLoss()# 优化函数optimizer = torch.optim.Adam(model.parameters(),lr=0.01)epochs = 100for epoch in range(epochs+1):total_loss = 0acc = 0val_loss = 0val_acc = 0for data in loader:# 梯度清零optimizer.zero_grad()# 训练out = model(data.x,data.edge_index,data.batch)# 计算该批次的损失值loss = criterion(out,data.y)# 总损失total_loss += loss / len(loader)# 计算该批次的准确率acc = accuracy(out.argmax(dim=1),data.y) / len(loader)# 反向传播loss.backward()# 参数更细optimizer.step()# 验证val_loss,val_acc = test(model,val_loader)# Print metrics every 20 epochsif (epoch % 20 == 0):print(f'Epoch {epoch:>3} | Train Loss: {total_loss:.2f} | Train Acc: {acc * 100:>5.2f}% | Val Loss: {val_loss:.2f} | Val Acc: {val_acc * 100:.2f}%')return modeldef accuracy(pred_y,y):return ((pred_y == y).sum() / len(y)).item()def test(model,loader):criterion = torch.nn.CrossEntropyLoss()model.eval()loss = 0acc = 0for data in loader:out = model(data.x,data.edge_index,data.batch)loss += criterion(out,data.y) / len(loader)acc += accuracy(out.argmax(dim=1),data.y) / len(loader)return loss,acc# 开始训练
print('GCN Training')
gcn = GCN(dim_h=32)
gcn = train(gcn,train_loader)
print('GIN Training')
gin = GIN(dim_h=32)
gin = train(gin,train_loader)test_loss, test_acc = test(gcn, test_loader)
print(f'GCN test Loss: {test_loss:.2f} | GCN test Acc: {test_acc*100:.2f}%')test_loss, test_acc = test(gin, test_loader)
print(f'Gin test Loss: {test_loss:.2f} | Gin test Acc: {test_acc*100:.2f}%')

GCN 思想:
通过卷积操作来聚合每个节点以及其邻居的特征。
计算公式如下:
H l + 1 = σ ( D ~ − 1 / 2 A ~ D ~ − 1 / 2 H l W l ) H^{l+1}=\sigma(\tilde{D}^{-1/2}\tilde{A}\tilde{D}^{-1/2}H^{l}W^{l}) Hl+1=σ(D~1/2A~D~1/2HlWl)
GIN 思想:
目的:增强图神经网络的区分能力,能够更好地区分不同的图,引入了更加强大的聚合函数。
计算公式如下:
h v k = M L P k ( ( 1 + ε ) ⋅ h v k − 1 + ∑ u ∈ N ( v ) h u k − 1 ) h_{v}^{k}=MLP^{k}((1+\varepsilon)\cdot h_{v}^{k-1} + \sum_{u\in\mathcal{N}_(v)}h_{u}^{k-1} ) hvk=MLPk((1+ε)hvk1+uN(v)huk1)
ε \varepsilon ε 是一个可学习的或固定的超参数,用于调节自环的贡献。

相关文章:

GCN、GIN

# 使用TuDataset 中的PROTEINS数据集。 # 里边有1113个蛋白质图,区分是否为酶,即二分类问题。# 导包 from torch_geometric.datasets import TUDataset from torch_geometric.data import DataLoader import torch import torch.nn as nn import torch.…...

Web控件进阶交互

Web控件进阶交互 测试时常需要模拟键盘或鼠标操作,可以用Python的ActionChains来模拟。ActionChains是Selenium提供的一个子类,用于生成和执行复杂的用户交互操作,允许将一系列操作链接在一起,然后一次性执行。 from selenium im…...

基于SpringBoot的校园疫情防控系统

你好,我是专注于计算机科学与技术的研究者。如果你对我的工作感兴趣或有任何问题,欢迎随时联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架,B/S架构 工具:Eclipse,Mav…...

elasticsearch 查询超10000的解决方案

前言 默认情况下,Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页,以及查询批量数据更新的情况 问题:当请求form size >10000 时&#xff0c…...

SpringCloud集成kafka集群

目录 1.引入kafka依赖 2.在yml文件配置配置kafka连接 3.注入KafkaTemplate模版 4.创建kafka消息监听和消费端 5.搭建kafka集群 5.1 下载 kafka Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/downloads.html 5.2 在config目录下做…...

Macos 远程登录 Ubuntu22.04 桌面

这里使用的桌面程序为 xfce, 而 gnome 桌面则测试失败。 1,安装 在ubuntu上,安装 vnc server与桌面程序xfce sudo apt install xfce4 xfce4-goodies tightvncserver 2,第一次启动和配置 $ tightvncserver :1 设置密码。 然后修改配置&#xff1a…...

第十届MathorCup高校数学建模挑战赛-A题:无车承运人平台线路定价问题

目录 摘 要 1 问题重述 1.1 研究背景 1.2 研究问题 2 符号说明与模型假设 2.1 符号说明 2.2 模型假设 3 问题一:模型建立与求解 3.1 问题分析与思路 3.2 模型建立 3.2.1 多因素回归模型 3.3 模型求解 3.3.1 数据预处理 3.3.2 重要度计算 4 问题二:模型建立与求…...

在分布式环境中,怎样保证 PostgreSQL 数据的一致性和完整性?

文章目录 在分布式环境中保证 PostgreSQL 数据的一致性和完整性一、数据一致性和完整性的重要性二、分布式环境对数据一致性和完整性的挑战(一)网络延迟和故障(二)并发操作(三)数据分区和复制 三、保证 Pos…...

RabbitMq如何保证消息的可靠性和稳定性

RabbitMq如何保证消息的可靠性和稳定性 rabbitMq不会百分之百让我们的消息安全被消费,但是rabbitMq提供了一些机制来保证我们的消息可以被安全的消费。 消息确认 消息者在成功处理消息后可以发送确认(ACK)给rabbitMq,通知消息已…...

druid(德鲁伊)数据线程池连接MySQL数据库

文章目录 1、druid连接MySQL2、编写JDBCUtils 工具类 1、druid连接MySQL 初学JDBC时,连接数据库是先建立连接,用完直接关闭。这就需要不断的创建和销毁连接,会消耗系统的资源。 借鉴线程池的思想,数据连接池就这么被设计出来了。…...

观察者模式的实现

引言:观察者模式——程序中的“通信兵” 在现代战争中,通信是胜利的关键。信息力以网络、数据、算法、算力等为底层支撑,在现代战争中不断推动感知、决策、指控等各环节产生量变与质变。在软件架构中,观察者模式扮演着类似的角色…...

Eureka: Netflix开源的服务发现框架

在微服务架构中,服务发现是一个关键组件,它允许服务实例之间相互发现并进行通信。Eureka是由Netflix开源的服务发现框架,它是Spring Cloud体系中的核心组件之一。Eureka提供了服务注册与发现的功能,支持区域感知和自我保护机制&am…...

go-基准测试

基准测试 Demo // fib_test.go package mainimport "testing"func BenchmarkFib(b *testing.B) {for n : 0; n < b.N; n {fib(30) // run fib(30) b.N times} }func fib(n int) int {if n 0 || n 1 {return n}return fib(n-2) fib(n-1) }benchmark 和普通的单…...

线性代数|机器学习-P23梯度下降

文章目录 1. 梯度下降[线搜索方法]1.1 线搜索方法&#xff0c;运用一阶导数信息1.2 经典牛顿方法&#xff0c;运用二阶导数信息 2. hessian矩阵和凸函数2.1 实对称矩阵函数求导2.2. 线性函数求导 3. 无约束条件下的最值问题4. 正则化4.1 定义4.2 性质 5. 回溯线性搜索法 1. 梯度…...

SQL,python,knime将数据混合的文字数字拆出来,合并计算实战

将下面将数据混合的文字数字拆出来&#xff0c;合并计算 一、SQL解决&#xff1a; ---创建表插入数据 CREATE TABLE original_data (id INT AUTO_INCREMENT PRIMARY KEY,city VARCHAR(255),value DECIMAL(10, 2) );INSERT INTO original_data (city, value) VALUES (上海0.5…...

mac ssh连接工具

在Mac上&#xff0c;有多个SSH连接工具可供选择&#xff0c;这些工具根据其功能和适用场景的不同&#xff0c;可以满足不同用户的需求。以下是一些推荐的SSH客户端软件&#xff1a;12 iTerm2&#xff1a;这是一款功能强大的终端应用程序&#xff0c;提供了丰富的功能和定制选项…...

阿里通义音频生成大模型 FunAudioLLM 开源

简介 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术的进步极大地改变了人类与机器的互动方式&#xff0c;特别是在语音处理领域。阿里巴巴通义实验室最近开源了一个名为FunAudioLLM的语音大模型项目&#xff0c;旨在促进人类与大型语言模型&#xff08;LLMs&…...

通用详情页的打造

背景介绍 大家都知道&#xff0c;详情页承载了站内的核心流量。它的量级到底有多大呢&#xff1f; 我们来看一下&#xff0c;日均播放次数数亿次&#xff0c;这么大的流量&#xff0c;其重要程度可想而知。 在这样一个页面&#xff0c;每一个功能都是大量业务的汇总点。 作为…...

java内部类的本质

定义在类内部&#xff0c;可以实现对外部完全隐藏&#xff0c;可以有更好的封装性&#xff0c;代码实现上也往往更为简洁。 内部类可以方便地访问外部类的私有变量&#xff0c;可以声明为private从而实现对外完全隐藏。 在Java中&#xff0c;根据定义的位置和方式不同&#xf…...

vue3 学习笔记08 -- computed 和 watch

vue3 学习笔记08 – computed 和 watch computed computed 是 Vue 3 中用于创建计算属性的重要 API&#xff0c;它能够根据其它响应式数据动态计算出一个新的值&#xff0c;并确保在依赖数据变化时自动更新。 基本用法 squaredCount 是一个计算属性&#xff0c;它依赖于 count…...

敏捷团队沟通技巧:减少冲突的5个方法

在敏捷开发环境中&#xff0c;软件测试从业者常面临跨职能冲突的挑战。数据显示&#xff0c;超过70%的项目延迟源于沟通不畅&#xff0c;尤其在测试与开发团队之间&#xff0c;角色目标错位&#xff08;如开发侧重快速交付&#xff0c;测试聚焦风险防控&#xff09;易引发摩擦。…...

3步解决macOS应用更新烦恼:开源神器Latest使用指南

3步解决macOS应用更新烦恼&#xff1a;开源神器Latest使用指南 【免费下载链接】Latest A small utility app for macOS that makes sure you know about all the latest updates to the apps you use. 项目地址: https://gitcode.com/gh_mirrors/la/Latest 你是否曾为m…...

微信小程序数据绑定与渲染全解析:从入门到精通

微信小程序数据绑定与渲染实战指南&#xff1a;解锁高效开发密码 微信小程序开发中&#xff0c;数据绑定与渲染机制是构建动态界面的核心。不同于传统网页开发&#xff0c;小程序采用独特的双线程架构&#xff0c;数据通信需要特殊处理。本文将深入剖析数据绑定的底层原理&…...

【刚性 PINN 与时间自适应策略】第九章:综合案例实战:刚性化学反应动力学模拟

目录 9.1 问题描述与数据生成 9.1.1 Robertson 刚性化学反应模型构建 9.1.2 传统 PINN 的失败复现与诊断 第二部分:代码实现 9.1.1.1 三组分反应方程组及其刚性特征分析 9.1.1.2 基准解的生成(使用隐式求解器) 9.1.2.1 训练损失曲线与预测结果的偏差可视化 9.1.2.2 …...

Kangaroo运动控制器Packet Serial通信协议详解

1. Kangaroo运动控制器底层通信技术解析 Kangaroo运动控制器是由RoboClaw系列厂商推出的专用闭环步进/伺服电机驱动模块&#xff0c;其核心价值在于将复杂的PID调节、电流环控制、位置反馈处理等算法固化于硬件中&#xff0c;使上位机仅需通过精简的串行协议即可完成高精度运动…...

(二)人工智能算法之监督学习——线性回归

一、核心定义 线性回归是有监督、回归任务里最基础、最经典的机器学习算法。 核心目标&#xff1a; 用一条直线&#xff08;一元&#xff09;/ 超平面&#xff08;多元&#xff09;&#xff0c;拟合自变量 X 和连续型因变量 Y 之间的线性相关关系&#xff0c;用来做数值预测。 …...

多平台网盘直链解析工具:技术原理与应用指南

多平台网盘直链解析工具&#xff1a;技术原理与应用指南 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无…...

从零打造你的CAD开发环境:用OpenCASCADE 7.7.0 + VS2022画个3D盒子(完整Debug/Release配置)

从零打造你的CAD开发环境&#xff1a;用OpenCASCADE 7.7.0 VS2022画个3D盒子&#xff08;完整Debug/Release配置&#xff09; 当你第一次尝试在Visual Studio中配置OpenCASCADE&#xff08;OCCT&#xff09;时&#xff0c;可能会被那些复杂的路径设置、库文件链接和环境变量搞…...

Sambert多情感语音合成镜像:在虚拟主播场景下的应用实践

Sambert多情感语音合成镜像&#xff1a;在虚拟主播场景下的应用实践 1. 引言&#xff1a;虚拟主播的“声音”难题 你有没有想过&#xff0c;那些在直播间里和你互动、讲段子、带货的虚拟主播&#xff0c;为什么有的声音听起来特别“假”&#xff0c;而有的却能让你感觉像在和…...

高效图像浏览:解锁90+格式的轻量级解决方案

高效图像浏览&#xff1a;解锁90格式的轻量级解决方案 【免费下载链接】ImageGlass &#x1f3de; A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 在数字时代&#xff0c;我们每天都要与各种图像格式打交道&#xff0…...