当前位置:   article > 正文

【深度学习】最强算法之:一文掌握GNN与GCN的异同点,再也不迷路。_gnn gcn

gnn gcn

1、引言

小屌丝:鱼哥,能不能给我讲一下 GCN和GNN的区别啊
小鱼:这还区分不出来?
小屌丝:嗯, 确实有点难区分
小鱼:你看啊, 中间的字母, 一个是C 一个是N ,
小屌丝:哇哦…鱼哥,你挺坏的哦
小鱼:我… 没有啊
在这里插入图片描述

小屌丝:鱼哥,那…我知道了哦
小鱼:你知道什么了?
小屌丝:你要是正儿八经的跟我说一说GCN 和GNN的差异,我就告诉你
小鱼:还能不能处朋友了。
小屌丝: 看你表现
小鱼:我会把你刚刚的话,说给小芸的
小屌丝:… 好吧, 老地方。
小鱼:这还差不多。

2、GNN与GCN的异同点

2.1 定义

  • GNN

    • 图神经网络是一种能够处理图结构数据的神经网络。
    • 它通过对图中的节点和边进行编码,将图结构数据转化为神经网络可以处理的向量表示,进而实现节点分类、链接预测等任务。
      在这里插入图片描述
  • GCN

    • 图卷积网络是图神经网络的一个子集,专注于通过卷积操作来提取图结构数据中的特征。
    • GCN通过聚合邻居节点的信息来更新节点的表示,从而捕捉图中的局部和全局结构信息。

2.2 核心原理

  • GNN

    • 通过迭代的方式更新节点的表示。
    • 在每一次迭代中,每个节点都会聚合其邻居节点的信息,并根据聚合结果更新自身的表示。这个过程会不断进行,直到达到预设的迭代次数或满足某种收敛条件。
  • GCN

    • 利用卷积操作来聚合邻居节点的信息。
    • 在GCN中,每个节点都会通过卷积核与邻居节点进行卷积操作,从而提取出局部特征。这些局部特征随后会被用于更新节点的表示。

在这里插入图片描述

2.3 实现方式

  • GNN

    • 实现方式通常包括节点表示初始化、邻居节点信息聚合和节点表示更新三个步骤。
      • 在初始化阶段,每个节点都会被赋予一个初始的向量表示。
      • 在聚合阶段,每个节点会聚合其邻居节点的信息。
      • 在更新阶段,节点会根据聚合结果更新自身的表示。
  • GCN

    • 实现方式通常基于神经网络框架(如TensorFlow、PyTorch等)。
      • GCN通过定义卷积层来实现邻居节点信息的聚合。
      • 每个卷积层都会根据邻居节点的表示和权重矩阵计算出新的节点表示。
      • 通过堆叠多个卷积层,GCN可以提取出不同层次的图结构特征。

2.4 应用场景

  • GNN

    • GNN在诸多领域都有广泛应用,如社交网络分析、推荐系统、生物信息学等。
      • 在社交网络中,GNN可以用于分析用户之间的关系和兴趣;
      • 在推荐系统中,GNN可以利用用户-物品图进行精准推荐;
      • 在生物信息学中,GNN可以应用于蛋白质相互作用网络的分析。
  • GCN

    • GCN同样适用于多种场景,特别是在需要捕捉图结构数据中的局部和全局特征的任务中表现优异。如:
      • 在文本分类中,GCN可以将文档视为图结构数据,其中节点代表单词或句子,边代表单词之间的关系;
      • 在图像识别中,GCN可以利用图像中的像素和邻域关系构建图结构,从而提取出更有效的特征。

2.5 代码示例

2.5.1 GCN代码示例

代码实例

# -*- coding:utf-8 -*-
# @Time   : 2024-04-05
# @Author : Carl_DJ


**import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
# 定义GCN层  
class GCNLayer(nn.Module):  
    def __init__(self, in_features, out_features):  
        super(GCNLayer, self).__init__()  
        # 定义权重矩阵  
        self.weight = nn.Parameter(torch.FloatTensor(in_features, out_features))  
        # 初始化权重  
        nn.init.xavier_uniform_(self.weight)  
          
    def forward(self, input, adj):  
        # 输入与权重矩阵相乘  
        support = torch.mm(input, self.weight)  
        # 利用邻接矩阵进行稀疏矩阵乘法,实现卷积操作  
        output = torch.spmm(adj, support)  
        return output  
  
