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

使用Pytorch Geometric建立自己的数据集 从本地使用PYG构建用于节点分类任务的数据集。 阅读详情

1、InMemoryDataset基类的使用

在PyG中,我们通过继承InMemoryDataset类来自定义一个数据可全部存储到内存的数据集类。

InMemoryDataset类初始化方法参数说明: 

root:字符串类型,**存储数据集的文件夹的路径**。

transform:函数类型,一个数据转换函数,它接收一个`Data`对象并返回一个转换后的`Data`对象。

pre_transform:函数类型,一个数据转换函数,它接收一个`Data`对象并返回一个转换后的Data对象。 

pre_filter:函数类型,**一个检查数据是否要保留的函数**,它接收一个Data对象,返回此Data对象是否应该被包含在最终的数据集中。

一个简化的`InMemory`数据集类

import torch
from torch_geometric.data import InMemoryDataset, download_url

class MyOwnDataset(InMemoryDataset):
    def __init__(self, root, transform=None, pre_transform=None, pre_filter=None):
        super().__init__(root=root, transform=transform, pre_transform=pre_transform, pre_filter=pre_filter)
        self.data, self.slices = torch.load(self.processed_paths[0])

    @property
    def raw_file_names(self):
        return ['some_file_1', 'some_file_2', ...]

    @property
    def processed_file_names(self):
        return ['data.pt']

    def download(self):
        # Download to `self.raw_dir`.
        download_url(url, self.raw_dir)
        ...

    def process(self):
        # Read data into huge `Data` list.
        data_list = [...]

        if self.pre_filter is not None:
            data_list = [data for data in data_list if self.pre_filter(data)]

        if self.pre_transform is not None:
            data_list = [self.pre_transform(data) for data in data_list]

        data, slices = self.collate(data_list)
        torch.save((data, slices), self.processed_paths[0])

PlanetoidPubMed数据集类的构造

import os.path as osp

import torch
from torch_geometric.data import (InMemoryDataset, download_url)
from torch_geometric.io import read_planetoid_data

class PlanetoidPubMed(InMemoryDataset):
    r""" 节点代表文章,边代表引文关系。
   		 训练、验证和测试的划分通过二进制掩码给出。
    参数:
        root (string): 存储数据集的文件夹的路径
        transform (callable, optional): 数据转换函数,每一次获取数据时被调用。
        pre_transform (callable, optional): 数据转换函数,数据保存到文件前被调用。
    """

    url = 'https://github.com/kimiyoung/planetoid/raw/master/data'

    def __init__(self, root, transform=None, pre_transform=None):

        super(PlanetoidPubMed, self).__init__(root, transform, pre_transform)
        self.data, self.slices = torch.load(self.processed_paths[0])

    @property
    def raw_dir(self):
        return osp.join(self.root, 'raw')

    @property
    def processed_dir(self):
        return osp.join(self.root, 'processed')

    @property
    def raw_file_names(self):
        names = ['x', 'tx', 'allx', 'y', 'ty', 'ally', 'graph', 'test.index']
        return ['ind.pubmed.{}'.format(name) for name in names]

    @property
    def processed_file_names(self):
        return 'data.pt'

    def download(self):
        for name in self.raw_file_names:
            download_url('{}/{}'.format(self.url, name), self.raw_dir)

    def process(self):
        data = read_planetoid_data(self.raw_dir, 'pubmed')
        data = data if self.pre_transform is None else self.pre_transform(data)
        torch.save(self.collate([data]), self.processed_paths[0])

    def __repr__(self):
        return '{}()'.format(self.name)

dataset = PlanetoidPubMed('dataset/PlanetoidPubMed')
print(dataset.num_classes)
print(dataset[0].num_nodes)
print(dataset[0].num_edges)
print(dataset[0].num_features)

3
19717
88648
500

2、尝试使用PyG中的不同的网络层去代替`GCNConv`,以及不同的层数和不同的`out_channels`,来实现节点分类任务。

设置1:

