图神经网络:(图的分类)在MUTAG数据集上动手实现图神经网络

news2024/11/27 17:47:05

文章说明:
1)参考资料:PYG官方文档。超链。
2)博主水平不高,如有错误还望批评指正。
3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8848。

文章目录

    • MUTAG数据集说明
    • 图的小批量处理法
    • 图分类的基本流程
    • 改进算法

MUTAG数据集说明

MUTAG数据集是一个常用分子图形数据集。该数据集包含188个分子(也就是说有188张图并且每个图为无向无权非自循环),每个分子包含一个二元标签表示该分子是否为一种类固醇化合物。特征向量具体含义未知但是不用关注。PS:猜测特征向量应为:独热编码具体来说是否为某原子。这里边有很多信息但为了简单是我们并不使用,例如:化学键具体是什么。
导库

from torch_geometric.datasets import TUDataset
import torch

导数据集

dataset=TUDataset(root='/DATA/TUDataset',name='MUTAG')

打乱顺序,训测拆分

dataset=dataset.shuffle()
train_dataset=dataset[:150]
test_dataset=dataset[150:]

我们下面观察数据

图的小批量处理法

在这里插入图片描述
为充分利用GPU,我们使用如上方式——1)创建一个包含多个孤立图的超巨型图,2)特征矩阵简单连接。如上。有如下的优点:1)不同图之间不会进行信息的传递2)稀疏矩阵保存不会占用内存。
导库

from torch_geometric.loader import DataLoader

观察数据

train_loader=DataLoader(train_dataset,batch_size=64,shuffle=True)
test_loader=DataLoader(test_dataset,batch_size=64,shuffle=False)
for step,data in enumerate(train_loader):
    print(f'Step {step + 1}:')
    print('=======')
    print(f'Number of graphs in the current batch: {data.num_graphs}')
    print(data)
    print()
#输出如下:
#Step 1:
#=======
#Number of graphs in the current batch: 64
#DataBatch(edge_index=[2, 2626], x=[1187, 7], edge_attr=[2626, 4], y=[64], batch=[1187], ptr=[65])

#Step 2:
#=======
#Number of graphs in the current batch: 64
#DataBatch(edge_index=[2, 2448], x=[1107, 7], edge_attr=[2448, 4], y=[64], batch=[1107], ptr=[65])

#Step 3:
#=======
#Number of graphs in the current batch: 22
#DataBatch(edge_index=[2, 978], x=[441, 7], edge_attr=[978, 4], y=[22], batch=[441], ptr=[23])

图分类的基本流程

1.通过多轮信息传递嵌入节点
2.聚合嵌入节点为嵌入图
3.训练一个嵌入图分类器
PS:第二步一般使用如下的公式: X G = 1 ∣ V ∣ ∑ v ∈ V x v L \mathcal{X_{\mathcal{G}}}=\frac{1}{|\mathcal{V}|}\sum_{\mathcal{v} \in \mathcal{V}}\mathcal{x}_{\mathcal{v}}^{L} XG=V1vVxvL
搭建GCN的模型

from torch_geometric.nn import global_mean_pool
from torch_geometric.nn import GCNConv
import torch.nn.functional as F
from torch.nn import Linear

class GCN(torch.nn.Module):
    
    def __init__(self,hidden_channels):
        super(GCN,self).__init__()
        self.conv1=GCNConv(dataset.num_node_features,hidden_channels)
        self.conv2=GCNConv(hidden_channels,hidden_channels)
        self.conv3=GCNConv(hidden_channels,hidden_channels)
        self.lin=Linear(hidden_channels,dataset.num_classes)

    def forward(self,x,edge_index,batch):
        x=self.conv1(x,edge_index)
        x=x.relu()
        x=self.conv2(x,edge_index)
        x=x.relu()
        x=self.conv3(x,edge_index)
        x=global_mean_pool(x,batch)
        x=F.dropout(x,p=0.5,training=self.training)
        x=self.lin(x)
        return x

model=GCN(hidden_channels=64)
print(model)
#输出如下:
#GCN(
#  (conv1): GCNConv(7, 64)
#  (conv2): GCNConv(64, 64)
#  (conv3): GCNConv(64, 64)
#  (lin): Linear(in_features=64, out_features=2, bias=True)
#)

