1.InMemoryDataset基类
在PyG中,可以通过继承InMemoryDataset类来自定义一个数据可全部存储到内存的数据集类。(继承Dataset是分次加载到内存,继承InMemoryDataset是一次性加载所有数据到内存)
1 | class InMemoryDataset(root: Optional[str] = None, transform: Optional[Callable] = None, pre_transform: Optional[Callable] = None, pre_filter: Optional[Callable] = None) |
参数说明:
transform:数据转换函数,用于转换Data对象,每一次数据获取过程中都会被执行。
pre_transform:数据转换函数,用于转换Data对象,在Data对象被保存到文件前调用。
pre_filter:检查数据是否要保留的函数,接收一个Data对象,返回此Data对象是否应该被包含在最终的数据集中,在Data对象被保存到文件前调用。
2.Sequential容器
nn.Sequential是nn.module的容器,用于按顺序包装一组网络层。参数说明:
args(str):模型的全局输入参数;
modules ([(str, Callable) or Callable]) :模块列表。
3. 节点分类
定义一个GAT图神经网络,通过hidden_channels_list参数来设置每一层GATConv的outchannel,所以hidden_channels_list长度即为GATConv的层数。
1 | #载入数据集 |
1 | import torch |
1 | #训练和测试 |
构建2层GAT,Accuracy为0.7640;构建2层GCN,Accuracy为0.6490。
构造3层GAT(将hidden_channels_list的值改为[200,100,50]),Accuracy为0.7680;构建3层GCN,Accuracy为0.5190。
4 边预测
边预测任务的目标是预测两个节点间是否有边。做边预测任务首先需要获取正负样本数量平衡的数据集(edge_index存储的是正样本,需要采样一些不存在边的节点对作为负样本边),PyG中可以通过train_test_split_edges(data, val_ratio=0.05, test_ratio=0.1)采样负样本边。
1 | #构造边预测神经网络 |
1 | # 定义单个epoch的训练过程 |
1 | #定义单个epoch验证与测试过程 |
1 | #完整的训练、验证与测试 |
结果:Epoch: 100, Loss: 0.4414, Val: 0.9330, Test: 0.8943
将Sequential容器用于边预测,需要在Net类定义中将__init_函数和main()做部分修改:
1 | #替换上面的对应代码 |
在边预测任务用Sequential容器的结果:
Epoch: 100, Loss: 0.4226, Val: 0.9123, Test: 0.8958