图卷积神经网络(GCN)的节点分类模型

        本篇文章构建了一个基于图卷积神经网络(GCN)的节点分类模型,并在Cora数据集上进行训练和测试。

        具体步骤如下:

        首先,通过导入所需的Python库,包括PyTorch、Matplotlib和torch_geometric等。

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv

        然后,定义了一个GCN类作为模型,其中包含两个GCNConv层,它们分别将输入特征从输入通道转换为隐藏通道,再从隐藏通道转换为输出通道。每个层之间都使用ReLU激活函数。最后,在输出层上使用log_softmax函数,将输出转换为概率分布。

# 定义GCN模型
class GCN(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(input_dim, hidden_dim)
        self.conv2 = GCNConv(hidden_dim, output_dim)
    def forward(self, X, edge_index):
        X = self.conv1(X, edge_index)
        X = F.relu(X)
        X = self.conv2(X, edge_index)
        return F.log_softmax(X, dim=1)

        接下来,加载Cora数据集并提取出其节点特征和边索引与创建GCN模型实例,定义优化器,以及存储损失和准确率的变量。

# 下载Cora数据集
dataset = Planetoid(root='data', name='Cora')
# 提取数据集中的节点特征和边索引
data = dataset[0]
x = data.x
edge_index = data.edge_index
# 创建GCN模型实例
model = GCN(dataset.num_features, 64, dataset.num_classes)
# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 存储损失和准确率
losses = []
accuracies = []

然后开始训练循环,循环中首先清空优化器梯度,然后计算预测损失,并反向传播更新参数。同时,计算当前epoch在训练集上的准确率,并将损失和准确率记录到相应的列表中。

#训练循环
model.train()
for epoch in range(75):
    #清空优化器梯度
    optimizer.zero_grad()
    #进行前向传播,生成预测输出test
    test = model(x, edge_index)
    #计算损失
    loss = F.nll_loss(test[data.train_mask], data.y[data.train_mask]) 
    #根据损失loss计算梯度,进行反向传播
    loss.backward()
    #根据计算得到的梯度更新模型的参数,执行一步优化器更新
    optimizer.step()
    #将模型设置为评估模式
    model.eval()
    predict =test.argmax(dim=1)
    #计算在训练集上的准确率
    train_acc = (predict[data.train_mask] == data.y[data.train_mask]).sum().item() / data.train_mask.sum().item()
    losses.append(loss.item())
    accuracies.append(train_acc)
    #打印当前epoch的损失和准确率
    print(f"Epoch {epoch+1}: Loss: {loss.item():.4f}, Train Accuracy: {train_acc:.4f}")

        训练结束后,使用测试集评估模型性能。

# 在测试集上评估模型
model.eval()
test = model(x, edge_index)
predict = test.argmax(dim=1)
test_acc = (predict[data.test_mask] == data.y[data.test_mask]).sum().item() / data.test_mask.sum().item()
print(f"Test Accuracy: {test_acc:.4f}")

 结果的可视化展示

#损失和准确率的可视化
plt.figure()
plt.plot(range(1, len(losses) + 1), losses, label='Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.figure()
plt.plot(range(1, len(accuracies) + 1), accuracies, label='Train Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

完整代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F
import matplotlib.pyplot as plt
from torch_geometric.datasets import Planetoid
from torch_geometric.nn import GCNConv
# 定义GCN模型
class GCN(nn.Module):
    def __init__(self, in_channels, hidden_channels, out_channels):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(in_channels, hidden_channels)
        self.conv2 = GCNConv(hidden_channels, out_channels)
    def forward(self, x, edge_index):
        x = self.conv1(x, edge_index)
        x = F.relu(x)
        x = self.conv2(x, edge_index)
        return F.log_softmax(x, dim=1)
# 下载Cora数据集
dataset = Planetoid(root='data', name='Cora')
# 提取数据集中的节点特征和边索引
data = dataset[0]
x = data.x
edge_index = data.edge_index
# 创建GCN模型实例
model = GCN(dataset.num_features, 64, dataset.num_classes)
# 定义优化器
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
# 存储损失和准确率
losses = []
accuracies = []
#训练循环
model.train()
for epoch in range(75):
    #清空优化器梯度
    optimizer.zero_grad()
    #进行前向传播,生成预测输出test
    test = model(x, edge_index)
    #计算损失
    loss = F.nll_loss(test[data.train_mask], data.y[data.train_mask]) 
    #根据损失loss计算梯度,进行反向传播
    loss.backward()
    #根据计算得到的梯度更新模型的参数,执行一步优化器更新
    optimizer.step()
    #将模型设置为评估模式
    model.eval()
    predict =test.argmax(dim=1)
    #计算在训练集上的准确率
    train_acc = (predict[data.train_mask] == data.y[data.train_mask]).sum().item() / data.train_mask.sum().item()
    losses.append(loss.item())
    accuracies.append(train_acc)
    #打印当前epoch的损失和准确率
    print(f"Epoch {epoch+1}: Loss: {loss.item():.4f}, Train Accuracy: {train_acc:.4f}")
# 在测试集上评估模型
model.eval()
test = model(x, edge_index)
predict= test.argmax(dim=1)
test_acc = (predict[data.test_mask] == data.y[data.test_mask]).sum().item() / data.test_mask.sum().item()
print(f"Test Accuracy: {test_acc:.4f}")
# 损失和准确率的可视化
plt.figure()
plt.plot(range(1, len(losses) + 1), losses, label='Loss')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()
plt.figure()
plt.plot(range(1, len(accuracies) + 1), accuracies, label='Train Accuracy')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

运行结果如下: 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值