训练模型得出结果

model=GCN(hidden_channels=64)
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)
criterion=torch.nn.CrossEntropyLoss()

def train():
    model.train()
    for data in train_loader: 
         out=model(data.x,data.edge_index,data.batch)
         loss=criterion(out,data.y)
         loss.backward()
         optimizer.step()
         optimizer.zero_grad()

def test(loader):
     model.eval()
     correct=0
     for data in loader:
         out=model(data.x,data.edge_index,data.batch)  
         pred=out.argmax(dim=1)
         correct+=int((pred==data.y).sum())
     return correct/len(loader.dataset)

for epoch in range(1,171):
    train()
    train_acc=test(train_loader)
    test_acc=test(test_loader)
    print(f'Epoch: {epoch:03d}, Train Acc: {train_acc:.4f}, Test Acc: {test_acc:.4f}')
#输出如下(这里只有最后一侧):
#Epoch: 170, Train Acc: 0.7933, Test Acc: 0.7895

改进算法

我在百度网盘上传改进算法相关文章和jupyter nootbook。超链。提取码8848。
第一篇文章:HOW POWERFUL ARE GRAPH NEURAL NETWORKS?
主要工作:1)他们证明了区分图结构方面,GNNs的表达能力小于等于Weisfeiler-Lehman test。2)他们具体指出什么情况两个算法是效果相同的 3)他们具体指出GNNs及变体能够识别哪些图的结构不能识别哪些图的结构。4)他们开发一种简单的GIN结构效果等同Weisfeiler-Lehman test算法。
第二篇文章:Weisfeiler and Leman Go Neural: Higher-order Graph Neural Networks
主要工作:1)同上的1)。2)提出一种1-k-GNNs的算法。3)高阶的图属性对于分类回归十分重要。

WL-1伪代码:博主感觉这张图的比较好懂
在这里插入图片描述

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

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

相关文章

Webpack4 应用

文章目录 Webpack4 应用处理CSS文件使用css-loader和style-loader内联CSS安装配置webpack.config.js编写源代码编译打包 使用css-loader和mini-css-extract-plugin外部链接CSS安装配置webpack.config.js编译打包 处理图片使用file-loader处理CSS图片安装file-loader配置webpack…

ChatGPT使用体验

ChatGPT使用体验 前言 介绍ChatGPT 体验ChatGPT 菜谱 编程学习 出行导航 导游攻略 中英翻译 电影推荐 文章总结 总结 前言 最近关于ChatGPT的话题已经火爆了,我也观察和体验了一段时间。平心而论,这东西真的黑科技,大多行业都能通…

Unity-Android 打包报错

