3.用图神经网络进行图分类

news2024/11/27 0:28:38

       在本教程中,我们将更深入地了解如何将图神经网络(GNN)应用于图分类任务。图分类是指在给定图的数据集的情况下,基于一些结构图的属性对整个图(与节点相反)进行分类的问题。在这里,我们希望嵌入整个图,并且我们希望以这样一种方式嵌入这些图,即在手头有任务的情况下,它们是线性可分离的。

在这里插入图片描述
       图分类最常见的任务是分子性质预测,其中分子被表示为图,该任务可能是推断分子是否抑制HIV病毒复制。
       多特蒙德工业大学(The TU Dortmund University)收集了一系列不同的图分类数据集,称为TUDatasets,这些数据集也可以通过PyTorch Geometric中的torch_geometric.datasets.TUDataset 访问。让我们加载并检查其中一个较小的数据集,即MUTAG dataset

import torch
from torch_geometric.datasets import TUDataset

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

print()
print(f'Dataset: {dataset}:')
print('====================')
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]  # Get the first graph object.

print()
print(data)
print('=============================================================')

# Gather some statistics about the first graph.
print(f'Number of nodes: {data.num_nodes}')
print(f'Number of edges: {data.num_edges}')
print(f'Average node degree: {data.num_edges / data.num_nodes:.2f}')
print(f'Has isolated nodes: {data.has_isolated_nodes()}')
print(f'Has self-loops: {data.has_self_loops()}')
print(f'Is undirected: {data.is_undirected()}')

在这里插入图片描述
       该数据集提供了188个不同的图,任务是将每个图分类为两类中的一类。
       通过检查数据集的第一个图对象,我们可以看到它有17个节点(具有7维特征向量)和38条边(导致平均节点度为2.24)。它还只附带了一个图标签(y=[1]),并且除了以前的数据集之外,还提供了附加的4维边缘特征(edge_attr=[38,4])。然而,为了简单起见,我们不会使用这些。
       PyTorch Geometric为处理图形数据集提供了一些有用的实用程序,例如,我们可以对数据集进行打乱,并使用前150个图形作为训练图,同时使用其余的图形进行测试:

在这里插入图片描述

图形的小型批处理

       由于图分类数据集中的图通常很小,因此一个好主意是在将图输入到图神经网络之前对图进行批处理,以确保GPU的充分利用。在图像或语言领域,此过程通常通过将每个示例重新缩放或填充为一组大小相等的形状来实现,然后将示例分组为附加维度。该维度的长度等于小批量中分组的示例数,通常称为batch_size

       然而,对于GNN,上述两种方法要么不可行,要么可能导致大量不必要的内存消耗。因此,PyTorch Geometric选择了另一种方法来实现跨多个示例的并行化。这里,邻接矩阵以对角线的方式堆叠(创建一个包含多个孤立子图的巨型图),节点和目标特征在节点维度中简单地连接

在这里插入图片描述

       与其它batching程序相比,该程序具有一些关键优势:

  1. 依赖于消息传递方案的GNN运算符不需要修改,因为属于不同图的两个节点之间不交换消息。

  2. 没有计算或内存开销,因为邻接矩阵是以稀疏的方式保存的,只包含非零条目,即边缘。

       通过torch_geometric.data.DataLoader 类,PyTorch Geometric自动将多个图批处理为单个巨型图

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()

在这里插入图片描述
       这里,我们设置batch_size 为64,3个 (随机打乱的) mini-batches,一共 2 ⋅ 64 + 22 = 150 2 \cdot 64+22 = 150 264+22=150 个图.

       此外,每个 Batch 对象搭配一个batch 矢量, 其将每个节点映射到该批中的其各自的图:

batch = [ 0 , … , 0 , 1 , … , 1 , 2 , … ] \textrm{batch} = [ 0, \ldots, 0, 1, \ldots, 1, 2, \ldots ] batch=[0,,0,1,,1,2,]

训练一个图神将网络(GNN)

训练用于图分类的GNN通常遵循一个简单的方案:

  1. 通过执行多轮消息传递嵌入每个节点
  2. 将节点嵌入聚合到统一图嵌入中 (readout layer)
  3. 在图嵌入上训练最终分类器

