我有一个 torch_geometric.data.Data 对象的 python 列表(每个对象代表一个图形)。我没有简单的方法来访问这些数据的原始文件:我只有列表。我需要将此数据对象列表转换为 torch_geometric.data.InMemoryDataset 或 torch_geometric.data.Dataset 对象,以便将其与我没有编写的更大的代码库集成。我该怎么做?
需要明确的是,我知道可以使用一系列 Data 对象来创建 torch_geometric.data.DataLoader 对象。但是,我特别需要一个 Dataset 对象,而不是 DataLoader 对象,因为较大的代码库在将 Dataset 对象转换为加载器之前会对它们执行一些额外的处理步骤。 我不明白为什么 PyG 让这变得如此困难。难道没有一个非常简单的方法可以做到这一点吗?
我尝试使用简单的 CustomDataset 类
class CustomDataset(InMemoryDataset):
def __init__(self, data):
super().__init__()
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
sample = self.data[idx]
return sample
当尝试获取索引 0 处的 Data 对象时,它给了我一个 KeyIndex 错误。我还尝试了上述代码的一个版本,其中超类是 Dataset 而不是 InMemoryDataset,但我不知道如何进行整理方法工作。
class CustomDataset(InMemoryDataset):
def __init__(self, listOfDataObjects):
super().__init__()
self.data, self.slices = self.collate(listOfDataObjects)
def __len__(self):
return len(self.slices)
def __getitem__(self, idx):
sample = self.get(idx)
return sample
数据对象列表的存储效率很低。这就是为什么大部分时间在初始化结束时进行排序的原因。要从数据中检索项目,您无法对整理后的 Data 对象建立索引,这将导致像您遇到的那样出现 KeyIndexError 。然而,Pytorch GeometricInMemoryDataset
实现了一个 get
方法,可以为您建立索引!他们使用
separate
方法来处理整理对象,并使用提供的切片将索引对象与整理对象分开。