目录 报错: 分析: 1.代码剔除等级设置 2.什么方式会被剔除 3.解决办法 报错: FileNotFoundException: Could not load file or assembly XXX or one of its dependencies at System.AppDomain.Load (System.String assemblyString, Sys…

AI低代码,或将再次颠覆开发行业

IT行业最不缺少概念,大多数人也都是一知半解。AI的火爆,低代码的盛行,如今AIGC低代码、AI低代码、智能开发、AI生成式开发、AIGS(AI生成软件)等等呼之欲出, AIGC(AI Generated Content,AI生成内容&#xff…

攻防世界-web-php_rce

题目描述:无,只给了下面一张图(PS:图中的链接没问题) 1. 思路分析 图中信息给的不是很到位,需要有点外部知识,网上搜索ThinkPHP V5,可以看到是think php的一个历史高危漏洞&#x…

Grafana插件安装并接入zabbix数据源(03)

一、在线安装插件 如果不指定插件安装位置,则默认安装位置为/var/lib/grafana/plugins;插件安装后需要重启grafana-server 安装zabbix插件alexanderzobnin-zabbix-app # grafana-cli plugins install alexanderzobnin-zabbix-app 使用--pluginsDir指定安装路径 # grafana…

分库分表的 21 条法则,hold 住

不着急实战,咱们先介绍下在分库分表架构实施过程中,会接触到的一些通用概念,了解这些概念能够帮助理解市面上其他的分库分表工具,尽管它们的实现方法可能存在差异,但整体思路基本一致。因此,在开始实际操作…

【字典详细介绍】——python基础——如桃花来

目录索引 字典的意义和特征:创建字典的语法:创建空字典的两种形式:创建字典的形式:*直接用大括号包裹即可:* 字典的常见操作:新增及修改:删除:***语法:****clear()清空字…

【方法】PDF文档很多页,怎么提取并保存其中一页或多页?

​生活或工作中,PDF文档都很常见,有时候我们得到一份PDF文档,想要提取里面的内容,只需要其中一页或多页,或部分内容,那要怎么提取并保存下来呢?下面小编分享3个方法,简单快速解决问题…

大型集团数字化现状洞察,三步解决组织分级分权管理难题|身份云研究院

在经历全球范围的疫情冲击后,疫情对企业数字化转型的影响已经从初期被迫式、局部场景的“云办公”转化为长期深远地全场景影响。加之近年中美技术加速解耦,以及信创政策的加持下,中国企业在数字化转型中使用本地化解决方案代替原有的外企套装…

Linux 使用笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的,当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows,有机会接触 Linux 一般是偶尔在服务器上跑跑程…

Android还要继续学习吗?高薪高级开发领先位置占据一席之地

Android开发还有必要学习吗 ? 我们来看Android从业大佬的回答;从回答中可以读取出一些信息,Android市场仍有岗位需求,只不过减少许多初级Android开发岗位。对于中高端市场还是面临着缺少人才;因为初级开发人员多啊&am…

数据治理实践-全面总结:小文件治理

01 背景 小文件是如何产生的: 日常任务及动态分区插入数据(使用的Spark2 MapReduce引擎),产生大量的小文件,从而导致Map数量剧增; Reduce数量越多,小文件也越多(Reduce的个数和输出文件是对应…

Cube Map 系列之:手把手教你 使用 立方体贴图

什么是Cube Map 在开始立方体贴图之前,我们先简单了解下cube map。 cube map 包含了六个纹理,分别表示了立方体的六个面; 相较二维的纹理使用坐标uv来获取纹理信息,这里我们需要使用三维的方向向量来获取纹理信息(一…

[PyTorch][chapter 33][卷积神经网络]

前言 参考: 《数字图像处理与机器视觉》 第五章 空间域图像增强, 图像卷积: 空间域图像增强 图像增强是根据特定需要突出一副图像中的某些信息,同时削弱或去除 某些不需要信息的处理方法,其主要目的是是的处理后的图像对某种特定的…

有人问C# web怎么部署iis上面

C# web怎么部署iis上面 C# web项目怎么来???IIS作用 IIS怎么开启步骤一:打开控制面板->程序->启动或关闭windows 功能->找到**Internet Information Services**步骤二:勾选 web管理工具,http错误&…

超好用的工具类网站分享,打工人必备!

今天给大家推荐几个超好用的工具类网站,无论是工作还是生活中堪称打工人必备工具。 Background Maker https://colorkit.co/background-maker/82cedd-b04a0d-56d8a9/ 网站内置了 7 种不同风格的背景,如渐变色、波浪、低三角形等,非常适合用作…

基于梯度提升决策树的组合特征方法,《百面机器学习》学习笔记

《百面机器学习》学习笔记:基于梯度提升决策树的组合特征方法 基于梯度提升决策树的组合特征方法梯度提升决策树这里举一个例子来说明梯度提升决策树的思想方法假设对于某种类型的输入,经过上述介绍的梯度提升决策树构建流程得到的模型如下图所示 基于梯…

开源的表单系统效果怎么样?

当前,开源的表单系统得到了企业的重视和喜爱,因为它的简洁、灵活、便捷等优势特点,助力企业提质增效,各部门之间的协作沟通效率得到提升,数据资源也获得了有效整理和应用。今天,我们就一起来看看开源的表单…

不愧是腾讯 ,问的贼细

腾讯软件测试岗位的面试流程可能会因个人经验和公司而异,但通常情况下,腾讯软件测试的面试分为初试、二面、三面和四面。以下是每一轮面试可能涉及到的问题: 初试: 请介绍一下自己,以及为什么想要加入腾讯软件测试团…