Pytorch+PyG实现GIN的方法是什么

其他教程   发布日期:2025年03月29日   浏览次数:223

本篇内容介绍了“Pytorch+PyG实现GIN的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

GIN简介

GIN(Graph Isomorphism Network)是一类基于图同构的神经网络。在传统的神经网络中,每个节点的特征只依赖于其自身特征,但在图数据中,节点的特征还与其邻居节点有关系。GIN网络通过定义可重复均值池化运算来学习节点及其邻居的特征表示,并使用多层感知器(MLP)作为逐层转换函数进行特征提取。

实现步骤

数据准备

这里我们仍然选用Cora数据集作为示例数据。由于GIN采用基于点、简单且无参数的邻域聚合方式,因此不需要额外对数据做处理,直接使用即可。

  1. import torch.nn.functional as F
  2. from torch_geometric.datasets import Planetoid
  3. from torch_geometric.utils import from_networkx, to_networkx
  4. # 加载Cora数据集
  5. dataset = Planetoid(root='./cora', name='Cora')
  6. data = dataset[0]
  7. # 将nx.Graph形式的图转换成PyG需要的格式
  8. graph = to_networkx(data)
  9. data = from_networkx(graph)
  10. # 获取节点数量和特征向量维度
  11. num_nodes = data.num_nodes
  12. num_features = dataset.num_features
  13. num_classes = dataset.num_classes
  14. # 建立需要训练的节点分割数据集
  15. data.train_mask = torch.zeros(num_nodes, dtype=torch.bool)
  16. data.val_mask = torch.zeros(num_nodes, dtype=torch.bool)
  17. data.test_mask = torch.zeros(num_nodes, dtype=torch.bool)
  18. data.train_mask[:num_nodes - 1000] = True
  19. data.test_mask[-1000:] = True
  20. data.val_mask[num_nodes - 2000: num_nodes - 1000] = True

实现模型

接下来,我们需要定义GIN模型。

  1. from torch_geometric.nn import global_mean_pool
  2. class GIN(torch.nn.Module):
  3. def __init__(self, hidden_dim, num_layers):
  4. super(GIN, self).__init__()
  5. self.conv1 = GINConv(mlp=nn.Sequential(nn.Linear(num_features, hidden_dim),
  6. nn.ReLU(),
  7. nn.Linear(hidden_dim, hidden_dim)))
  8. self.convs = nn.ModuleList()
  9. for _ in range(num_layers - 1):
  10. self.convs.append(GINConv(mlp=nn.Sequential(nn.Linear(hidden_dim, hidden_dim),
  11. nn.ReLU(),
  12. nn.Linear(hidden_dim, hidden_dim))))
  13. self.classify = nn.Sequential(nn.Linear(hidden_dim, num_classes))
  14. def forward(self, data):
  15. x, edge_index, batch = data.x, data.edge_index, data.batch
  16. x = F.relu(self.conv1(x, edge_index))
  17. for conv in self.convs:
  18. x = F.relu(conv(x, edge_index))
  19. out = global_mean_pool(x, batch)
  20. return self.classify(out)

在上述代码中,我们实现了多层GIN的“可重复均值池化”结构,并使用MLP作为转换函数进行多层特征提取。

模型训练

定义好模型后,可以开始针对Cora数据集进行模型训练了。训练模型前先设置好优化器和损失函数,并指定训练周期及其过程中需要记录输出信息的参数。

  1. from torch_geometric.nn import GINConv, global_add_pool
  2. # 初始化GIN并指定参数
  3. num_layers = 5
  4. hidden_dim = 1024
  5. model = GIN(hidden_dim=hidden_dim, num_layers=num_layers).to(device)
  6. optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-06)
  7. loss_func = nn.CrossEntropyLoss()
  8. # 开始训练
  9. for epoch in range(100):
  10. model.train()
  11. optimizer.zero_grad()
  12. pred = model(train_data)
  13. loss = loss_func(pred[train_mask], train_labels)
  14. loss.backward()
  15. optimizer.step()
  16. # 在各个测试阶段检测一下准确率
  17. with torch.no_grad():
  18. model.eval()
  19. pred = model(test_data)
  20. test_loss = loss_func(pred[test_mask], test_labels).item()
  21. pred = pred.argmax(dim=-1, keepdim=True)
  22. correct = float(pred[test_mask].eq(test_labels.view(-1, 1)[test_mask]).sum().item())
  23. acc = correct / test_mask.sum().item()
  24. if epoch % 10 == 0:
  25. print("Epoch {:03d}, Train Loss {:.4f}, Test Loss {:.4f}, Test Acc {:.4f}".format(
  26. epoch, loss.item(), test_loss, acc))

以上就是Pytorch+PyG实现GIN的方法是什么的详细内容,更多关于Pytorch+PyG实现GIN的方法是什么的资料请关注九品源码其它相关文章!