这里的TUDataset继承自InMemoryDataset基类
dataset = TUDataset(path, name, pre_transform=pre_transform, cleaned=clean)
path
:数据路径,指定数据集所在的目录。name
:数据集名称,指定要使用的数据集。pre_transform
:预处理函数,即前面定义的pre_transform
函数,用于对数据集进行预处理。数据对象将在保存到磁盘之前进行转换。cleaned
:清洗标志,指示是否使用已清洗的数据集。-
transform: 数据对象将在每次访问之前进行转换。具体流程为:获取数据的函数首先用该
transform
函数对Data
做转换,再返回数据; 该参数输入的函数应用于数据增广 -
pre_filter=None: 是一个检查数据是否要保留的函数
1.创建TUDataset
对象时,它会执行以下操作:
- 加载指定数据集的原始数据。
- 如果提供了
pre_transform
参数,将应用预处理函数对数据集进行处理。 - 如果提供了
cleaned
参数且为True
,将使用清洗过的数据集,即移除同构性的图。清洗操作通常会在预处理之后,用于移除同构性或其他不必要的图结构。
2.返回创建的TUDataset
对象,该对象包含了经过预处理和清洗(如果适用)的数据集,可以用于后续的数据分析、模型训练等任务。
3.返回的对象dataset
包含以下参数:
-
dataset.data
: 一个torch_geometric.data.Data
对象的列表,其中每个对象表示数据集中的一个图。每个Data
对象包含以下属性:x
: 节点特征矩阵,形状为[num_nodes, num_node_features]
。每行对应一个节点的特征向量。edge_index
: 边索引矩阵,形状为[2, num_edges]
。每列表示一个边,其中第一行是起始节点的索引,第二行是目标节点的索引。edge_attr
: 边属性矩阵,形状为[num_edges, num_edge_features]
。每行对应一个边的属性向量。pos
: 节点位置矩阵,形状为[num_nodes, num_dimensions]
。每行对应一个节点的位置信息。y
: 图的目标标签,通常是一个整数或一个张量。表示图所属的类别或回归目标。- 其他自定义属性:如果数据集中还有其他属性,它们将作为键值对存储在
data
对象中。
-
dataset.cleaned:数据是否经过清洗;如果:obj:`True',则数据集将只包含非同构图
-
dataset.
cleaned_url:定义了已清洗数据集的下载URL -
dataset.name:数据集名字
-
dataset.num_classes
: 表示图数据集中的类别数量,通常用于图分类任务。它指示了图数据集中不同类别的图的数量。 -
dataset.num_edge_attributes
: 表示边属性的数量。边属性是指在图中与边相关的附加信息或特征。例如,在社交网络中,边属性可以表示用户之间的关系强度或互动频率。 -
dataset.num_edge_features
: 表示边特征的类别数。边特征是指在图中与边相关的特征向量或描述。边特征可以用来表示边的权重、距离、相似度等信息。 -
dataset.num_edge_labels
: 表示边的标签类别数。边标签是指为图中的每条边分配的类别或标签。例如,在社交网络中,边标签可以表示用户之间的关系类型,如友好、家庭关系等。 -
dataset.num_features
: 表示图数据集中的特征数量。这包括节点特征和边特征的总数量。 -
dataset.num_node_attributes
: 表示节点属性的数量。节点属性是指在图中与节点相关的附加信息或特征。例如,在社交网络中,节点属性可以表示用户的年龄、性别、职业等。 -
dataset.num_node_features
: 表示节点特征的类别数。节点特征是指在图中与节点相关的特征向量或描述。节点特征可以用来表示节点的属性、内容、表示向量等信息。 -
dataset.num_node_labels
: 表示节点的标签类别数。节点标签是指为图中的每个节点分配的类别或标签。例如,在图像分类任务中,节点标签可以表示图像所属的类别。 dataset.transform
: 数据转换函数,用于在加载数据时对数据进行预处理和转换。dataset.pre_transform
: 预转换函数,用于在数据处理阶段对数据进行预处理和转换。dataset.pre_filter
: 预过滤函数,用于在加载数据时对数据进行预过滤,过滤掉不需要的数据。dataset.processed_dir
: 处理后数据存储的目录路径。dataset.
processed_file_names: 处理后数据存储的文件名dataset.
processed_paths:处理后数据存储的文件路径dataset.raw_dir
: 原始数据存储的目录dataset.
raw_file_names: 原始数据存储的文件名dataset.
raw_paths:原始数据存储的文件路径dataset.url
: 数据集的下载URLdataset.process()
: 处理数据的方法。-
dataset.slices
: 这是一个包含切片信息的Python字典,用于快速访问图数据的不同部分。它包含了各个属性的切片范围,可以通过切片索引快速获取对应的数据。具体的参数解释如下:x
: 节点特征的切片范围,用于在data.x
中获取节点特征。edge_index
: 边索引的切片范围,用于在data.edge_index
中获取边索引。edge_attr
: 边属性的切片范围,用于在data.edge_attr
中获取边属性。y
: 图的标签的切片范围,用于在data.y
中获取图的标签。
这些参数可以通过dataset
对象的属性访问,例如dataset.data
、dataset.slices
、dataset.num_classes
和dataset.metadata
。
设我们使用TUDataset
加载的数据集是MUTAG数据集,下面是一个例子来详细解释dataset.slices
参数:
import torch_geometric
from torch_geometric.datasets import TUDataset
path = '/path/to/dataset'
name = 'MUTAG'
dataset = TUDataset(path, name)
print(dataset.slices)
输出结果:
{
'x': tensor([0, 14, 23, 34, 52, 69, 90, 104, 114, 126, 135, 144, 159, 169, 185, 197, 204]),
'edge_index': tensor([ 0, 2, 0, 3, 0, 5, 0, 8, 0, 11, 0, 14, 0, 17,
0, 20, 0, 23, 0, 26, 0, 29, 0, 32, 0, 35, 0, 38,
...
203, 196, 204, 198, 204, 199, 204, 200, 204, 201, 204, 202, 204, 203]),
'edge_attr': tensor([ 0, 0, 1, ..., 21, 17, 9]),
'y': tensor([0, 0, 0, ..., 1, 1, 1])
}
解释:
'x'
: 这个键对应的值是一个包含了每个图中节点特征矩阵x
的切片(索引范围)信息。在这个例子中,x
的切片范围为[0, 14, 23, 34, 52, 69, 90, 104, 114, 126, 135, 144, 159, 169, 185, 197, 204]
。这意味着第一个图(索引为0)中的节点特征在x[0:14]
中,第二个图(索引为1)中的节点特征在x[14:23]
中,- 其他属性也是如此,以此类推。
再一个解释如下:
假设我们使用TUDataset加载了一个数据集,其中包含5个图数据。每个图数据都具有节点特征x
和边索引edge_index
。当我们访问slices
时,它将返回一个字典,其中包含了两个键:x
和edge_index
。
slices['x']
是一个包含6个元素的列表,对应于数据集中每个图数据的节点特征x
的切片索引。列表的每个元素都是一个切片对象,表示对应图数据的节点特征在x
中的范围。
slices['edge_index']
也是一个包含6个元素的列表,对应于数据集中每个图数据的边索引edge_index
的切片索引。列表的每个元素同样是一个切片对象,表示对应图数据的边索引在edge_index
中的范围。
这些切片索引可以用于快速访问和定位图数据的节点特征和边索引。通过使用这些切片索引,我们可以轻松地提取出特定图数据的节点特征和边索引,而不需要遍历整个x
和edge_index
。
例如,假设我们想获取第3个图数据的节点特征和边索引,我们可以使用slices['x'][3]
和slices['edge_index'][3]
来获取对应的切片索引。然后,我们可以使用这些切片索引来从整个x
和edge_index
中提取出第3个图数据的节点特征和边索引。
slices
参数提供了一种有效访问和索引每个图数据的方式。通过这些切片信息,可以方便地从整个数据集中提取单个图的数据,进行后续的训练、验证和测试等操作。