【PyG学习入门】二:入门时遇到的问题

【PyG学习入门】一:入门使用

在上一篇的介绍中,主要讲了Pytorch-Geometric的五个基础用例,但是其中存在一些问题还没有解决,下面开始一一解决,本文的重点是如何手动加载PyG的数据集。

1.关于创建Data实例时,维度异常的问题

问题描述:
Data创建过程中,edge_index表示边的信息,x为节点的特征向量,y为目标值,如果y的维度([num_nodes, *])和节点总数的维度是一样的,那就是node-level;如果y的维度是[1,*],那就是graph-level。但是如果y的维度不符合上述的两种情况,在创建过程会如何?
解决方案:

### Q1: X维度和Y的维度不统一
import torch
from torch_geometric.data import Data

# 构建边
edge_index = torch.tensor([
    [3, 1, 1, 2],
    [1, 3, 2, 1]], dtype=torch.long)
# 构建X
x = torch.tensor([[-1],
                  [0],
                  [1],[2]], dtype=torch.float)
y = torch.tensor([[1], [2], [3]], dtype=torch.float)
data = Data(x=x, y=y, edge_index=edge_index)

print(data)

如代码所示,其中节点共有3个,但是我创建了4个节点的特征向量和5个目标值,运行代码后没有出现错误,所以可以得知Data实例化的过程中,是不会检查数据是否合理的,只是单纯的构建了一个复杂数据类型而已。

2.如何加载自己下载的数据集

问题描述:
在使用Dataset进行数据集的创建时,经常会出现HttpError这种样子的错误,所以手动下载数据集之后,再利用PyG的函数进行构建,但是这个方式目前还没有找到官方的接口,所以要从源码的角度来处理。
解决方案:
这里用Cora数据集进行实验,在planetoid.py文件中可以看到代码的下载地址为:

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

该文件内定义了一个类:

class Planetoid(InMemoryDataset):

里面有有一个download函数用于下载数据集:

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

调用函数download_url指定下载地址和下载后存放的目录,其中下载的列表为:

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

其中一共有八个文件。除了download函数还有一个process函数:

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

第一行代码中的read_planetoid_data函数是进行数据的加载并且切分出训练集、验证集、测试集,构造为Data实例:

data = Data(x=x, edge_index=edge_index, y=y)
data.train_mask = train_mask
data.val_mask = val_mask
data.test_mask = test_mask

第二行代码表示是否进行pre_transform操作(也就是是否进行一次数据转换,一般3D点云数据比较常见);第三行利用torch.save进行本地序列化。经过上面的一段分析,可以确定的是首先进行数据集下载,然后进行处理最后保存到本地一个新的序列化文件,所以只需要在下载过程跳过即可,但是考虑到这么一点,在之前学习的过程中,可以发现,当你第一次创建完数据集(下载到本地)之后,第二次时间比较短,所以一定存在防覆盖机制来优化程序运行速度,于是在download_url函数中找到了这一块代码:

if osp.exists(path):  # pragma: no cover
    if log:
        print('Using exist file', filename)
    return path

所以总结一下:
(1)根据URL下载自己的数据集;
(2)放到本地文件夹中,格式为:
在这里插入图片描述
其中Cora文件夹是根目录,processed是处理后torch.save的,所以自己下载的数据放在raw文件夹中;
(3)调用Dataset中的接口创建数据集即可。

from torch_geometric.datasets import Planetoid

dataset = Planetoid(root='data/', name='Cora')
print(dataset)

输出信息为:

Processing...
Done!
Cora()

之前GCNModelacc为:

Accuracy: 0.8080
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值