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多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
简单讲解Python中的闭包
Aug 11 Python
Python如何实现守护进程的方法示例
Feb 08 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python: 判断tuple、list、dict是否为空的方法
Oct 22 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
Django项目后台不挂断运行的方法
Aug 31 Python
python自动识别文本编码格式代码
Dec 26 Python
Python模块/包/库安装的六种方法及区别
Feb 24 Python
Python API 操作Hadoop hdfs详解
Jun 06 Python
Scrapy爬虫文件批量运行的实现
Sep 30 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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中文本数据翻页(留言本翻页)
2006/10/09 PHP
PHP静态新闻列表自动生成代码
2007/06/14 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
js获取提交的字符串的字节数
2009/02/09 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
2011/06/28 Javascript
jQuery表格列宽可拖拽改变且兼容firfox
2014/09/03 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
ionic实现带字的toggle滑动组件
2016/08/27 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
vue基于element的区间选择组件
2018/09/07 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
Python编程入门的一些基本知识
2015/05/13 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
python中实现将多个print输出合成一个数组
2018/04/19 Python
使用Django启动命令行及执行脚本的方法
2018/05/29 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
体育教师自荐信范文
2013/12/16 职场文书
教育孩子心得体会
2014/01/01 职场文书
投标邀请书范文
2014/01/31 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
工厂车间标语
2014/06/19 职场文书
解除劳动关系协议书2篇
2014/11/28 职场文书
小学优秀教师材料
2014/12/15 职场文书
建立共青团委员会的请示
2019/04/02 职场文书
CSS中使用grid布局实现一套模板多种布局
2022/07/15 HTML / CSS