GCN的搭建

将当前节点特征和一阶节点特征进行聚合来表征当前节点的新特征,通过这种方式有利于引入图节点的上下文信息,使得每个节点预测结果受邻居节点的影响,那么具体怎么集成呢?由于邻接矩阵可以表示节点之间的连接关系,我们可以在邻接矩阵上稍作调整,添加单位矩阵来结合节点自身的连接,并进行归一化,每一行表示一个节点与其他节点的连接权重大小,并作为当前节点的特征集成权重。

我们也可以将调整后的邻接矩阵看成是一种掩码(MASK),每一行权重为0的位置表示其对当前节点的聚合特征没有影响,由于这种权重本身由图的连接情况决定,是【固定的】和【不可学习的】,这种基于【整个图】结构的特征聚合网络就是GCN,属于转导学习。

通过将当前节点的特征向量与其一阶节点的特征向量【加和平均】的方式进行聚合来表征当前节点的上下文表征向量,这种方法只考虑了当前节点的连接情况,没有考虑其一阶节点的连接情况,容易造成节点的度越大,参与的节点特征聚合次数越多,而这种度越大的节点本身特殊性应该越弱,影响应该进行削弱。具体实现:

这个公式中:

,I是单位矩阵

的度矩阵(degree matrix)

X是每一层的特征

W神经网络模型权重参数

σ是非线性激活函数

代码如下:

class GraphConvolution(nn.Module):
    def __init__(self, input_dim, output_dim, use_bias=True):
        """图卷积:L*X*\theta
        Args:
        ----------
            input_dim: int
                节点输入特征的维度
            output_dim: int
                输出特征维度
            use_bias : bool, optional
                是否使用偏置
        """
        super(GraphConvolution, self).__init__()
        self.input_dim = input_dim
        self.output_dim = output_dim
        self.use_bias = use_bias
        self.weight = nn.Parameter(torch.Tensor(input_dim, output_dim))
        if self.use_bias:
            self.bias = nn.Parameter(torch.Tensor(output_dim))
        else:
            self.register_parameter('bias', None)
        self.reset_parameters()

    def reset_parameters(self):
        init.kaiming_uniform_(self.weight)
        if self.use_bias:
            init.zeros_(self.bias)

    def forward(self, adjacency, input_feature):
        """邻接矩阵是稀疏矩阵,因此在计算时使用稀疏矩阵乘法
        Args: 
        -------
            adjacency: torch.sparse.FloatTensor
                邻接矩阵
            input_feature: torch.Tensor
                输入特征
        """
        support = torch.mm(input_feature, self.weight)
        output = torch.sparse.mm(adjacency, support)
        if self.use_bias:
            output += self.bias
        return output

    def __repr__(self):
        return self.__class__.__name__ + ' ('             + str(self.input_dim) + ' -> '             + str(self.output_dim) + ')'


# 模型定义
# 读者可以自己对GCN模型结构进行修改和实验
class GcnNet(nn.Module):
    """
    定义一个包含两层GraphConvolution的模型
    """
    def __init__(self, input_dim=1433):
        super(GcnNet, self).__init__()
        self.gcn1 = GraphConvolution(input_dim, 16)
        self.gcn2 = GraphConvolution(16, 7)
 
    def forward(self, adjacency, feature):
        h = F.relu(self.gcn1(adjacency, feature))
        logits = self.gcn2(adjacency, h)
        return logits
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GCN模型(Graph Convolutional Network)是一种用于处理图结构数据的机器学习模型。它的搭建和训练过程可以分为以下几个步骤: 1. 数据准备:首先需要准备好图数据集。这个数据集通常表示为一个邻接矩阵,其中每个节点表示图中的一个实体,边表示实体之间的连接关系。 2. 特征提取:对于每个节点,需要提取其相应的特征向量。这可以是节点属性的向量表示,也可以是通过其他方法得到的特征向量。 3. 图卷积层构建:GCN模型主要由多个图卷积层组成。每个图卷积层将节点的特征与其邻居节点的特征进行聚合,并采用一定的非线性激活函数进行转换。通过多层的图卷积层,可以逐步将节点特征进行传播和更新。 4. 模型搭建:通过将多个图卷积层串联起来,构建GCN模型。可以在模型中添加其他层,如池化层或全连接层,以提高模型的性能。 5. 模型训练:使用梯度下降等优化算法,将模型的预测结果与真实标签进行比较,计算损失函数。通过反向传播算法,更新模型参数,减小损失函数的值。这个过程可以通过迭代多个epoch来完成。 6. 模型评估:使用验证集或测试集评估训练好的GCN模型的性能。常用的指标包括准确率、F1值等。 7. 超参调优:根据模型在验证集上的性能,调整模型的超参数,如学习率、隐藏单元数、层数等。 8. 模型应用:将训练好的GCN模型应用于未知样本的预测或分类任务中。 总的来说,GCN模型的搭建和训练过程包括数据准备、特征提取、图卷积层构建、模型搭建、模型训练、模型评估、超参调优和模型应用等一系列步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值