【基础】GCN

图卷积网络基础知识

论文:SEMI-SUPERVISED CLASSIFICATION WITH
GRAPH CONVOLUTIONAL NETWORKS
论文地址:https://arxiv.org/pdf/1609.02907.pdf
Reference: https://zhuanlan.zhihu.com/p/107162772

GCN的网络结构

Schematic depiction of multi-layer Graph Convolutional Network (GCN) for semi-supervised learning with C input channels and F feature maps in the output layer. The graph structure (edges shown as black lines) is shared over layers, labels are denoted by Y
一个NNNDDD的矩阵XXX作为输入,其中NNN表示nodes的个数,DDD是输入特征的维度;输出ZZZ是一个NNNFFF的矩阵,FFF是输出特征的维度。

层级传导

定义简单的f函数,作为基础的网络层
在这里插入图片描述
表示将图的邻接矩阵与隐藏层相乘,经过WWW的线性变换,再经过σ\sigmaσ的激活函数。
AHAHAH代表什么含义?
在这里插入图片描述
假设输入层xi=[i,i,i,i]x_i=[i,i,i,i]xi=[i,i,i,i], 我们不难得出,x1′=x2+x5x'_1 = x_2+x_5x1=x2+x5, 因为node1和node2与node5相连。其他的以此类推(见下图)
在这里插入图片描述
这样的问题是,AHAHAH会丢失原本这个node的信息, 只保留与之相邻的node信息,解决方案是,对每个节点手动增加一条self-loop 到每一个节点,用A^=A+I\hat{A} = A + IA^=A+I来代替AAA.

其次,为了避免每层越乘越大的问题,取归一化的AAA,即让每一行的和为1, A′=D−1AA' = D^{-1}AA=D1A, DDD是度矩阵(degree matrix), 实际运用中我们采用的是对称的normalization A′=D−1/2AD−1/2A' = D^{-1/2}AD^{-1/2}A=D1/2AD1/2. 最终得到:
在这里插入图片描述
其中A^=A+I\hat{A} = A + IA^=A+I, D^\hat{D}D^A^\hat{A}A^的度矩阵。

图卷积网络(GCN)是一种基于图结构的卷积神经网络,可处理非规则化的图数据,在多个领域应用广泛,可用于特征提取、节点分类、图分类等任务。下面结合提供的代码对GCN基础代码进行详细讲解。 ```python import torch import torch.nn as nn import torch.nn.functional as F # 假设GraphConvolution类已经定义,这里省略其具体实现 # 该类用于实现图卷积层的具体操作 class GraphConvolution(nn.Module): def __init__(self, in_features, out_features): super(GraphConvolution, self).__init__() self.weight = nn.Parameter(torch.FloatTensor(in_features, out_features)) self.bias = nn.Parameter(torch.FloatTensor(out_features)) self.reset_parameters() def reset_parameters(self): nn.init.xavier_uniform_(self.weight) if self.bias is not None: nn.init.zeros_(self.bias) def forward(self, adj, input): support = torch.mm(input, self.weight) output = torch.spmm(adj, support) if self.bias is not None: return output + self.bias else: return output class GcnNet(nn.Module): """ 定义一个包含两层GraphConvolution的模型 """ def __init__(self, input_dim=1433): super(GcnNet, self).__init__() # 第一层图卷积层,输入维度为input_dim,输出维度为16 self.gcn1 = GraphConvolution(input_dim, 16) # 第二层图卷积层,输入维度为16,输出维度为7 self.gcn2 = GraphConvolution(16, 7) def forward(self, adjacency, feature): # 第一层图卷积操作,然后使用ReLU激活函数 h = F.relu(self.gcn1(adjacency, feature)) # 第二层图卷积操作,得到最终的logits logits = self.gcn2(adjacency, h) return logits ``` ### 代码详细解释 1. **`GraphConvolution`类**:这是自定义的图卷积层类,继承自`nn.Module`。 - `__init__`方法:初始化图卷积层的权重和偏置,并调用`reset_parameters`方法初始化参数。 - `reset_parameters`方法:使用`xavier_uniform_`初始化权重,偏置初始化为零。 - `forward`方法:实现图卷积的前向传播过程,先将输入特征与权重相乘,再与邻接矩阵相乘,最后加上偏置(如果有)。 2. **`GcnNet`类**:定义了一个包含两层图卷积层的GCN模型。 - `__init__`方法:初始化两层图卷积层,第一层输入维度为`input_dim`(默认为1433),输出维度为16;第二层输入维度为16,输出维度为7。 - `forward`方法:实现模型的前向传播过程,第一层图卷积操作后使用ReLU激活函数,第二层图卷积操作得到最终的`logits`。 ### 代码使用示例 ```python # 假设已经有邻接矩阵和特征矩阵 adjacency = torch.randn(100, 100) # 邻接矩阵,这里简单用随机矩阵代替 feature = torch.randn(100, 1433) # 特征矩阵,这里简单用随机矩阵代替 # 创建GCN模型实例 model = GcnNet() # 前向传播 output = model(adjacency, feature) print(output.shape) # 输出形状应该为 (100, 7) ``` ### 总结 上述代码实现了一个简单的两层GCN模型,通过自定义图卷积层类`GraphConvolution`和GCN模型类`GcnNet`,可以方便地进行图数据的特征提取和分类任务。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值