class Net(torch.nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Net, self).__init__()
        self.conv1 = GCNConv(in_channels, 128)
        self.conv2 = GCNConv(128, 128)
        self.conv3 = GCNConv(128, out_channels)

    def encode(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = x.relu()
        return self.conv2(x, edge_index)

    def decode(self, z, pos_edge_index, neg_edge_index):
        edge_index = torch.cat([pos_edge_index, neg_edge_index], dim=-1)
        return (z[edge_index[0]] * z[edge_index[1]]).sum(dim=-1)

    def decode_all(self, z):
        prob_adj = z @ z.t()
        return (prob_adj > 0).nonzero(as_tuple=False).t()
Epoch: 089, Loss: 0.4571, Val: 0.9033, Test: 0.8747
Epoch: 090, Loss: 0.4601, Val: 0.9049, Test: 0.8769
Epoch: 091, Loss: 0.4557, Val: 0.9070, Test: 0.8805
Epoch: 092, Loss: 0.4612, Val: 0.9091, Test: 0.8837
Epoch: 093, Loss: 0.4553, Val: 0.9117, Test: 0.8855
Epoch: 094, Loss: 0.4521, Val: 0.9139, Test: 0.8871
Epoch: 095, Loss: 0.4495, Val: 0.9156, Test: 0.8894
Epoch: 096, Loss: 0.4512, Val: 0.9165, Test: 0.8914
Epoch: 097, Loss: 0.4519, Val: 0.9165, Test: 0.8922
Epoch: 098, Loss: 0.4541, Val: 0.9185, Test: 0.8942
Epoch: 099, Loss: 0.4521, Val: 0.9206, Test: 0.8947
Epoch: 100, Loss: 0.4446, Val: 0.9217, Test: 0.8930

设置2:

class Net(torch.nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Net, self).__init__()
        self.conv1 = GCNConv(in_channels, 256)
        self.conv2 = GCNConv(256, 128)
        self.conv3 = GCNConv(128, out_channels)

    def encode(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = x.relu()
        return self.conv2(x, edge_index)

    def decode(self, z, pos_edge_index, neg_edge_index):
        edge_index = torch.cat([pos_edge_index, neg_edge_index], dim=-1)
        return (z[edge_index[0]] * z[edge_index[1]]).sum(dim=-1)

    def decode_all(self, z):
        prob_adj = z @ z.t()
        return (prob_adj > 0).nonzero(as_tuple=False).t()
Epoch: 093, Loss: 0.4613, Val: 0.8882, Test: 0.8851
Epoch: 094, Loss: 0.4657, Val: 0.8893, Test: 0.8856
Epoch: 095, Loss: 0.4582, Val: 0.8905, Test: 0.8863
Epoch: 096, Loss: 0.4629, Val: 0.8906, Test: 0.8888
Epoch: 097, Loss: 0.4609, Val: 0.8907, Test: 0.8894
Epoch: 098, Loss: 0.4602, Val: 0.8911, Test: 0.8888
Epoch: 099, Loss: 0.4571, Val: 0.8929, Test: 0.8894
Epoch: 100, Loss: 0.4575, Val: 0.8937, Test: 0.8906

设置3:

class Net(torch.nn.Module):
    def __init__(self, in_channels, out_channels):
        super(Net, self).__init__()
        self.conv1 = GCNConv(in_channels, 256)
        self.conv2 = GCNConv(256, out_channels)

    def encode(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = x.relu()
        return self.conv2(x, edge_index)

    def decode(self, z, pos_edge_index, neg_edge_index):
        edge_index = torch.cat([pos_edge_index, neg_edge_index], dim=-1)
        return (z[edge_index[0]] * z[edge_index[1]]).sum(dim=-1)

    def decode_all(self, z):
        prob_adj = z @ z.t()
        return (prob_adj > 0).nonzero(as_tuple=False).t()
Epoch: 091, Loss: 0.4247, Val: 0.9253, Test: 0.9279
Epoch: 092, Loss: 0.4246, Val: 0.9246, Test: 0.9279
Epoch: 093, Loss: 0.4248, Val: 0.9232, Test: 0.9279
Epoch: 094, Loss: 0.4175, Val: 0.9236, Test: 0.9279
Epoch: 095, Loss: 0.4201, Val: 0.9245, Test: 0.9279
Epoch: 096, Loss: 0.4221, Val: 0.9259, Test: 0.9267
Epoch: 097, Loss: 0.4240, Val: 0.9242, Test: 0.9267
Epoch: 098, Loss: 0.4234, Val: 0.9220, Test: 0.9267
Epoch: 099, Loss: 0.4218, Val: 0.9235, Test: 0.9267
Epoch: 100, Loss: 0.4257, Val: 0.9246, Test: 0.9267

实践问题二:在边预测任务中,尝试用`torch_geometric.nn.Sequential`容器构造图神经网络。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Sequential('x, edge_index, batch', [(GCNConv(dataset.num_features, 64), 'x, edge_index -> x1'),(GCNConv(64, 2), 'x1, edge_index -> x2'),]).to(device)
data = data.to(device)
optimizer = torch.optim.Adam(params=model.parameters(), lr=0.01)

思考问题三:如下方代码所示,我们以`data.train_pos_edge_index`为实际参数来进行训练集负样本采样,但这样采样得到的负样本可能包含一些验证集的正样本与测试集的正样本,即可能将真实的正样本标记为负样本,由此会产生冲突。但我们还是这么做,这是为什么?

还不知道呢

图神经网络/GNN(四)-节点预测与边预测任务实践 正在补作业中,麻烦助教稍等稍等,谢谢呀~ 阅读详情

相关推荐

PyG学习 - Dataset, DataLoader, Tranforms

PyG学习 - Dataset, DataLoader, Tranforms

qq_40671063的博客 5174

图数据集的构建以及基于图的节点分类和边预测

程序 = 数据结构 + 算法。若想使用 PyTorch geometric 中各种有用的模型和函数,数据集的结构必须符合 PyG 的既定标准,例如 PyG 自带的 Planetoid 等数据集类。为了处理自己独有的数据集,我们必须掌握如何将原始数据转化为对应的数据集类。 PyG 构建数据集分两种, 一种继承 torch_geometric.data.InMemoryDataset,一次性加载所有数据到内存;另一种继承torch_geometric.data.Dataset, 分次加载到内存。对于占用内存有

weixu22的博客 5961

pytorch_geometric自制数据集

1. 无权无向图数据格式与说明 ‘x’ :节点特征矩阵,默认shape为[num_nodes, num_node_features],num_nodes为数据集节点数,node_features为每个节点的特征数。(如果输入一副完整的image,那么特征数可以是像素数嘛?待验证。。) ‘y’ :label,可以是节点label也可以是图graph的label。shape根据目标进行设点。 ‘edg...

weixin_41377325的博客 7065

Task 4 数据完整存储于内存的数据集类+节点预测与边预测任务

序言 对于占用内存有限的数据集,可以将整个数据集都加载存储至内存中。在PyG中,可以通过继承一种特殊的数据集类InMemory基类的方式来构造完全存于内存的数据集类。 使用数据的一般过程: 下载数据原始文件; 对数据原始文件做处理,为每一个graph样本生成一个Data对象; 对每一个Data对象执行数据预处理,使其转换成新的Data对象; 过滤Data对象; 保存Data对象到文件; 获取Data对象,在每一次获取Data对象时,都先对Data对象做数据变换(于是获取到的是数据变换后的Data对象)。

sigmoid 304

PyG自定义数据集学习笔记(持续更新

PyG 提供了torch_geometric.data.Data用于构建图。 除了使用benchmark数据集进行实验外,还可以自定义数据集,其方式与Pytorch类似,需要继承数据集类。PyG中提供了两个数据集抽象类: torch_geometric.data.InMemoryDataset:用于构建内存数据集(小数据集),继承自Dataset,一次性加载所有数据到内存。 torch_geometric.data.Dataset:用于构建大型数据集(非内存数据集),分次加载到内存;

weixin_45928096的博客 8140

树莓派4B+WebRTC实现远程监控:5步搞定公网视频流传输(含Node.js配置)

本文详细介绍了如何利用树莓派4B和WebRTC技术,通过5个关键步骤搭建低延迟、高隐私的远程监控系统。重点阐述了WebRTC点对点传输相较于传统方案的优势,并提供了包含Node.js信令服务器配置、树莓派视频流捕获与推送、以及移动端自适应观看页面的完整实现方案,帮助用户实现公网视频流传输。

websocket5live的博客 292

数据完全存于内存的数据集类+节点预测与边预测任务实践

一、数据完全存于内存的数据集类 1. 引言 对于占用内存有限的数据集,我们可以将整个数据集的数据都存储到内存里。PyG为我们提供了方便的构造数据完全存于内存的数据集类,简称为InMemory数据集类的方式。 2. 使用数据集的一般过程 PyG定义了使用数据的一般过程: 从网络上下载数据原始文件; 对数据原始文件做处理,为每一个图样本生成一个Data对象; 对每一个Data对象执行数据处理,使其转换成新的Data对象; 过滤Data对象; 保存Data对象到文件; 获取Data对象,在每一次获取Data对象

weixin_43595036的博客 701

STM32 上 FreeRTOS 的启动与任务调度详解

4. SysTick定时器:FreeRTOS启动调度器后,会接管STM32的SysTick定时器,用于生成系统节拍,因此不要在HAL库中重复配置SysTick(比如HAL_Init()中已配置,无需再手动调用SysTick_Config()),否则会导致系统节拍异常,任务延迟不准。2. 任务栈大小需按需配置,不是越大越好(浪费RAM),也不能太小(会导致栈溢出),比如简单的传感器读取任务,1024字(4096字节)足够,复杂任务(比如串口接收+数据解析)可调整为2048字。

qq_40170041的博客 866

###haohaohao###图神经网络之神器——PyTorch Geometric 上手 & 实战

图神经网络(Graph Neural Networks, GNN)最近被视为在图研究等领域一种强有力的方法。跟传统的在欧式空间上的卷积操作类似,GNNs通过对信息的传递,转换和聚合实现特征的提取。这篇博客主要想分享下,怎样在你的项目中简单快速地实现图神经网络。你将会了解到怎样用PyTorch Geometric 去构建一个图神经网络,以及怎样用GNN去解决一个实际问题(Recsys Challen...

木东的博客 5123

毕设别再硬肝了:我用 GPT + Codex 做项目、写论文,效率直接起飞

这个也是神器。你项目做完之后,最怕的是老师一问就懵。这时候你直接把你的项目发给它,让它模拟老师提问。这是我的毕业设计题目和项目简介,请你站在答辩老师角度,提出20个高频问题,并给出简洁好背的回答。要求:问题尽量贴近计算机专业本科毕业答辩。为什么选这个题目?技术选型为什么这样定?你的创新点是什么?系统难点是什么?数据库怎么设计的?你的模型为什么选这个?如果继续优化,下一步怎么做?这个对答辩真的帮助很大。说实话,如果没有 GPT + Codex,

m0_74100417的博客 1846

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参

本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。

weixin_26802933的博客 487

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

1、知识梳理 1.1 图卷积神经网络 $$\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},$$ 1.2 图注意力神经网络 2、使用[PyG中不同的图卷积模块在[PyG的不同数据集]上实现节点分类或回归任务。 ...

shell的专栏 434

s8654

The official Snapdragon Ride SX 4.0 development board provides standardized hardware support for the secondary development and functional verification of the s8654 platform.

qq_39257814的博客 6829

组队学习-图神经网络 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

YOLOv11涨点改进 | Conv篇/小目标改进 | YOLOv11引入SPDConv卷积特征无损下采样模块,增加YOLOv11小目标P2检测层(助力小目标任务高效涨点)

本文提出了一种创新的SPDConv模块来优化YOLOv11模型,通过空间到深度(SPD)层和非步幅卷积层实现特征无损下采样。该方法有效解决了传统CNN中因跨步卷积和池化层导致的细粒度信息丢失问题,特别提升了小目标检测性能。实验表明,SPDConv在目标检测和图像分类任务中显著优于现有SOTA模型。文章详细介绍了模块原理、核心代码实现,并提供了YOLOv11集成SPDConv的具体方法,包括配置文件修改和P2层增强等优化技巧。该技术为计算机视觉任务提供了一种高效的特征保留方案。

Ai缝合怪、助力小伙伴高效发论文 586

K8S部署Java项目 pod的logs报错为:Error: Unable to access jarfile app.jar

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 2600

图神经网络基础--数据完全存于内存的数据集类

图神经网络基础--数据完全存于内存的数据集类

发呆的比目鱼的博客 917

ExpressLRS(ELRS)接收机技术全景:从历史演进、技术底层到产业生态全解析——上

ExpressLRS(ELRS)是一种由全球开源社区驱动的双向射频遥控链路协议栈,其接收机作为核心终端,承担信号接收解调、遥控指令解析、飞控数据交互与遥测回传等关键功能。自2018年问世以来,ELRS凭借极致性能、低成本、开放生态和强兼容性,从航模DIY方案发展为消费级无人机领域的事实标准,并逐步渗透工业级场景。 ELRS接收机采用模块化分层架构,支持2.4GHz和900MHz双频段,通过LoRa、FLRC、FSK多调制模式实现低延迟与远距离平衡。其核心技术包括自适应跳频抗干扰、TDD双向链路和极简数据包。

bother3000的博客 303

推荐使用的派生方法:super().__init__()

""" 推荐使用的派生方法:super().__init__() --super()的属性查找顺序是从当前位置开始找,根据mro列表,当前没有就往上找。 super() 函数是用于调用父类的一个方法。 super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题, 但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。 MRO ...

avsclxw015772714的博客 1133

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

图神经网络预训练 (3) - Context Prediction + 监督学习 代码

前两篇内容概述了Weihua Hu*, Bowen Liu*图神经网络预训练的方法,以及context prediction进行预训练的实施代码。 context prediction 学习的图内的原子/边信息的表征,并没有包括图层面的信息。 这一部分的监督学习,是图层次的监督学习,目的是把图层面的信息增加到图的表征向量G(h)中。经过图层次的监督学习,得到的模型就可以直接用于下游的任务。 文章方法:在节点层面预训练的模型后加上一个简单的线性模型,用于图层面的监督训练 网络结构如下图: ..

wufeil7的博客 2657

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【PyG-dataset:TUDataset返回的数据格式】

TUDataset

qq_38592948的博客 4870

数据完全存于内存的数据集类

1. InMemoryDataset基类 虽然PyG内置了许多数据集,但用户往往希望使用自行记录的数据集。 PyG提供了两个抽象类:torch_geometric.data.Dataset和torch_geometric.data.InMemoryDataset. 在PyG中我们可以通过继承InMemoryDataset类,来将数据全部存储到内存中。 PyG可以方便地构造数据完全存于内存的数据集类:InMemory数据集类 1. 1InMemoryDataset基类介绍 class InMemoryDa

weixin_44133327的博客 1128

【PyG入门学习】四:构建自己的数据集

1.简介 虽然Pytorch-Geometric提供了很多官方数据集,但是当需要构建自己的数据集的时候,就需要对如何使用dataset基类构造自己的数据集有所了解。库中提供了两个构建数据集的基类:torch_geometric.data.Dataset和torch_geometric.data.InMemoryDataset,其中torch_geometric.data.InMemoryDatas...

小小小草儿的博客哟 1万+

图神经网络之四:InMemoryDataset基类与节点预测与边预测

图神经网络之四:InMemoryDataset基类与节点预测与边预测 引言 这篇是datawhale组队学习之图神经网络第四篇,本笔记主要梳理课程的关键点,以及简单的代码实现。 InMemoryDataset基类 在PyG中,我们通过继承InMemoryDataset类来自定义一个数据可全部存储到内存的数据集类。 首先我们给出InMemoryDataset类表达式: class InMemoryDataset( ​ root: Optional[str] = None, ​ transfo

博客小主 1708

PyG创建数据集

通过PyG封装库,使用自己的数据来构建我们自己的数据集

m0_52647764的博客 2742

【PYG】常用和采坑总结

目录 一. PyG的使用 1.整体介绍 1.1 图数据的处理 1.2 常用的图神经网络数据集 1.3 如何加载数据集 2.空域图卷积神经网络的建立 2.1 GCN的实现 2.2 Edge Convolution的实现 3.自建图神经网络数据集 3.1 创建一个能够完全放入内存中的图数据集 3.2 创建无法完全放入内存的数据集 4.批处理 5.异质图的建立 6.异质图神经网络的建立 6.1 将简单图神经网络转换为异质图神经网络 6.2利用PyG中自带的异质图神经网络 7.

图挖掘领域,新晋砖家 ☞ 未来可期,欢迎和静静一起学习交流吖 7059
上一篇: 组队学习-图神经网络 Taks 03
下一篇: 组队学习-图神经网络 Taks 05
shell
博客等级 码龄16年 25粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值