组队学习-图神经网络 Taks 03

【图神经网络基础】认识数据集--同质数据集CiteSeer CiteSeer 数据集由学术论文组成,每篇论文被视为一个节点,引用关系被视为边。该数据集包含六个类别的论文,每个节点都带有特征向量和标签。数据集的主要任务是根据节点的特征和图结构对节点进行分类。 阅读详情

1、知识梳理

1.1 图卷积神经网络

GCN数学定义为:$$\mathbf{X}^{\prime} = \mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}}\mathbf{\hat{D}}^{-1/2} \mathbf{X} \mathbf{\Theta},$$
\mathbf{\hat{D}}^{-1/2} \mathbf{\hat{A}}\mathbf{\hat{D}}^{-1/2}是对称归一化矩阵,它的节点式表述为:$$\mathbf{x}^{\prime}_i = \mathbf{\Theta} \sum_{j \in \mathcal{N}(v) \cup\{ i \}} \frac{e_{j,i}}{\sqrt{\hat{d}_j \hat{d}_i}} \mathbf{x}_j$$.

1.2 图注意力神经网络

定义:$$\mathbf{x}^{\prime}_i = \alpha_{i,i}\mathbf{\Theta}\mathbf{x}_{i} +\sum_{j \in \mathcal{N}(i)} \alpha_{i,j}\mathbf{\Theta}\mathbf{x}_{j},$$

$$\alpha_{i,j} =\frac{\exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top}[\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_j]\right)\right)}{\sum_{k \in \mathcal{N}(i) \cup \{ i \}}\exp\left(\mathrm{LeakyReLU}\left(\mathbf{a}^{\top}[\mathbf{\Theta}\mathbf{x}_i \, \Vert \, \mathbf{\Theta}\mathbf{x}_k]\right)\right)}.$$

2、使用[PyG中不同的图卷积模块在[PyG的不同数据集]上实现节点分类或回归任务。

2.1 数据获取

      本次实验使用citeseer数据集,Citeseer数据集来自CiteSeer数据库,行代表科学论文,每个属性表示一个作者。共有3327个节点,9104条边,3703个属性,分为6个类。

from torch_geometric.datasets import Planetoid
from torch_geometric.transforms import NormalizeFeatures

dataset = Planetoid(root='data/Planetoid', name='citeseer', transform=NormalizeFeatures())

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: citeseer():
======================
Number of graphs: 1
Number of features: 3703
Number of classes: 6

Data(edge_index=[2, 9104], test_mask=[3327], train_mask=[3327], val_mask=[3327], x=[3327, 3703], y=[3327])
======================
Number of nodes: 3327
Number of edges: 9104
Average node degree: 2.74
Number of training nodes: 120
Training node label rate: 0.04
Contains isolated nodes: True
Contains self-loops: False
Is undirected: True

2.2 MLP 分类

import torch
from torch.nn import Linear
import torch.nn.functional as F


class MLP(torch.nn.Module):
    def __init__(self, hidden_channels):
        super(MLP, self).__init__()
        torch.manual_seed(12345)
        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 x

model = MLP(hidden_channels=16)
print(model)
model = MLP(hidden_channels=16)
criterion = torch.nn.CrossEntropyLoss()  # Define loss criterion.
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)  # Define optimizer.

def train():
  model.train()
  optimizer.zero_grad()  # Clear gradients.
  out = model(data.x)  # Perform a single forward pass.
  loss = criterion(out[data.train_mask], data.y[data.train_mask])  # Compute the loss solely based on the training nodes.
  loss.backward()  # Derive gradients.
  optimizer.step()  # Update parameters based on gradients.
  return loss

for epoch in range(1, 201):  
  loss = train()
  if epoch % 10 == 0:
    print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')
Epoch: 010, Loss: 1.7279
Epoch: 020, Loss: 1.5793
Epoch: 030, Loss: 1.4126
Epoch: 040, Loss: 1.1490
Epoch: 050, Loss: 1.0015
Epoch: 060, Loss: 0.8061
Epoch: 070, Loss: 0.7439
Epoch: 080, Loss: 0.5477
Epoch: 090, Loss: 0.5127
Epoch: 100, Loss: 0.5078
Epoch: 110, Loss: 0.4658
Epoch: 120, Loss: 0.4191
Epoch: 130, Loss: 0.4491
Epoch: 140, Loss: 0.4426
Epoch: 150, Loss: 0.4146
Epoch: 160, Loss: 0.4921
Epoch: 170, Loss: 0.3707
Epoch: 180, Loss: 0.3892
Epoch: 190, Loss: 0.4187
Epoch: 200, Loss: 0.3789
def test():
  model.eval()
  out = model(data.x)
  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}')

Test Accuracy: 0.5820

2.3 GCN图节点分类器

# 训练GCN图节点分类器
model = GCN(hidden_channels=16)
optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
criterion = torch.nn.CrossEntropyLoss()

def train():
  model.train()
  optimizer.zero_grad()  # Clear gradients.
  out = model(data.x, data.edge_index)  # Perform a single forward pass.
  loss = criterion(out[data.train_mask], data.y[data.train_mask])  # Compute the loss solely based on the training nodes.
  loss.backward()  # Derive gradients.
  optimizer.step()  # Update parameters based on gradients.
  return loss

for epoch in range(1, 201):
  loss = train()
  if epoch % 10 == 0:
    print(f'Epoch: {epoch:03d}, Loss: {loss:.4f}')


Epoch: 010, Loss: 1.7346
Epoch: 020, Loss: 1.6497
Epoch: 030, Loss: 1.5451
Epoch: 040, Loss: 1.4200
Epoch: 050, Loss: 1.2842
Epoch: 060, Loss: 1.1571
Epoch: 070, Loss: 1.0097
Epoch: 080, Loss: 0.9321
Epoch: 090, Loss: 0.8222
Epoch: 100, Loss: 0.7701
Epoch: 110, Loss: 0.7429
Epoch: 120, Loss: 0.7004
Epoch: 130, Loss: 0.6668
Epoch: 140, Loss: 0.6407
Epoch: 150, Loss: 0.5929
Epoch: 160, Loss: 0.6033
Epoch: 170, Loss: 0.5322
Epoch: 180, Loss: 0.5230
Epoch: 190, Loss: 0.5473
Epoch: 200, Loss: 0.4934
# 测试GCN图节点分类器
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}')

Test Accuracy: 0.7120

2.4 构造GAT节点分类神经网络

# 构造GAT节点分类神经网络
import torch
from torch.nn import Linear
import torch.nn.functional as F

from torch_geometric.nn import GATConv

class GAT(torch.nn.Module):
  def __init__(self, hidden_channels):
    super(GAT, self).__init__()
    torch.manual_seed(12345)
    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 x

Epoch: 010, Loss: 1.7339
Epoch: 020, Loss: 1.6383
Epoch: 030, Loss: 1.5224
Epoch: 040, Loss: 1.3374
Epoch: 050, Loss: 1.1420
Epoch: 060, Loss: 0.9853
Epoch: 070, Loss: 0.7943
Epoch: 080, Loss: 0.6670
Epoch: 090, Loss: 0.5781
Epoch: 100, Loss: 0.5379
Epoch: 110, Loss: 0.4792
Epoch: 120, Loss: 0.4451
Epoch: 130, Loss: 0.3572
Epoch: 140, Loss: 0.3719
Epoch: 150, Loss: 0.3148
Epoch: 160, Loss: 0.3107
Epoch: 170, Loss: 0.3433
Epoch: 180, Loss: 0.2881
Epoch: 190, Loss: 0.2794
Epoch: 200, Loss: 0.2010
# 测试GAT图节点分类器
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}')

Test Accuracy: 0.6100

2.5 对比分析

      以上训练结果克制,GCN的效果最好,GAT的效果次之,MLP的效果最差。下图依次为原始节点的投影图,GCN训练后的分布图和GAT训练后的分布图。

 

