图神经网络(三):节点分类

article/2025/9/21 20:25:10

节点分类问题

数据集:Cora
包含七类学术论文,论文与论文之间存在引用和被引用的关系

数据集导入

from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeaturesdataset=Planetoid(root='dataset',name='Cora',transform=NormalizeFeatures())
data=dataset[0]
print(data)

Data(edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])

打印数据集信息

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 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'Number of training nodes: {data.train_mask.sum()}')
print(f'Training node label rate: {int(data.train_mask.sum()) / data.num_nodes:.2f}')
print(f'Contains isolated nodes: {data.contains_isolated_nodes()}')
print(f'Contains self-loops: {data.contains_self_loops()}')
print(f'Is undirected: {data.is_undirected()}')

Dataset: Cora():
Number of graphs: 1
Number of features: 1433
Number of classes: 7

Data(edge_index=[2, 10556], test_mask=[2708], train_mask=[2708], val_mask=[2708], x=[2708, 1433], y=[2708])
Number of nodes: 2708
Number of edges: 10556
Average node degree: 3.90
Number of training nodes: 140
Training node label rate: 0.05
Contains isolated nodes: False
Contains self-loops: False
Is undirected: True

节点分类图打印

import matplotlib.pyplot as plt
from sklearn.manifold import TSNEdef visualize(h, color):z = TSNE(n_components=2).fit_transform(out.detach().cpu().numpy())plt.figure(figsize=(10,10))plt.xticks([])plt.yticks([])plt.scatter(z[:, 0], z[:, 1], s=70, c=color, cmap="Set2")plt.show()

MLP分类

import torch.nn.functional as F
import torch
from torch.nn import Linearclass MLP(torch.nn.Module):def __init__(self,hidden_channels):super(MLP,self).__init__()torch.manual_seed(12345)#为GPU设置种子self.lin1=Linear(dataset.num_features,hidden_channels)self.lin2=Linear(hidden_channels,dataset.num_classes)def forward(self,x):x=self.lin1(x)x=x.relu()x=F.dropout(x,p=0.5,training=self.training)x=self.lin2(x)return xmodel=MLP(hidden_channels=16)
print(model)

训练和测试

criterion = torch.nn.CrossEntropyLoss()  # 交叉熵
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)  # 优化器def train():model.train()optimizer.zero_grad()  # 梯度清0out = model(data.x)  # x的节点表征作为输入loss = criterion(out[data.train_mask], data.y[data.train_mask])  # 计算损失loss.backward()  # Derive gradients.optimizer.step()  # Update parameters based on gradients.return lossfor epoch in range(1, 201):loss = train()print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')
def test():model.eval()out=model(data.x)pred=out.argmax(dim=1)test_correct=pred[data.test_mask]==data.y[data.test_mask]test_acc=int(test_correct.sum())/int(data.test_mask.sum())return test_acc
test_acc=test()
print(f'accuracy: {test_acc:.4f}')

准确率:0.59

打印


model.eval()out = model(data.x)
visualize(out, color=data.y)

在这里插入图片描述

GCN

from torch_geometric.nn import GCNConvclass GCN(torch.nn.Module):def __init__(self,hidden_channels):super(GCN,self).__init__()self.conv1=GCNConv(dataset.num_features,hidden_channels)self.conv2=GCNConv(hidden_channels,dataset.num_classes)def forward(self,x,edge_index):x = self.conv1(x, edge_index)x = x.relu()x = F.dropout(x, p=0.5, training=self.training)x = self.conv2(x, edge_index)return xmodel = GCN(hidden_channels=16)
print(model)

训练和测试