# 定义GCN网络  
class GCN(nn.Module):  
    def __init__(self, nfeat, nhid, nclass, dropout):  
        super(GCN, self).__init__()  
        # 定义两层GCN  
        self.gc1 = GCNLayer(nfeat, nhid)  
        self.gc2 = GCNLayer(nhid, nclass)  
        # 定义dropout层  
        self.dropout = nn.Dropout(p=dropout)  
          
    def forward(self, x, adj):  
        # 第一层GCN  
        x = F.relu(self.gc1(x, adj))  
        # dropout层  
        x = self.dropout(x)  
        # 第二层GCN  
        x = self.gc2(x, adj)  
        # 应用softmax得到概率分布  
        return F.log_softmax(x, dim=1)  
  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

在这里插入图片描述

2.5.2 GNN代码示例

代码实例

# -*- coding:utf-8 -*-
# @Time   : 2024-04-05
# @Author : Carl_DJ

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
# 定义GNN的节点更新函数  
class GNNUpdate(nn.Module):  
    def __init__(self, in_features, out_features):  
        super(GNNUpdate, self).__init__()  
        # 定义一个线性层,用于从节点的当前表示和聚合的邻居信息中更新节点的表示  
        self.linear = nn.Linear(in_features, out_features)  
  
    def forward(self, node_feature, neighbor_features):  
        # 聚合邻居节点的特征,这里简单地使用了求和的方式  
        aggregated_neighbor_features = torch.sum(neighbor_features, dim=1)  
        # 将节点自身的特征与聚合的邻居特征拼接起来  
        combined_features = torch.cat([node_feature, aggregated_neighbor_features], dim=1)  
        # 通过线性层更新节点的表示  
        updated_node_feature = self.linear(combined_features)  
        return updated_node_feature  
  
# 定义GNN网络  
class GNN(nn.Module):  
    def __init__(self, nfeat, nhid, nclass, num_iterations):  
        super(GNN, self).__init__()  
        # 输入特征维度与隐藏层维度的和,因为我们需要拼接节点自身特征和邻居特征  
        self.update_func = GNNUpdate(nfeat + nhid, nhid)  
        # 输出层,将隐藏层特征映射到最终的输出类别数  
        self.output_layer = nn.Linear(nhid, nclass)  
        # 设置图神经网络迭代的次数  
        self.num_iterations = num_iterations  
  
    def forward(self, node_features, adj_list):  
        # 初始化消息矩阵,用于存储邻居节点的聚合信息  
        messages = torch.zeros(node_features.size(0), self.update_func.linear.in_features).to(node_features.device)  
  
        # 根据邻接列表迭代更新每个节点的表示  
        for _ in range(self.num_iterations):  
            # 遍历所有节点  
            for node_idx, neighbors in enumerate(adj_list):  
                # 获取当前节点的特征  
                node_feature = node_features[node_idx].view(1, -1)  
                # 提取邻居节点的特征  
                neighbor_features = node_features[neighbors]  
                # 调用更新函数,获取更新后的节点表示  
                updated_node_feature = self.update_func(node_feature, neighbor_features)  
                # 将更新后的节点表示存储到消息矩阵中  
                messages[node_idx] = updated_node_feature.view(-1)  
  
            # 更新节点的特征为最新聚合的消息  
            node_features = messages  
  
        # 最后的节点特征通过输出层得到每个节点的预测结果  
        output = self.output_layer(node_features)  
        # 应用softmax得到概率分布(如果需要的话,这通常用于分类任务)  
        return F.log_softmax(output, dim=1)  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在这里插入图片描述

3、总结

GNN和GCN作为处理图结构数据的强大工具,在多个领域取得了显著成果。它们的异同点主要体现在以下几个方面:

  • 定义:GNN是一种能够处理图结构数据的神经网络,而GCN是GNN的一个子集,专注于通过卷积操作来提取特征。

  • 核心原理:GNN通过迭代的方式更新节点表示,每次迭代都会聚合邻居节点的信息。GCN则通过卷积操作聚合邻居节点的信息,从而提取局部特征。

  • 实现方式:GNN的实现较为灵活,可以根据具体任务设计不同的聚合和更新策略。GCN则通常基于神经网络框架实现,通过定义卷积层来聚合邻居节点信息。

  • 应用场景:GNN和GCN都适用于需要处理图结构数据的场景,如社交网络分析、推荐系统、生物信息学等。GCN在处理文本分类、图像识别等任务中表现出色,而GNN则更适用于复杂图结构数据的处理和分析。

总的来说,GNN和GCN都是处理图结构数据的有效工具,它们各自具有独特的优势和适用场景。在实际应用中,我们可以根据具体任务和数据集选择合适的算法来实现最佳的性能

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/833642
推荐阅读
相关标签
  

闽ICP备14008679号