赞
踩
小屌丝:鱼哥,能不能给我讲一下 GCN和GNN的区别啊
小鱼:这还区分不出来?
小屌丝:嗯, 确实有点难区分
小鱼:你看啊, 中间的字母, 一个是C 一个是N ,
小屌丝:哇哦…鱼哥,你挺坏的哦
小鱼:我… 没有啊
小屌丝:鱼哥,那…我知道了哦
小鱼:你知道什么了?
小屌丝:你要是正儿八经的跟我说一说GCN 和GNN的差异,我就告诉你
小鱼:还能不能处朋友了。
小屌丝: 看你表现
小鱼:我会把你刚刚的话,说给小芸的
小屌丝:… 好吧, 老地方。
小鱼:这还差不多。
GNN:
GCN:
GNN:
GCN:
GNN:
GCN:
GNN:
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)
代码实例
# -*- 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)
GNN和GCN作为处理图结构数据的强大工具,在多个领域取得了显著成果。它们的异同点主要体现在以下几个方面:
定义:GNN是一种能够处理图结构数据的神经网络,而GCN是GNN的一个子集,专注于通过卷积操作来提取特征。
核心原理:GNN通过迭代的方式更新节点表示,每次迭代都会聚合邻居节点的信息。GCN则通过卷积操作聚合邻居节点的信息,从而提取局部特征。
实现方式:GNN的实现较为灵活,可以根据具体任务设计不同的聚合和更新策略。GCN则通常基于神经网络框架实现,通过定义卷积层来聚合邻居节点信息。
应用场景:GNN和GCN都适用于需要处理图结构数据的场景,如社交网络分析、推荐系统、生物信息学等。GCN在处理文本分类、图像识别等任务中表现出色,而GNN则更适用于复杂图结构数据的处理和分析。
总的来说,GNN和GCN都是处理图结构数据的有效工具,它们各自具有独特的优势和适用场景。在实际应用中,我们可以根据具体任务和数据集选择合适的算法来实现最佳的性能
我是小鱼:
关注小鱼,学习【机器学习】&【深度学习】领域的知识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。