criterion = torch.nn.CrossEntropyLoss()  # 交叉熵
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)  # 优化器
def train():model.train()x,edge_index=data.x,data.edge_indexoptimizer.zero_grad()out=model(x,edge_index)loss=criterion(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()return loss
for epoch in range(1,201):loss=train()print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')
def test():model.eval()out = model(data.x, data.edge_index)pred = out.argmax(dim=1)  # Use the class with highest probability.test_correct = pred[data.test_mask] == data.y[data.test_mask]  # Check against ground-truth labels.test_acc = int(test_correct.sum()) / int(data.test_mask.sum())  # Derive ratio of correct predictions.return test_acc
test_acc = test()
print(f'Test Accuracy: {test_acc:.4f}')

准确率:0.826

打印

model.eval()
out=model(data.x,data.edge_index)
visualize(out,color=data.y)

在这里插入图片描述

GAT

from torch_geometric.nn import GATConvclass GCN(torch.nn.Module):def __init__(self,hidden_channels):super(GAT,self).__init__()self.conv1=GATConv(dataset.num_features,hidden_channels)self.conv2=GATConv(hidden_channels,dataset.num_classes)def forward(self,x,edge_index):x = self.conv1(x, edge_index)x = x.relu()x = F.dropout(x, p=0.5, training=self.training)x = self.conv2(x, edge_index)return xmodel = GAT(hidden_channels=16)
print(model)

训练和测试

criterion = torch.nn.CrossEntropyLoss()  # 交叉熵
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)  # 优化器
def train():model.train()x,edge_index=data.x,data.edge_indexoptimizer.zero_grad()out=model(x,edge_index)loss=criterion(out[data.train_mask],data.y[data.train_mask])loss.backward()optimizer.step()return loss
for epoch in range(1,201):loss=train()print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')
def test():model.eval()out = model(data.x, data.edge_index)pred = out.argmax(dim=1)  # Use the class with highest probability.test_correct = pred[data.test_mask] == data.y[data.test_mask]  # Check against ground-truth labels.test_acc = int(test_correct.sum()) / int(data.test_mask.sum())  # Derive ratio of correct predictions.return test_acc
test_acc = test()
print(f'Test Accuracy: {test_acc:.4f}')

准确率:0.755

打印

model.eval()
out=model(data.x,data.edge_index)
visualize(out,color=data.y)

在这里插入图片描述

总结

本次主要是学习pyg中内置的一些图网络的使用,但是想要深挖其中的原理,还是需要从源码入手,已经通过消息传递机制来构建自己的图网络。


http://chatgpt.dhexx.cn/article/NPCKVxQx.shtml

相关文章

基于图神经网络的节点表征

我们使用图神经网络来生成节点表征,并通过基于监督学习的对图神经网络的训练,使得图神经网络学会产生高质量的节点表征。高质量的节点表征能够用于衡量节点的相似性,同时高质量的节点表征也是准确分类节点的前提。 在节点预测任务中&#xf…

sg、xb分析

文章目录 流程分析远程调用本地调用分析结果 甚感欣慰,系统的写一下教程,希望能够帮助到大家。 流程分析 第一步,分析流程。 通过堆栈信息点到源码中并断点。 apply方法能劫持另外一个对象的方法,继承另外一个对象的属性 apply方…

Intel SGX入坑必读——《Intel SGX Explained》(个人翻译,持续更新中)

写在最前 入坑Intel SGX之前先打好基础。《Intel SGX Explained》就是入坑必读之一,有助于理解Intel SGX的原理。这里仅作个人翻译,便于加深理解,也方便感兴趣的小伙伴一起学习交流。 原文下载地址:《Intel SGX Explained》原文 …

Intel SGX入门(一)——背景篇

为什么要Intel SGX? 以云环境为例子,云租户会将自己的产品部署在云平台中,但是云平台现在普遍认为是一个不可信的地方,因为可能会有云平台管理者、同一云主机其他租户的恶意攻击,也可能云平台本身存在漏洞&#xff0c…

windows下使用SGX

前言: 这个是简单对于毫无经验的人的入门博客,杠精勿扰,大神离开。 我觉得每当下载一个新的工具的时候要先看一看他自己带的文档。 何谓SGX?不解释,您可以去看其介绍,百度搜搜即可。 win10如何下载SGX&a…

Intel SGX学习笔记(1):虚拟机Ubuntu20.04配置Intel SGX环境

写在前面 本教程仅仅适用虚拟机下的Ubuntu20.04配置Intel SGX环境,若是双系统下的Ubuntu系统,请看最后的参考连接。若是window10自带的ubuntu,也就是从微软商店下载的ubuntu系统,这个我到make preparation指令就开始疯狂报错&…

Windows10下使用Intel SGX功能(四):SGX技术分析

参考文献 Overview of Intel SGX - Part 1, SGX InternalsDeveloper Guide: Intel Software Guard Extensions (Intel SGX)(最新版)Overview of Intel SGX - Part 2, SGX Externals SGX 介绍 SGX 发展情况 SGX技术目前已经发展到SGX2。比如安全证明功…