GNN图神经网络常用数据集总结 图神经网络(Graph Neural Network,GNN)是一种新兴的神经网络模型,适用于处理图数据。与传统的神经网络模型不同,GNN 能够有效地捕捉节点之间的结构信息和关系,并对节点进行精准的分类、聚类和预测分析。因此,GNN 在社交网络、生物信息学、推荐系统、物联网等领域得到了广泛的应用。为了研究和评估 GNN 的性能,需要使用各种不同类型的数据集。这些数据集包含了不同领域的实际问题,例如社交网络中的用户关系、生物学中的蛋白质分子结构、推荐系统中的用户行为等。 阅读详情

相关推荐

图网络常用数据集总结——Cora, CiteSeer, PubMed, PPI, BlogCatalog, Yelp

Cora数据集(引文网络)由机器学习论文组成,是近年来图深度学习很喜欢使用的数据集。该数据集共2708个样本点,每个样本点都是一篇科学论文,所有样本点被分为8个类别,类别分别是: 1)基于案例;2)遗传算法;3)神经网络;4)概率方法;5)强化学习;6)规则学习;7)理论 每篇论文都由一个1433维的词向量表示,所以,每个样本点具有1433个特征。词向量的每个元素都对应一个词,且该元素只有0或1两个取值。取0表示该元素对应的词不在论文中,取1表示在论文中。所有的词来源于一个具有1433个词的字典。 每篇论文

weixin_43580130的博客 2万+

图数据集Planetoid御三家:Cora,CiteSeer,PubMed详解

本文介绍经典图数据集:Cora,CiteSeer,PubMed

诸神缄默不语的博客 2万+

Dropout 学习记录

参考: 深度学习中Dropout原理解析https://blog.youkuaiyun.com/program_developer/article/details/80737724 目录 1为什么要用 Dropout? 2 什么是 Dropout? 步骤: (1)训练阶段: (2)在测试模型阶段 3. Dropout为什么可以解决过拟合? 4 Dropout注意事项? 4.1 缩放 ...

bl128ve900的博客 1535

Python:主成分分析PCA手写代码

import numpy as np from sklearn.decomposition import PCA from sklearn import datasets y = np.array([[1,5,6],[4,3,9],[4,2,9],[4,7,2]]) # 四行三列 def pca(X,k): n,m = X.shape mean = np.mean(X,axi...

DeniuHe的博客 1641

PyG利用GAT实现Cora、Citeseer、Pubmed引用论文节点分类

本专栏内包含基于GNN的项目实战案例(PyG实现),以及研究多年遇到的问题和一些总结与注意事项,理论与实践相结合,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1682

PyG利用GCN实现Cora、Citeseer、Pubmed引用论文节点分类

本专栏内包含基于GNN的项目实战案例(PyG实现),以及研究多年遇到的问题和一些总结与注意事项,理论与实践相结合,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1686

Datawhale组队学习-图神经网络(三)

Datawhale组队学习-图神经网络(三) Taks 03 基于图神经网络的节点表征学习 此次学习分为以下步骤: 获取并分析数据集、构建一个方法用于分析节点表征的分布。 学习MLP神经网络的理论,观察MLP神经网络用于节点分类的表现,观察基于MLP神经网络学习到的节点表征的分布。 学习GCN, GAT这两个图神经网络的理论,对比它们在节点分类任务中的表现以及它们学习到的节点表征的质量。 比较MLP,GCN,GAT在节点表征学习能力上的差异。 一、准备工作 获取并分析数据集 from torch_geo

weixin_39188290的博客 333

citeseer数据

CiteSeer 上的数据集,一般用来做数据挖掘

组队学习-图神经网络 Taks 05

