python机器学习GCN图卷积神经网络原理解析

目录
  • 1. 图信号处理知识
    • 1.1 图的拉普拉斯矩阵
      • 1.1.1 拉普拉斯矩阵的定义及示例
      • 1.1.2 正则化拉普拉斯矩阵
    • 1.2 图上的傅里叶变换
    • 1.3 图信号滤波器
  • 2. 图卷积神经网络
    • 2.1 数学定义
    • 2.2 GCN的理解及时间复杂度
    • 2.3 GCN的优缺点
  • 3. Pytorch代码解析

1. 图信号处理知识

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

1.1 图的拉普拉斯矩阵

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

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

实例:

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

1.1.2 正则化拉普拉斯矩阵

1.1.3 拉普拉斯矩阵的性质

1.2 图上的傅里叶变换

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

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

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

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

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

1.3 图信号滤波器

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

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

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

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

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

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

2. 图卷积神经网络

2.1 数学定义

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

上述公式存在一个较大问题:学习参数为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图卷积神经网络的资料请关注我们其它相关文章!

(0)

相关推荐

  • 深度卷积神经网络各种改进结构块汇总

    目录 学习前言 1.残差网络 2.不同大小卷积核并行卷积 3.利用(1,x),(x,1)卷积代替(x,x)卷积 4.采用瓶颈(Bottleneck)结构 5.深度可分离卷积 6.改进版深度可分离卷积+残差网络 7.倒转残差(Inverted residuals)结构 8.并行空洞卷积 学习前言 看了好多代码呀,看了后面忘了前面,这个BLOG主要是记录一些神经网络的改进结构,比如残差结构那种,记录下来有助于自己设计一些轻且好的网络. 1.残差网络 这个网络主要源自于Resnet网络,其作用是: 将

  • PyG搭建GCN需要准备的数据格式

    目录 前言 1. PyG数据集 2. 构造数据集 前言 有关GCN的原理可以参考:ICLR 2017 | GCN:基于图卷积网络的半监督分类. 一开始是打算手写一下GCN,毕竟原理也不是很难,但想了想还是直接调包吧.在使用各种深度学习框架时我们首先需要知道的是框架内的数据集结构,因此这篇文章主要讲讲PyG中的数据结构. 1. PyG数据集 原始论文中使用的数据集: 本篇文章使用Citeseer网络.Citeseer网络是一个引文网络,节点为论文,一共3327篇论文.论文一共分为六类:Agents

  • 图神经网络GNN算法基本原理详解

    目录 前言 1. 数据 2. 变量定义 3. GNN算法 3.1 Forward 3.2 Backward 4.总结与展望 前言 本文结合一个具体的无向图来对最简单的一种GNN进行推导.本文第一部分是数据介绍,第二部分为推导过程中需要用的变量的定义,第三部分是GNN的具体推导过程,最后一部分为自己对GNN的一些看法与总结. 1. 数据 利用networkx简单生成一个无向图: # -*- coding: utf-8 -*- """ @Time : 2021/12/21 11:

  • PyG搭建GCN模型实现节点分类GCNConv参数详解

    目录 前言 模型搭建 1. 前向传播 2. 反向传播 3. 训练 4. 测试 完整代码 前言 在上一篇文章PyG搭建GCN前的准备:了解PyG中的数据格式中大致了解了PyG中的数据格式,这篇文章主要是简单搭建GCN来实现节点分类,主要目的是了解PyG中GCN的参数情况. 模型搭建 首先导入包: from torch_geometric.nn import GCNConv 模型参数: in_channels:输入通道,比如节点分类中表示每个节点的特征数. out_channels:输出通道,最后一

  • python机器学习GCN图卷积神经网络原理解析

    目录 1. 图信号处理知识 1.1 图的拉普拉斯矩阵 1.1.1 拉普拉斯矩阵的定义及示例 1.1.2 正则化拉普拉斯矩阵 1.2 图上的傅里叶变换 1.3 图信号滤波器 2. 图卷积神经网络 2.1 数学定义 2.2 GCN的理解及时间复杂度 2.3 GCN的优缺点 3. Pytorch代码解析 1. 图信号处理知识 图卷积神经网络涉及到图信号处理的相关知识,也是由图信号处理领域的知识推导发展而来,了解图信号处理的知识是理解图卷积神经网络的基础. 1.1 图的拉普拉斯矩阵 拉普拉斯矩阵是体现图

  • python通过opencv实现图片裁剪原理解析

    这篇文章主要介绍了python通过opencv实现图片裁剪原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 图像裁剪的基本概念 : 图像裁剪是指将图像中我们想要的研究区以外的区域去除,经常是按照行政区划或研究区域的边界对图像进行裁剪.例如,一张500×400的图像,我们只想要中间的250×200的区域,就可以使用图像裁剪将四周的区域去除. 在实际开发工作中,我们经常需要对图像进行分幅裁剪,按照ERDAS实际图像分幅裁剪的过程,可以将图像分

  • Python实现简单的"导弹" 自动追踪原理解析

    自动追踪算法,在我们设计2D射击类游戏时经常会用到,这个听起来很高大上的东西,其实也并不是军事学的专利,在数学上解决的话需要去解微分方程, 这个没有点数学基础是很难算出来的.但是我们有了计算机就不一样了,依靠计算机极快速的运算速度,我们利用微分的思想,加上一点简单的三角学知识,就可以实现它. 好,话不多说,我们来看看它的算法原理,看图: 由于待会要用pygame演示,他的坐标系是y轴向下,所以这里我们也用y向下的坐标系. 算法总的思想就是根据上图,把时间t分割成足够小的片段(比如1/1000,这

  • Python编程pytorch深度卷积神经网络AlexNet详解

    目录 容量控制和预处理 读取数据集 2012年,AlexNet横空出世.它首次证明了学习到的特征可以超越手工设计的特征.它一举打破了计算机视觉研究的现状.AlexNet使用了8层卷积神经网络,并以很大的优势赢得了2012年的ImageNet图像识别挑战赛. 下图展示了从LeNet(左)到AlexNet(right)的架构. AlexNet和LeNet的设计理念非常相似,但也有如下区别: AlexNet比相对较小的LeNet5要深得多. AlexNet使用ReLU而不是sigmoid作为其激活函数

  • python人工智能tensorflow构建卷积神经网络CNN

    目录 简介 隐含层介绍 1.卷积层 2.池化层 3.全连接层 具体实现代码 卷积层.池化层与全连接层实现代码 全部代码 学习神经网络已经有一段时间,从普通的BP神经网络到LSTM长短期记忆网络都有一定的了解,但是从未系统的把整个神经网络的结构记录下来,我相信这些小记录可以帮助我更加深刻的理解神经网络. 简介 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),

  • python @propert装饰器使用方法原理解析

    这篇文章主要介绍了python @propert装饰器使用方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 首先,@propert的作用是把类中的方法『变成』了属性,方便通过实例访问.propert可以有两种用法:可以把一个方法变成只读属性:可以对一些属性进行过滤. 想象这样一个场景,在实例化一个类之后,需要对类的一个属性进行赋值,这时候是没有对属性属性被赋予的值进行判断的,如果属性被赋予了一个不合适的值,那么代码在后面执行的时候就会

  • Python中使用gflags实例及原理解析

    这篇文章主要介绍了Python中使用gflags实例及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 安装命令pip install python-gflags 使用示例: import gflags FLAGS = gflags.FLAGS gflags.DEFINE_string('name', 'ming', 'this is a value') gflags.DEFINE_integer('qps', 0, 'test qps'

  • Python深度学习pytorch卷积神经网络LeNet

    目录 LeNet 模型训练 在本节中,我们将介绍LeNet,它是最早发布的卷积神经网络之一.这个模型是由AT&T贝尔实验室的研究院Yann LeCun在1989年提出的(并以其命名),目的是识别手写数字.当时,LeNet取得了与支持向量机性能相媲美的成果,成为监督学习的主流方法.LeNet被广泛用于自动取款机中,帮助识别处理支票的数字. LeNet 总体来看,LeNet(LeNet-5)由两个部分组成: 卷积编码器: 由两个卷积层组成 全连接层密集快: 由三个全连接层组成 每个卷积块中的基本单元

  • Python DNS查询放大攻击实现原理解析

    查询放大攻击的原理是,通过网络中存在的DNS服务器资源,对目标主机发起的拒绝服务攻击,其原理是伪造源地址为被攻击目标的地址,向DNS递归服务器发起查询请求,此时由于源IP是伪造的,固在DNS服务器回包的时候,会默认回给伪造的IP地址,从而使DNS服务成为了流量放大和攻击的实施者,通过查询大量的DNS服务器,从而实现反弹大量的查询流量,导致目标主机查询带宽被塞满,实现DDOS的目的. 此时我们使用scapy工具构建一个DNS请求数据包 sr1(IP(dst="8.8.8.8")/UDP(

  • python 上下文管理器及自定义原理解析

    这篇文章主要介绍了python 上下文管理器原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python 提供了 with 语法用于简化资源操作的后续清除操作,是 try/finally 的替代方法,实现原理建立在上下文管理器之上. Python 提供了一个 contextmanager 装饰器,更进一步简化上下管理器的实现方式. 上下文管理器是Python2.5之后才出现的概念.上下文管理器规定了某个对象的使用范围,当进入或者离开了使

随机推荐