可信启动、安全启动:SGX、TrustZone、SecureEnclave

最近在公众号上看到了一篇文章,算是又丰富了自己的安全方面的眼界。 最近看公众号取代了小视频、知乎这些东西。以前是真的不喜欢碎片化的东西,看什么学什么总是要找到书籍。但是这样的做法太过的极端,因为有时候有些事是两面性的。比如像安全…

Intel SGX 技术初探

最近公司需要开发一款使用intel 的移动终端,需要用到SGX技术,特此将调研和整理的相关资料放置于下,欢迎交流。 一、SGX技术背景 1.1 SGX技术定义 SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系…

Intel SGX入门(二)——SGX应用篇

大概了解SGX以后,SGX应用有哪些? 第一种,SGX应用于服务器端,云端 这一类个人觉得很需要结合代码、它们所描述的行业需求和以前的行业产品去考虑问题,毕竟是应用,不然可能体会不到精髓。 我对SGX应用的理解…

Intel SGX Explained

文章目录 SGX新增Abstract第一章 概括1.1 SGX简介1.2 大纲和问题发现 第二章 Intel体系架构背景知识2.1 Overview2.2 计算模型2.3 软件权限级别2.4 地址空间2.5 地址转换2.5.1 地址转换概念2.5.2 地址转换和虚拟化2.5.3 页表属性 2.6 执行上下文2.7 段寄存器2.8 特权级别转换2.…

sgx使用记录(Windows开发环境搭建以及sgx的简单介绍)1

sgx使用记录 相关代码仓库 ##sgx-sdk https://github.com/apache/incubator-teaclave-sgx-sdk.git##Teaclave:通用安全计算平台 https://github.com/apache/incubator-teaclave检测sgx运行环境是否支持 ##或使用cpuid命令 cpuid |grep -i sgx##或使用脚本测试 下…

Windows10下使用Intel SGX功能(一):环境搭建

文章目录 参考文献系统要求一、安装Open Enclave SDK 环境(一)什么是Open Enclave SDK(二)启动SGX功能方法一: BIOS启动方法二:软件方式启动 (三)安装必要环境(1&#xf…

Intel SGX 功能如何开启

Intel SGX 功能如何开启 我本身是 Windows10 系统, BIOS 是 ASUS 的,在想装 Ubuntu 双系统的时候,在启动 Ubuntu 安装 ISO 的时候提示说电脑的 SGX 没有开启,安装失败,安装界面都没有进去。 之后搜了下如何开启 SGX&a…

SGX的内部组件概述

导语:SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)…

SGX入门

如何设计SGX程序: SGX分为可信部分和不可信部分,可信部分由enclave组成(一个应用程序可以拥有一个或多个enclave),enclave存储在加密的内存中,受SGX保护,enclave一旦被建立就不能更改,所以通常…

SGX Enable

根据INTEl的官方建议, 目前的电脑主板在BIOS设置上只保留了Disabled和Software Controlled来开启和关闭SGX扩展 使用Software Controlled开关的原因官方文档有阐述,如下: 开启SGX扩展,首先需要满足以下要求: CPU具有…

Intel SGX技术详细解释(非常棒)

http://www.jos.org.cn/html/2018/9/5594.htm#b18 随着信息技术的迅速发展与广泛应用, 人类社会已经进入了一个崭新的互联网时代.一方面, 人们享受着互联网科技带来的便利; 另一方面, 由网络和信息系统构成的网络空间也面临着日益严峻的安全问题.信任是网络空间中安全交互的基…

SGX问答

0 前言 有些问题比较常见,在这里直接将问答内容贴出来,方便大家搜索。有空再重新组织文字。 (我会避免泄露私人信息) 1 内存地址翻译全部交给os,那中间经过cache也是全部交给os是嘛?这个cache这部分&…

小谈Intel SGX

目录 Intel SGX简介 背景 为什么要Intel SGX? Intel SGX尚处于学术讨论 Intel SGX和可信启动什么关系? 开发者眼中SGX长什么样子? SGX访问控制是什么? MEE与SGX EPC内存加密 CPU里面SGX长什么样子? 有Enclav…