文献中存在多个readout layer,但最常见的是简单地取节点嵌入的平均值:
x G = 1 ∣ V ∣ ∑ v ∈ V x v ( L ) \mathbf{x}_{\mathcal{G}} = \frac{1}{|\mathcal{V}|} \sum_{v \in \mathcal{V}} \mathcal{x}^{(L)}_v xG=V1vVxv(L)

       PyTorch Geometric通过torch_geometric.nn.global_mean_pool提供了该功能,其考虑小批处理中所有节点的节点嵌入和分配向量批处理,以针对批处理中的每个图计算大小为[batch_size, hidden_channels] 的图嵌入。

       将GNN应用于图分类任务的最终架构如下所示,并允许进行完整的端到端训练:

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


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):
        # 1. Obtain node embeddings 
        x = self.conv1(x, edge_index)
        x = x.relu()
        x = self.conv2(x, edge_index)
        x = x.relu()
        x = self.conv3(x, edge_index)

        # 2. Readout layer
        x = global_mean_pool(x, batch)  # [batch_size, hidden_channels]

        # 3. Apply a final classifier
        x = F.dropout(x, p=0.5, training=self.training)
        x = self.lin(x)
        
        return x

model = GCN(hidden_channels=64)
print(model)

在这里插入图片描述
       在这里,在我们最终分类器应用于图形读出层的顶部之前,我们再次使用GCNConv ,用 R e L U ( x ) = max ⁡ ( x , 0 ) \mathrm{ReLU}(x) = \max(x, 0) ReLU(x)=max(x,0)获得局部的节点嵌入激活。

       让我们对我们的网络进行几个时期的训练,看看它在训练和测试集上的表现如何:

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

from torch_geometric.utils import to_networkx

def train():
    model.train()

    for data in train_loader:  # Iterate in batches over the training dataset.
        
        # G = to_networkx(data, to_undirected=True)
        # visualize_graph(G)
        
        out = model(data.x, data.edge_index, data.batch)  # Perform a single forward pass.
        loss = criterion(out, data.y)  # Compute the loss.
        loss.backward()  # Derive gradients.
        optimizer.step()  # Update parameters based on gradients.
        optimizer.zero_grad()  # Clear gradients.

def test(loader):
    model.eval()

    correct = 0
    for data in loader:  # Iterate in batches over the training/test dataset.
        out = model(data.x, data.edge_index, data.batch)  
        pred = out.argmax(dim=1)  # Use the class with highest probability.
        correct += int((pred == data.y).sum())  # Check against ground-truth labels.
    return correct / len(loader.dataset)  # Derive ratio of correct predictions.


for epoch in range(181):
    train()
    train_acc = test(train_loader)
    test_acc = test(test_loader)
    if epoch % 20 == 0:
        print(f'Epoch: {epoch:03d}, Train Acc: {train_acc:.4f}, Test Acc: {test_acc:.4f}')

在这里插入图片描述
       可以看出,我们的模型达到了大约84%的测试准确率
       准确性波动的原因可以用相当小的数据集(只有38个测试图)来解释,并且一旦将GNN应用于较大的数据集,通常就会消失。

本文内容参考:PyG官网

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

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

相关文章

uniapp:HbuildeX项目实现jenkins自动化打包上传

前序: 基于HBuilderX创建的项目。 配置uniapp 指令式打包APP、微信小程序、H5。 ubuntu系统上的jenkins部署基础指令,发送给windows服务器上,windows服务器使用HBuilderX软件的cli.exe执行相关cli命令打包,然后jenkins再调用接口下载打包后的文件。 可实现多线程同时打…

社会主义核心价值观解码

今天随机刷题时,遇到了一个蛮有意思的题,浅浅记录一下,挺好玩的。 题目: [鹤城杯 2021]easy_crypto 难度:很小啦,差不多签到题 文件下载的内容如下: 最开始我以为是把每个词按社会主义那个顺序…

Java基础学习+面向对象

一,基础概念介绍 1.1Java跨平台原理(一次编译,处处运行) Java 源代码经过编译,生成字节码文件,交由 Java 虚拟机来执行,不同得系统有不同得JVM,借助JVM 实现跨平台。就比如说我们在 Windows 下…

Redis内存优化——内存淘汰及回收机制

文章目录 Redis内存优化——内存淘汰及回收机制内存淘汰策略LRU和LFULRU和Redis的近似LRU什么是LRURedis的近似LRU LFU如何选择 内存回收策略惰性删除定期删除 配置文件说明总结 系列文章目录 本文是系列文章,为了增强您的阅读体验,已将系列文章目录放入…

Yakit: 集成化单兵安全能力平台使用教程·MITM交互式劫持篇

