- 观前提醒:包含chatgpt辅助创作
data_list
和 dataset
在图数据处理中的区别主要在于数据的存储和加载方式,以及它们如何与数据加载器(如 DataLoader
或 DenseDataLoader
)交互。
data_list
- 定义:
data_list
是一个包含多个Data
对象的列表,每个Data
对象表示一个图数据。 - 适用场景:适合处理小型数据集或在内存中可以完全加载的数据集。
- 使用方式:直接将列表传递给数据加载器。每个
Data
对象独立存储,可以在数据加载时进行随机访问。
dataset
- 定义:
dataset
是一个继承自torch.utils.data.Dataset
的类,通常用来表示大型数据集,包含数据集的长度和获取数据项的方法。 - 适用场景:适合处理大型数据集或需要动态生成数据项的数据集。
- 使用方式:通过实现
__len__
和__getitem__
方法,使其与DataLoader
等加载器兼容,支持批量加载和数据增强。
详细解释和示例
使用 data_list
import torch
from torch_geometric.data import Data
from torch_geometric.loader import DataLoader # 更新导入路径# 创建一些示例图数据
data1 = Data(x=torch.randn(10, 8), edge_index=torch.tensor([[0, 1, 2, 3], [1, 2, 3, 4]], dtype=torch.long))
data2 = Data(x=torch.randn(10, 8), edge_index=torch.tensor([[0, 1, 2, 3], [1, 2, 3, 4]], dtype=torch.long))
data_list = [data1, data2]# 使用 DataLoader 加载数据
loader = DataLoader(data_list, batch_size=2, shuffle=True)# 迭代加载数据
for batch in loader:print("Batch node features shape:", batch.x.shape)print("Batch edge index shape:", batch.edge_index.shape)
使用 dataset
import torch
from torch_geometric.data import Data
from torch_geometric.loader import DataLoader # 更新导入路径class MyDataset(torch.utils.data.Dataset):def __init__(self, num_samples, num_nodes, num_node_features):self.num_samples = num_samplesself.num_nodes = num_nodesself.num_node_features = num_node_featuresdef __len__(self):return self.num_samplesdef __getitem__(self, idx):x = torch.randn(self.num_nodes, self.num_node_features)edge_index = torch.tensor([[i, (i + 1) % self.num_nodes] for i in range(self.num_nodes)], dtype=torch.long).t().contiguous()y = torch.randn(self.num_nodes, 1)return Data(x=x, edge_index=edge_index, y=y)# 创建数据集
dataset = MyDataset(num_samples=100, num_nodes=10, num_node_features=8)# 使用 DataLoader 加载数据
loader = DataLoader(dataset, batch_size=32, shuffle=True)# 迭代加载数据
for batch in loader:print("Batch node features shape:", batch.x.shape)print("Batch edge index shape:", batch.edge_index.shape)
总结
data_list
:适合处理内存中可以完全加载的小型数据集,直接将包含Data
对象的列表传递给数据加载器。dataset
:适合处理大型数据集或需要动态生成数据项的数据集,通过继承Dataset
类并实现__len__
和__getitem__
方法,使其与数据加载器兼容。
在实际使用中,根据数据集的大小和特性选择合适的存储和加载方式。如果数据集较小且可以完全加载到内存中,使用 data_list
可能更简单直接。如果数据集较大或需要动态生成,使用 dataset
则更加灵活高效。