尝试将数据集切分成不同数量的簇进行实验,然后观察结果并进行比较。 1、设置num_parts=1500 cluster_data = ClusterData(data, num_parts=1500, recursive=False, save_dir=dataset.processed_dir) train_loader = ClusterLoader(cluster_data, batch_size=20, shuffle=True, ..

shell的专栏 646

Citeseer-数据集

深入解析ADC采样电容:从充电误差到LSB精度的关键设计

本文深入解析了ADC采样电容在模数转换中的核心作用,重点探讨了充电时间常数与采样误差的博弈关系。通过推导最小采样时间公式,揭示了精度、速度、源阻抗与内部电容之间的制约关系,并提供了从理论计算到外部驱动电路设计的实战指南,是确保ADC达到LSB精度的关键。

android的专栏 1103

Python机器学习实验二:1.编写代码,实现对iris数据集的KNN算法分类及预测

Python机器学习实验二:编写代码,实现对iris数据集的KNN算法分类及预测 1、编写代码,实现对iris数据集的KNN算法分类及预测,要求: (1)数据集划分为测试集占20%; (2)n_neighbors=5; (3)评价模型的准确率; (4)使用模型预测未知种类的鸢尾花。 import numpy as np from sklearn.model_selection import train_test_split from sklearn.datasets import load_iris fro

于笨笨的博客 4770

实战指南:如何用DCCRN模型提升语音增强效果(附代码示例)

本文提供了基于DCCRN模型进行语音增强的实战指南。通过深入解析复数网络如何协同处理语音的幅度与相位信息,并附有完整的PyTorch代码实现,帮助开发者从数据准备、模型搭建到训练调优,构建高效的实时语音增强系统,有效提升嘈杂环境下的语音清晰度。

weixin_29054245的博客 478

GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式

文章目录Cora、Citeseer、Pubmed以Cora为例数据格式示例Tox21 数据集 本文分享一下图卷积网络GCN里用到的一些数据集的格式 Cora、Citeseer、Pubmed 数据集 来源 #图 #节点 #边 #特征 #标签(y) Cora “Collective classification in network data,” AI magazine,2008 1 ...

知行合一,止于至善 4万+

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

信号完整性之阻抗(五)

一、什么是阻抗 阻抗的概念是从高中或者初中大家可能就会接触到,没想它一直陪伴我十年了。在我的印象中,提到阻抗我可能就会想到电阻,这样的思想局限也限制了我平常思考问题。所以今天也想把阻抗这个概念在顺理一遍,有错误或者欠缺的地方希望大家指正。 1.什么是阻抗: ==在具有电阻、电感和电容的电路里,对电路中的电流所起的阻碍作用叫做阻抗。阻抗常用Z表示,是一个复数,实部称为电阻,虚部称为电抗,其中电容在电路中对交流电所起的阻碍作用称为容抗 ,电感在电路中对交流电所起的阻碍作用称为感抗,电容和电感在电路中对交流电引

刘小同学的博客 2587

Citeseer数据集最快捷处理方式

Citeseer数据集有两个文件:.cites文件(节点关系)和.content文件(节点特征信息)。 主要出现的问题就是原本应该有3327个节点但是content文件中只有3312个节点信息,最简单的处理方式就是把cites文件中这多出的15个节点删掉就行。 197556 ghani01hypertext 38137 95786 nielsen00designing flach99database khardon99relational kohrs99using raisamo99evaluatin

qq_42192641的博客 2605

基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现

本文详细介绍基于ESP32与PCM5102的WiFi无损音频传输系统设计与实现。通过I2S接口直接传输PCM数据,避免SRC重采样,实现真正的HIFI级音质。涵盖硬件连接、软件架构、网络传输优化及实际音质对比,为音频爱好者提供高性价比的无损无线音频解决方案。

rnn9storyteller的博客 948

数据集整理

可选用的数据集主要包括Cora、Citeseer、DBLP三类。 DBLP数据集用XML描述,字段信息包括:author、title、pages、year、booktitle、url、crossref、publisher、ee、cdrom、isbn、cite_label等。其中作者名属性信息的格式是统一的,处理比较方便。目前,DBLP对作者重名问题的处理已经有不错的效果。例如:输入一作者名“...

ANNA 1421

Python 实战:手语翻译系统——从视频到文本的智能转换

今天,我们用 Python 构建了一个。

Echo_Wish 344

【深度学习新浪潮】近三年垂域大模型研究与产品进展全景洞察(2022-2025)

近三年来,垂域大模型完成了从技术探索到产业落地的关键跨越,在多个行业实现效率提升与价值创造。面对数据治理、技术适配、生态建设等挑战,未来需要通过技术创新、标准制定、人才培养等多维度发力,推动垂域大模型向更高效、更可靠、更普惠的方向发展。随着"人工智能+"行动的深入推进,垂域大模型将成为数字经济与实体经济深度融合的核心驱动力,为产业智能化升级注入持续动能。

专注:太空算力、AI infra、异构调度、大模型成本工程 786

图神经网络综述

文章目录 1 简介 1.1 GNN简史 1.2 GNN的相关研究 1.3 GNN vs 网络嵌入 1.4 文章的创新性 2 基本的图概念的定义 3 GNN分类和框架 3.1 GNNs分类 3.2 框架 4 图卷积网络 4.1 基于图谱的GCN 4.1.1 图信号处理 4.1.2 基于谱的GCN方法 4.1.3 总结 4.2 基于空间...

liangwqi的博客 1万+

【用unity实现100个游戏之2】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

蔚蓝》是一款备受好评的独立游戏,由游戏开发工作室开发并由发行。这款游戏于2016年首次发布,并在玩家和评论界收获了广泛赞誉。蔚蓝以其独特的艺术风格和引人入胜的故事而著称。游戏以深海为背景,玩家将扮演一个能够探索水下世界的神秘生物。游戏通过惊人的视觉表现和动态的海洋生态系统为玩家带来了令人难忘的游戏体验。无论是广阔的水下景观还是充满生机的海洋生物,蔚蓝都让玩家感受到深海的神秘和美丽。蔚蓝在玩法上注重探索和解谜。玩家可以在海底环境中自由游动,发现隐藏的地点和秘密,与各种生物互动,并解决环境谜题以继续前进。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4167

图神经网络/GNN(三)-基于图神经网络的节点表征学习

图神经网络/GNN(三)-基于图神经网络的节点表征学习 Task3概览 在图任务当中,首要任务就是要生成节点特征,同时高质量的节点表征也是用于下游机器学习任务的前提所在。本次任务通过GNN来生成节点表征,并通过基于监督学习对GNN的训练,使得GNN学会产生高质量的节点表征。主要内容为: 经典图神经网络(GCN、GAT)的原理 基准数据集介绍与使用 基于图卷积层的节点预测任务实战 对比实验结果分析 一、经典图神经网络(GCN、GAT)的原理 图神经网络有很多种不同的变体,单就图卷积操作这一

weixin_41968248的博客 4561

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GNN学习笔记(三):基于图神经网络的节点表征学习

haha,好久不见,唠叨小主现在游离于人世间,唠叨小主想不明白为何以前的刀剑变成了现在的键盘,唠叨小主如果要继续行走江湖的话,就必须得学点代码,毕竟以前唠叨小主拿着剑,策马扬鞭,便可行走天下,现在,不可以骑马,得开车,开车需要money,money的来源在于写代码,唠叨小主孤苦伶仃,码字如下:(悲情人设结束????)(步入主题)(有点神经质的唠叨小主带你解说今天的学习内容——节点表征(Node Representation)) 0、 引言 在图节点预测或边预测任务中,首先需要生成节点表征(Node Re

LuoMin2523的博客 1567

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【PYG】out[data.train_mask]用布尔索引来选择特定元素

不是数组套数组的赋值方式,而是利用布尔索引来选择特定元素的操作。这种操作在张量(tensor)和数组处理库(如 NumPy 和 PyTorch)中很常见,用于提取符合特定条件的元素。

Never Give Up 634

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 组队学习-图神经网络 Taks 02
下一篇: 组队学习-图神经网络 Taks 04
shell
博客等级 码龄16年 25粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值