基于python的卷积神经网络,搭建cnn卷积神经网络python代码

  基于python的卷积神经网络,搭建cnn卷积神经网络python代码

  本文主要为大家介绍GCN图卷积神经网络的原理和代码分析。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010 1.图形信号处理知识1.1拉普拉斯矩阵1.1拉普拉斯矩阵的定义和例子1.1.2拉普拉斯矩阵上的正则化傅里叶变换1.3图形信号滤波器2。图卷积神经网络2.1数学定义2.2对GCN和时间复杂度的理解2.3的优缺点3。pytorch码分析

  

目录

  卷积神经网络涉及到图形信号处理的相关知识,也是从图形信号处理领域的知识中衍生出来的。理解图形信号处理的知识是理解卷积神经网络的基础。

  

1. 图信号处理知识

  拉普拉斯矩阵是反映图结构关系的重要矩阵,是图卷积神经网络的重要组成部分。

  

1.1 图的拉普拉斯矩阵

  示例:

  根据上述计算公式,拉普拉斯矩阵可以得到如下:

  

1.1.1 拉普拉斯矩阵的定义及示例

  1.1.3拉普拉斯矩阵的性质

  

1.1.2 正则化拉普拉斯矩阵

  傅立叶变换是一种分析信号的方法,可以分析信号的成分,并从这些成分合成信号。它将信号从时域转换到频域,从频域给出了信号处理的另一种解决方案。(1)对于图形结构,可以定义图形上的傅立叶变换(GFT)。对于图G上的任何信号X,其傅立叶变换表示为:

  从直线生成的角度可以清楚地看到,v1,…,vn构成了N维特征空间中的一组完备基向量,G中的任何图信号都可以表示为这些基向量的线性加权和,系数就是图信号对应的傅立叶基上的傅立叶系数。

  回到前面提到的描述平滑度总变化的拉普拉斯矩阵:

  可以看出,图的光滑度总变差是图中所有节点特征值的线性组合,权值是傅立叶系数的平方。总变差的最小值是图形信号与最小特征值对应的特征向量重合的条件。结合其描述图形信号整体平滑性的意义,特征值可以等效为频率:特征值越低,频率越低,对应的傅立叶基变化越慢,即相邻节点的信号值趋于一致。

  一个图信号所有傅立叶系数的组合称为谱,频域视角从全局角度既考虑信号本身,又考虑图的结构性质。

  

1.2 图上的傅里叶变换

  图形滤波器增强或衰减图形中的频率成分,图形滤波器算子的核心是其频率响应矩阵,给滤波器带来不同的滤波效果。

  因此,图形滤波器根据滤波效果可分为低通、高通和带通。

  低通滤波器:保留低频部分,注意信号的平滑部分;

  高通滤波器:保留高频部分,注意信号的剧烈变化部分;

  带通滤波器:保留部分特定频段;

  而拉普拉斯矩阵多项式扩展可以形成图滤波器h:

  

1.3 图信号滤波器

  

2. 图卷积神经网络

  卷积运算的数学

  定义为:

  

  上述公式存在一个较大问题:学习参数为N,这涉及到整个图的所有节点,对于大规模数据极易发生过拟合。

  进一步的化简推导:将之前说到的拉普拉斯矩阵的多项式展开代替上述可训练参数矩阵。

  

  此结构内容即定义为图卷积层(GCN layer),有图卷积层堆叠得到的网络模型即为图卷积网络GCN。

  

  

2.2 GCN的理解及时间复杂度

  图卷积层是对频率响应矩阵的极大化简,将本要训练的图滤波器直接退化为重归一化拉普拉斯矩阵

  

  

  

2.3 GCN的优缺点

  优点:GCN作为近年图神经网络的基础之作,对处理图数据非常有效,其对图结构的结构信息和节点的属性信息同时学习,共同得到最终的节点特征表示,考虑到了节点之间的结构关联性,这在图操作中是非常重要的。

  缺点:过平滑问题(多层叠加之后,节点的表示向量趋向一致,节点难以区分),由于GCN具有一个低通滤波器的作用(j聚合特征时使得节点特征不断融合),多次迭代后特征会趋于相同。

  

  

3. Pytorch代码解析

  GCN层的pytorch实现:

  

class GraphConvolutionLayer(nn.Module):

   图卷积层:Lsym*X*W

   其中 Lsym表示正则化图拉普拉斯矩阵, X为输入特征, W为权重矩阵, X表示输出特征;

   *表示矩阵乘法

   def __init__(self, input_dim, output_dim, use_bias=True):

   #初始化, parameters: input_dim-->输入维度, output_dim-->输出维度, use_bias-->是否使用偏置项, boolean

   super(GraphConvolutionLayer,self).__init__()

   self.input_dim=input_dim

   self.output_dim=output_dim

   self.use_bias=use_bias #是否加入偏置, 默认为True

   self.weight=nn.Parameter(torch.Tensor(input_dim, output_dim))#权重矩阵为可训练参数

   if self.use_bias==True: #加入偏置

   self.bias=nn.Parameter(torch.Tensor(output_dim))

   else: #设置偏置为空

   self.register_parameter(bias, None)

   self.reset_parameters()

   def reset_parameters(self):

   #初始化参数

   stdv = 1. / math.sqrt(self.weight.size(1))

   self.weight.data.uniform_(-stdv, stdv)#使用均匀分布U(-stdv,stdv)初始化权重Tensor

   if self.bias is not None:

   self.bias.data.uniform_(-stdv, stdv)

   def forward(self, adj, input_feature):

   #前向传播, parameters: adj-->邻接矩阵(输入为正则化拉普拉斯矩阵), input_future-->输入特征矩阵

   temp=torch.mm(input_feature, self.weight)#矩阵乘法, 得到X*W

   output_feature=torch.sparse.mm(adj, temp)#由于邻接矩阵adj为稀疏矩阵, 采用稀疏矩阵乘法提高计算效率, 得到Lsym*temp=Lsym*X*W

   if self.use_bias==True: #若设置了偏置, 加入偏置项

   output_feature+=self.bias

   return output_feature

  

  定义两层的GCN网络模型:

  

class GCN(nn.Module):

   定义两层GCN网络模型

   def __init__(self, input_dim, hidden_dim, output_dim):

   #初始化, parameters: input_dim-->输入维度, hidden_dim-->隐藏层维度, output_dim-->输出维度

   super.__init__(GCN, self).__init__()

   #定义两层图卷积层

   self.gcn1=GraphConvolutionLayer(input_dim, hidden_dim)

   self.gcn2=GraphConvolutionLayer(hidden_dim, output_dim)

   def forward(self, adj, feature):

   #前向传播, parameters: adj-->邻接矩阵, feature-->输入特征

   x=F.relu(self.gcn1(adj, feature))

   x=self.gcn2(adj, x)

   return F.log_softmax(x, dim=1)

  

  以上就是GCN图卷积神经网络原理及代码解析的详细内容,更多关于GCN图卷积神经网络的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: