python 学习GCN图卷积神经网络

图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网络的基础。

Posted in Python onMay 11, 2022

1. 图信号处理知识

图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网络的基础。

1.1 图的拉普拉斯矩阵

拉普拉斯矩阵是体现图结构关联的一种重要矩阵,是图卷积神经网络的一个重要部分。

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

python 学习GCN图卷积神经网络

实例:

python 学习GCN图卷积神经网络

按照上述计算式子,可以得到拉普拉斯矩阵为:

python 学习GCN图卷积神经网络

1.1.2 正则化拉普拉斯矩阵

python 学习GCN图卷积神经网络

1.1.3 拉普拉斯矩阵的性质

python 学习GCN图卷积神经网络

1.2 图上的傅里叶变换

傅里叶变换是一种分析信号的方法,它可分析信号的成分,也可用这些成分合成信号。它将信号从时域转换到频域,从频域视角给出了信号处理的另一种解法。(1)对于图结构,可以定义图上的傅里叶变换(GFT),对于任意一个在图G上的信号x,其傅里叶变换表示为:

python 学习GCN图卷积神经网络

从线代角度,可以清晰的看出:v1,…, vn构成了N维特征空间中的一组完备基向量,G中任意一个图信号都可表示为这些基向量的线性加权求和,系数为图信号对应傅里叶基上的傅里叶系数。

回到之前提到的拉普拉斯矩阵刻画平滑度的总变差:

python 学习GCN图卷积神经网络

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

把图信号所有的傅里叶系数结合称为频谱(spectrum),频域的视角从全局视角既考虑信号本身,也考虑到图的结构性质。

1.3 图信号滤波器

图滤波器(Graph Filter)为对图中的频率分量进行增强或衰减,图滤波算子核心为其频率响应矩阵,为滤波器带来不同的滤波效果。

故图滤波器根据滤波效果可分为低通,高通和带通。

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

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

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

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

python 学习GCN图卷积神经网络

2. 图卷积神经网络

2.1 数学定义

图卷积运算的数学定义为:

python 学习GCN图卷积神经网络

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

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

python 学习GCN图卷积神经网络

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

2.2 GCN的理解及时间复杂度

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

python 学习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图卷积神经网络原理及代码解析的详细内容!


Tags in this post...

Python 相关文章推荐
Python中使用partial改变方法默认参数实例
Apr 28 Python
python 容器总结整理
Apr 04 Python
python处理xml文件的方法小结
May 02 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python基于socket模块实现UDP通信功能示例
Apr 10 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
python3 深浅copy对比详解
Aug 12 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
Apr 13 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 #Python
Python 绘制多因子柱状图
PyCharm 配置SSH和SFTP连接远程服务器
May 11 #Python
Python 文字识别
May 11 #Python
解决Python保存文件名太长OSError: [Errno 36] File name too long
May 11 #Python
Python 匹配文本并在其上一行追加文本
May 11 #Python
Python 一键获取电脑浏览器的账号密码
May 11 #Python
You might like
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
php数据序列化测试实例详解
2017/08/12 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
第一章之初识Bootstrap
2016/04/25 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
vue2配置scss的方法步骤
2019/06/06 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
自我评价的写作规则
2014/01/06 职场文书
中学自我评价
2014/01/31 职场文书
副总经理岗位职责
2014/03/16 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
个人授权委托书格式
2014/08/30 职场文书
上课不认真检讨书
2014/09/17 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python