PyG搭建GCN实现节点分类(GCNConv参数详解)

20 篇文章 35 订阅

前言

在上一篇文章PyG搭建GCN前的准备:了解PyG中的数据格式中大致了解了PyG中的数据格式,这篇文章主要是简单搭建GCN来实现节点分类,主要目的是了解PyG中GCN的参数情况。

模型搭建

首先导入包:

from torch_geometric.nn import GCNConv

模型参数:
在这里插入图片描述

  1. in_channels:输入通道,比如节点分类中表示每个节点的特征数。
  2. out_channels:输出通道,最后一层GCNConv的输出通道为节点类别数(节点分类)。
  3. improved:如果为True表示自环增加,也就是原始邻接矩阵加上2I而不是I,默认为False。
  4. cached:如果为True,GCNConv在第一次对邻接矩阵进行归一化时会进行缓存,以后将不再重复计算。
  5. add_self_loops:如果为False不再强制添加自环,默认为True。
  6. normalize:默认为True,表示对邻接矩阵进行归一化。
  7. bias:默认添加偏置。

于是模型搭建如下:

class GCN(torch.nn.Module):
    def __init__(self, num_node_features, num_classes):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(num_node_features, 32)
        self.conv2 = GCNConv(32, num_classes)
        self.norm = torch.nn.BatchNorm1d(32)

    def forward(self, data):
        x, edge_index = data.x, data.edge_index
        x = self.conv1(x, edge_index)
        x = self.norm(x)
        x = F.relu(x)
        x = F.dropout(x, training=self.training)
        x = self.conv2(x, edge_index)

        return x

输出一下模型:

data = Planetoid(root='/data/CiteSeer', name='CiteSeer')
model = GCN(data.num_node_features, data.num_classes).to(device)
print(model)

输出为:

GCN(
  (conv1): GCNConv(3703, 16)
  (conv2): GCNConv(16, 6)
  (norm): BatchNorm1d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
)

1. 前向传播

查看官方文档中GCNConv的输入输出要求:
在这里插入图片描述
可以发现,GCNConv中需要输入的是节点特征矩阵x和邻接关系edge_index,还有一个可选项edge_weight。因此我们首先:

x, edge_index = data.x, data.edge_index
x = self.conv1(x, edge_index)
x = self.norm(x)
x = F.relu(x)
x = F.dropout(x, training=self.training)

此时我们不妨输出一下x及其size:

tensor([[0.0000, 0.1630, 0.0000,  ..., 0.0000, 0.0488, 0.0000],
        [0.0000, 0.2451, 0.1614,  ..., 0.0000, 0.0125, 0.0000],
        [0.1175, 0.0262, 0.2141,  ..., 0.2592, 0.0000, 0.0000],
        ...,
        [0.0000, 0.0000, 0.0000,  ..., 0.0000, 0.1825, 0.0000],
        [0.0000, 0.1024, 0.0000,  ..., 0.0498, 0.0000, 0.0000],
        [0.0000, 0.3263, 0.0000,  ..., 0.0000, 0.0000, 0.0000]],
       device='cuda:0', grad_fn=<FusedDropoutBackward0>)
torch.Size([3327, 16])

此时的x一共3327行,每一行表示一个节点经过第一层卷积更新后的状态向量。

那么同理,由于:

self.conv2 = GCNConv(16, num_classes)

所以经过第二层卷积后:

x = self.conv2(x, edge_index)

此时得到的x的size应该为:

torch.Size([3327, 6])

即每个节点的维度为6的状态向量,表示各个类别的概率。

2. 反向传播

在训练时,我们首先利用前向传播计算出输出:

out = model(data)

out即为最终得到的每个节点的6个概率值,但在实际训练中,我们只需要计算出训练集的损失,所以损失函数这样写:

loss = loss_function(out[data.train_mask], data.y[data.train_mask])

然后计算梯度,反向更新!

3. 训练

训练的完整代码:

def train():
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=5e-4)
    loss_function = torch.nn.CrossEntropyLoss().to(device)
    model.train()
    for epoch in range(500):
        out = model(data)
        optimizer.zero_grad()
        loss = loss_function(out[data.train_mask], data.y[data.train_mask])
        loss.backward()
        optimizer.step()

        print('Epoch {:03d} loss {:.4f}'.format(epoch, loss.item()))

4. 测试

我们首先需要算出模型对所有节点的预测值:

model(data)

此时得到的是每个节点的6个概率值,我们需要在每一行上取其最大值:

model(data).max(dim=1)

输出一下:

torch.return_types.max(
values=tensor([0.9100, 0.9071, 0.9786,  ..., 0.4321, 0.4009, 0.8779], device='cuda:0',
       grad_fn=<MaxBackward0>),
indices=tensor([3, 1, 5,  ..., 3, 1, 5], device='cuda:0'))

返回的第一项是每一行的最大值,第二项为最大值在这一行中的索引,我们只需要取第二项,那么最终的预测值应该写为:

_, pred = model(data).max(dim=1)

然后计算预测精度:

correct = int(pred[data.test_mask].eq(data.y[data.test_mask]).sum().item())
acc = correct / int(data.test_mask.sum())
print('GCN Accuracy: {:.4f}'.format(acc))

完整代码

完整代码中实现了论文中提到的四种数据集,代码地址:PyG-GCN。原创不易,下载时请给个follow和star!感谢!!

  • 86
    点赞
  • 206
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 35
    评论
GCN (Graph Convolutional Network)是一种用于图数据的机器学习模型,能够利用图结构中的节点和边的信息进行学习和预测任务。PYG (PyTorch Geometric)是基于PyTorch的一个开源库,提供了处理图数据的工具和模型。 GCN链路预测是指利用GCN模型对图数据中不存在的边进行预测,判断这些边在图中是否会存在。这种预测任务在社交网络、生物学、推荐系统等领域具有重要的应用。在PYG中,可以使用其提供的图卷积层和其他模型构建一个GCN链路预测的模型。 在使用PYG进行GCN链路预测时,首先需要构建一个图对象,将节点和边的信息加载到图中。可以使用PYG提供的数据加载器来导入图数据,并将其转换为图对象。然后,需要定义GCN模型的结构,包括图卷积层的设置和激活函数的选择。PYG提供了许多常用的图卷积层和激活函数的实现,可以根据具体任务选择适合的模型结构。 接下来,可以使用GCN模型对图数据进行训练和预测。训练阶段,可以使用已知的边来构建训练集,并根据GCN模型的输出与真实标签之间的差异来优化模型参数。预测阶段,可以使用已有的模型对不存在的边进行预测,通常是根据模型输出的概率值或阈值来判断边的存在性。 最后,可以根据预测结果进行评估和分析。常用的评估指标包括准确率、召回率、F1值等,可以通过比较预测结果和真实标签来计算这些指标。此外,还可以通过可视化图数据和GCN模型的注意力机制等来分析模型的学习过程和预测结果。 总之,利用PYG中的GCN模型进行链路预测需要加载图数据、构建模型、训练和预测,并进行评估和分析。通过这一过程,可以预测不存在的边的存在性,为实际应用提供决策和指导。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值