从0到1实现GCN——最详细的代码实现
2024.01.17 18:34浏览量:97简介:本文将带你从零开始实现GCN(Graph Convolutional Network),包括数据预处理、模型构建、训练和评估等步骤。我们将使用Python和PyTorch框架来完成这个任务。
首先,我们需要导入所需的库和模块:
import torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch_geometric.nn import GCNConvfrom torch_geometric.data import Data
接下来,我们定义GCN模型:
class GCN(nn.Module):def __init__(self, num_features, num_classes):super(GCN, self).__init__()self.conv1 = GCNConv(num_features, 16)self.conv2 = GCNConv(16, num_classes)def forward(self, x, edge_index):x = F.relu(self.conv1(x, edge_index))x = self.conv2(x, edge_index)return F.log_softmax(x, dim=1)
在上面的代码中,我们定义了一个名为GCN的PyTorch模型,它包含两个GCNConv层。在前向传播中,我们首先使用ReLU激活函数对第一层进行非线性变换,然后将结果传递给第二层。最后,我们使用LogSoftmax函数对输出进行归一化处理。
接下来,我们需要定义数据加载器和数据预处理步骤:
# 加载数据集data = Data.from_csv('dataset.csv', sep=',', format='node_attrs')# 数据预处理edge_index = data.edge_indexnum_features = data.x.size(1)num_classes = data.num_classes
在上面的代码中,我们使用Data.from_csv方法从CSV文件中加载数据集。然后,我们将边索引和节点特征提取出来,以便在模型中使用。同时,我们还需要获取节点类别的数量。
现在,我们可以开始训练模型:
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = GCN(num_features, num_classes).to(device)data = data.to(device)optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
在上面的代码中,我们将模型和数据都移动到GPU上(如果有可用的话)。然后,我们定义了一个Adam优化器,并设置学习率为0.01。
接下来,我们可以开始训练模型:
```python
for epoch in range(100): # 训练100个epochs
model.train() # 设置模型为训练模式
optimizer.zerograd() # 清零梯度
out = model(data.x, data.edge_index) # 前向传播
loss = F.nll_loss(out[data.train_mask], data.y[data.train_mask]) # 计算损失函数值
loss.backward() # 反向传播计算梯度值
optimizer.step() # 更新权重参数值
model.eval() # 设置模型为评估模式
, pred = model(data.x, data.edge_index).max(dim=1) # 获取预测结果
correct = int((pred == data.y).sum().item()) # 计算预测正确数
print(‘Epoch: {:03d}, Loss: {:.5f}, Train Accuracy: {:.5f}’.format(epoch, loss.item(), correct / len(data.y))) # 输出训练信息

发表评论
登录后可评论,请前往 登录 或 注册