Yakit: 集成化单兵安全能力平台使用教程MITM交互式劫持篇 1.免配置抓包2.拦截HTTPS的消息3.代理和浏览器设置4.内容规则:标记/替换流量5.过滤流量6.网站树视角1.免配置抓包 点击手工测试--MITM交互式劫持即可进入MITM劫持页面,点击免配置启动进入免配置启动设置界面(这类似…

ESP32-C2-12模组 使用乐鑫AT固件示例

ESP32C2 AT固件使用 ESP32 C2模组,如图1-1所示 图1-1 ESP32 C2模组 ESP32 C2开发板,如图1-2所示 图1-2 ESP32 C2开发 方案亮点 1、完整的 WiFi 子系统,符合 IEEE 802.11b/g/n 协议,具有 Station 模式、SoftAP 模式、SoftAP Stat…

vue3+uniapp开发小程序踩坑指南(持续更新)

小程序常见问题汇总: 1、TypeError: Cannot read property forceUpdate of undefined 原因:没有配置小程序AppID 2、define is not defined 报错一堆文件找不到,并且有define is not defined错误提示 原因:没有配置基础库或者基…

Linux安装Nginx并部署前端项目【内/外网-保姆级教程】

目录 1下载所需要的安装包 2安装步骤 2.1将下载的完整文件夹通过压缩包的形式,上传到你的路径下解压. 2.2 进入到gcc文件夹下,执行命令: 2.3进入到gcc-c文件夹下,执行命令: 2.4检查gcc、gcc-c是否安装成功 2.5执…

【深度学习】日常笔记

一开始感觉学习方向有点飘忽不定,后面查找资料和思考,发现其实图神经网络、异构图、推荐系统这三者的概念其实是相通,紧密联系的。推荐系统是指根据用户历史行为和偏好,为用户提供个性化的商品或服务推荐。而在推荐系统中&#xf…

公司新来个以前拿 20K 出来的,让我见识到了什么叫真正的测试天花板....

今天上班开早会就是新人见面仪式,听说来了个很厉害的大佬,年纪还不大,是上家公司离职过来的,薪资已经达到中高等水平,很多人都好奇不已,能拿到这个薪资应该人不简单,果然,自我介绍的…

HCIE-Cloud Computing LAB备考第二步:实战解题–第五题:论述一--双活容灾设计--记忆宫殿

文章目录 题目解法记忆宫殿存储链路要求存储业务网络链路存储复制网络链路仲裁网络链路 VRM要求主机要求存储要求 对比法存储业务网络链路和存储复制网络链路VRM和主机要求 提炼法 题目 完成FC双活设计,交由工程师搭建。为达到预期效果请把以下要求罗列出来&#x…

一文带你进入自动化测试

8年前我刚进入到IT行业,现在发现学习软件测试的人越来越多,今天我想根据自己的行业经验给大家提一些建议。 最近聊到软件测试的行业内卷,越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会,不断提升自己的技能栈成了…

001网络模型与socket的介绍

我们平常使用的程序(或者说软件)一般都是通过应用层来访问网络的,程序产生的数据会一层一层地往下传输,直到最后的网络接口层,就通过网线发送到互联网上去了。数据每往下走一层,就会被这一层的协议增加一层…

chatgpt赋能python:Python如何写配置文件-一种简单的方法

Python 如何写配置文件 - 一种简单的方法 在Python编程中,配置文件是必不可少的,因为它们允许我们在代码中保持所有可配置属性,而不是在代码中写死它们。这样,我们可以很容易地更改我们的应用程序的行为,而不必更改代…

MySQL从入门到快速上手

文章目录 第一章 了解SQL第二章 检索数据第三章 排序第四章 过滤数据第五章 高级数据过滤第六章 多表查询内连接(交集)外连接多表连接UNIONUNION ALL 第七章 单行函数日期和时间函数获取日期、时间日期与时间戳的转换获取月份、星期、星期数、天数等函数…

Banana Pi BPI-Wifi6路由器采用创耀科技TR6560/TR5220 wifi芯片方案设计,支持PoE网络供电

香蕉派BPI-Wifi6路由器设计采用了创耀科技TR6560 TR5220 wifi无线芯片设计,是一款标准的wifi6路由器解决方案。内置高性能双核ARM Cortec A9处理器,用于WIFI消息转发或智能业务处理,内置高性能LSW和硬件NAT,最大支持5Gbps的报文转…

Python 写Android App性能:入门到高级

引言 Android性能测试是移动应用开发的关键部分。无论是响应时间,内存使用,CPU占用,还是电池消耗,性能的每个方面都直接影响到用户体验。在这篇文章中,我们将介绍如何使用Python进行Android性能测试,从入门…

怎么样正确的看待档案室的八防环境监控系统

历史文化遗产是无价之宝,而如何保护它们却是一项永恒的任务。近日,盛世宏博推出了八防环境监控系统,让人惊叹不已!这个系统不仅能够实时监测温度、湿度、光照等多项指标,还能进行预警和自动调节,保障资料的…

【H5】avalon前端数据双向绑定

系列文章 C#底层库–记录日志帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍二、项目源码2.1 绑定text输入框2.2 绑定select下拉框2.3 绑定radio单选按钮2.4 不使用双向绑定处理方式 三、效果展…

分布式锁工具Redisson

一、Redisson概述 二、分布式锁 三、Redisson分布式锁 四、RLock 五、公平锁 六、总结 一、Redisson概述 什么是Redisson? Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式…