Pytorch+PyG实现GIN过程示例详解
作者:实力
这篇文章主要为大家介绍了Pytorch+PyG实现GIN过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
GIN简介
GIN(Graph Isomorphism Network)是一类基于图同构的神经网络。在传统的神经网络中,每个节点的特征只依赖于其自身特征,但在图数据中,节点的特征还与其邻居节点有关系。GIN网络通过定义可重复均值池化运算来学习节点及其邻居的特征表示,并使用多层感知器(MLP)作为逐层转换函数进行特征提取。
实现步骤
数据准备
这里我们仍然选用Cora数据集作为示例数据。由于GIN采用基于点、简单且无参数的邻域聚合方式,因此不需要额外对数据做处理,直接使用即可。
import torch.nn.functional as F from torch_geometric.datasets import Planetoid from torch_geometric.utils import from_networkx, to_networkx # 加载Cora数据集 dataset = Planetoid(root='./cora', name='Cora') data = dataset[0] # 将nx.Graph形式的图转换成PyG需要的格式 graph = to_networkx(data) data = from_networkx(graph) # 获取节点数量和特征向量维度 num_nodes = data.num_nodes num_features = dataset.num_features num_classes = dataset.num_classes # 建立需要训练的节点分割数据集 data.train_mask = torch.zeros(num_nodes, dtype=torch.bool) data.val_mask = torch.zeros(num_nodes, dtype=torch.bool) data.test_mask = torch.zeros(num_nodes, dtype=torch.bool) data.train_mask[:num_nodes - 1000] = True data.test_mask[-1000:] = True data.val_mask[num_nodes - 2000: num_nodes - 1000] = True
实现模型
接下来,我们需要定义GIN模型。
from torch_geometric.nn import global_mean_pool class GIN(torch.nn.Module): def __init__(self, hidden_dim, num_layers): super(GIN, self).__init__() self.conv1 = GINConv(mlp=nn.Sequential(nn.Linear(num_features, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim))) self.convs = nn.ModuleList() for _ in range(num_layers - 1): self.convs.append(GINConv(mlp=nn.Sequential(nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim)))) self.classify = nn.Sequential(nn.Linear(hidden_dim, num_classes)) def forward(self, data): x, edge_index, batch = data.x, data.edge_index, data.batch x = F.relu(self.conv1(x, edge_index)) for conv in self.convs: x = F.relu(conv(x, edge_index)) out = global_mean_pool(x, batch) return self.classify(out)
在上述代码中,我们实现了多层GIN的“可重复均值池化”结构,并使用MLP作为转换函数进行多层特征提取。
模型训练
定义好模型后,可以开始针对Cora数据集进行模型训练了。训练模型前先设置好优化器和损失函数,并指定训练周期及其过程中需要记录输出信息的参数。
from torch_geometric.nn import GINConv, global_add_pool # 初始化GIN并指定参数 num_layers = 5 hidden_dim = 1024 model = GIN(hidden_dim=hidden_dim, num_layers=num_layers).to(device) optimizer = torch.optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-06) loss_func = nn.CrossEntropyLoss() # 开始训练 for epoch in range(100): model.train() optimizer.zero_grad() pred = model(train_data) loss = loss_func(pred[train_mask], train_labels) loss.backward() optimizer.step() # 在各个测试阶段检测一下准确率 with torch.no_grad(): model.eval() pred = model(test_data) test_loss = loss_func(pred[test_mask], test_labels).item() pred = pred.argmax(dim=-1, keepdim=True) correct = float(pred[test_mask].eq(test_labels.view(-1, 1)[test_mask]).sum().item()) acc = correct / test_mask.sum().item() if epoch % 10 == 0: print("Epoch {:03d}, Train Loss {:.4f}, Test Loss {:.4f}, Test Acc {:.4f}".format( epoch, loss.item(), test_loss, acc))
以上就是Pytorch+PyG实现GIN过程示例详解的详细内容,更多关于Pytorch PyG实现GIN的资料请关注脚本之家其它相关文章!