图神经网络

DataWhale Task4

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

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

为了创建一个 InMemoryDataset,我们需要实现四个基本方法:
raw_file_names() 这是一个属性方法,返回一个文件名列表,文件
应该能在raw_dir文件夹中找到,否则调用process() 函数下载文件
到raw_dir文件夹。
processed_file_names() 。这是一个属性方法,返回一个文件名列
表,文件应该能在processed_dir 文件夹中找到,否则调用
process() 函数对样本做预处理然后保存到processed_dir 文件夹。
download() : 将原始数据文件下载到raw_dir文件夹。
process() : 对样本做预处理然后保存到processed_dir 文件夹。

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])码片

在我们生成一个InMemoryDataset子类的对象时,程序运行流程如下:

首先检查数据原始文件是否已下载:
检查self.raw_dir 目录下是否存在raw_file_names() 属性方法
返回的每个文件,
如有文件不存在,则调用download() 方法执行原始文件下载。
其中self.raw_dir 为osp.join(self.root, ‘raw’) 。

其次检查数据是否经过处理:
首先检查之前对数据做变换的方法:检查self.processed_dir目
录下是否存在pre_transform.pt 文件:如果存在,意味着之前进
行过数据变换,则需加载该文件获取之前所用的数据变换的方法,
并检查它与当前pre_transform 参数指定的方法是否相同;如果不
相同则会报出一个警告,“The pre_transform argument differs
from the one used in ……”。

接着检查之前的样本过滤的方法:检查self.processed_dir目录
下是否存在pre_filter.pt 文件,如果存在,意味着之前进行过样
本过滤,则需加载该文件获取之前所用的样本过滤的方法,并检查
它与当前pre_filter 参数指定的方法是否相同,如果不相同则会
报出一个警告,“The pre_filter argument differs from the one
used in ……”。其中self.processed_dir为
osp.join(self.root, ‘processed’)。

接着检查是否存在处理好的数据:检查self.processed_dir目录
下是否存在self.processed_paths 方法返回的所有文件,如有文
件不存在,意味着不存在已经处理好的样本的文件,如需执行以下
的操作:
调用process方法,进行数据处理。
如果pre_transform 参数不为None,则调用pre_transform
方法进行数据处理。
如果pre_filter 参数不为None,则进行样本过滤(此例子中
不需要进行样本过滤,pre_filter 参数始终为None)。
保存处理好的数据到文件,文件存储在processed_paths() 属
性方法返回的路径。如果将数据保存到多个文件中,则返回的
路径有多个。这些路径都在self.processed_dir目录下,以
processed_file_names()属性方法的返回值为文件名。
最后保存新的pre_transform.pt 文件和pre_filter.pt 文
件,其中分别存储当前使用的数据处理方法和样本过滤方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值