图深度学习入门教程(九)——图滤波神经网络模型
本教程是一个系列免费教程,争取每月更新2到4篇。(由于精力有限,近期停止了一段时间,在此向大家道个歉)。
主要是基于图深度学习的入门内容。讲述最基本的基础知识,其中包括深度学习、数学、图神经网络等相关内容。该教程由代码医生工作室出版的全部书籍混编节选而成。偏重完整的知识体系和学习指南。在实践方面不会涉及太多基础内容 (实践和经验方面的内容,请参看原书)。
文章涉及使用到的框架以PyTorch和TensorFlow为主。默认读者已经掌握Python和TensorFlow基础。如有涉及到PyTorch的部分,会顺带介绍相关的入门使用。
本教程主要针对的人群:
- 已经掌握TensorFlow基础应用,并想系统学习的学者。
- PyTorch学习者
- 正在从TensorFlow转型到PyTroch的学习者
- 已经掌握Python,并开始学习人工智能的学者。
在上一篇的结尾出介绍了GfNN模型可以SGC网络可以弥补SGC模型无法拟合非线性数据的不足。本篇就来介绍下GfNN模型的结构、原理以及在DGL中的实现。
1 了解GfNN的网络结构
图滤波神经网络 (Graph filter Neural Network, GfNN)模型的主要思想就是在SGC模型后面加入深度学习中的非线性拟合功能。通过这种方式来弥补SGC网络无法拟合非线性数据的不足。
在掌握了SGC和深度神经网络的基础上,会很容易理解GfNN的结构。GfNN的结构只是在SGC后面加了1层全连接网络而已。如图10-17所示。
从图中,可以看到GfNN和GCN具有相似的高性能。由于GfNN在学习阶段不需要邻接矩阵的乘法,因此它比GCN要快得多。此外,GfNN对噪声的容忍度也更高。
GfNN模型更像是一个框架。框架中包含了两部分:
(1)通过多跳的方式,将图信息融合到图解点特征中。
(2)用深度学习的方法,对融合后的图节点特征进行拟合。
基于这个框架,可以不仅仅限于图10-17中的全连接神经网络结构。在实际应用中,可以像普通的深度学习任务一样,根据数据的特征和任务的特点,选用适合的神经网络来搭建模型。
有关GfNN的更多详细信息可以参考论文(arXiv: 1905.09550,2019)
2 了解DGL库中GfNN的实现方式
在SGConv代码的基础稍加修改就可以实现一个带有全连接的GfNN模型。
2.1. DGL库中GfNN的代码实现
实现SGConv类的主要代码如下:
代码文件: dglGfNN.py(片段)
01 class GfNN(nn.Module): #定义GfNN类
02 def __init__(self,in_feats, n_hidden, n_classes,
03 k, activation, dropout, cached=True,bias=False):
04 super(GfNN, self).__init__()
05 self.activation = activation #激活函数
06 self.sgc = SGConv(in_feats, n_hidden, k,cached, bias)
07 self.fc = nn.Linear(n_hidden, n_classes)
08 self.dropout = nn.Dropout(p=dropout)
09 def forward(self, g,features):
10 x = self.activation(self.sgc(g,features))#对SGC结果进行非线性变换
11 x = self.dropout(x)
12 return self.fc(x) #对变换后的特征进行全连接处理
13
14 model = GfNN(feats_dim,n_hidden=512,n_classes=n_classes, #实例化GfNN模型
15 k=2,activation= nn.PReLU(512) ,dropout = 0.2)
代码第14行演示了实例化GfNN模型的过程。一般使用激活函数PReLU效果会更好一些。
2.2. 技术细节:什么是PReLU激活函数
PReLU:是一个ReLU激活函数的变种,其数学公式如下。
其中, a是一个调节参数,该参数可以通过自学习得来。
在PyTorch中,PReLU的原形定义如下:
torch.nn.PReLU(num_parameters=1, init=0.25)
其中参数num_parameters代表可学习参数的个数,init代表可学习参数的初始值。
2.3. GfNN模型的思想
GfNN模型的思想会比模型本身的意义更大。该模型提供了一个非常好的思路,可以使非欧数据与深度学习技术更好的结合到一起。
- JavaWeb02-CSS,JS(Java真正的全栈开发)
- 数据处理——One-Hot Encoding
- JavaWeb20-文件上传;下载(Java真正的全栈开发)
- 转--每周一个GoLang设计模式之组合模式
- 简单易学的机器学习算法——Softmax Regression
- JavaWeb19-Listener ; Filter
- dataguard归档路径的问题(r7笔记第99天)
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- JavaWeb18-jquery学习笔记(Java全栈开发)
- 简单易学的机器学习算法——Apriori算法
- 厚土Go学习笔记 | 29. 接口
- MySQL删除数据的简单尝试 (r7笔记第98天)
- 简单易学的机器学习算法——lasso
- 优化算法——差分进化算法(DE)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 记一次生产服务器进程突然消失问题排查!
- 0812-7.1.3-如何使用Ranger给HBase授权
- Redis集群方案对比:Codis、Twemproxy、Redis Cluster
- 这就是你日日夜夜想要的docker!!!---------Docker镜像制作与私有仓库建立
- 排障集锦:九九八十一难之第十八难!-----System has not been booted with systemd as init system (PID 1). Can‘t operat
- 深入了解 Flex 属性
- 如何设计一个安全的短信接口?
- ERROR Shell:396 - Failed to locate the winutils binary in the hadoop binary path java.io.IOE...
- Windows 安装配置 PySpark 开发环境(详细步骤+原理分析)
- 安利三个关于Python字符串格式化进阶知识
- TCP/IP学习笔记1——协议分层
- 用Python爬取淘宝4403条大裤衩数据进行分析,终于找到可以入手的那一条
- Python 微信机器人:属于自己的微信机器人制作,简单易懂。图灵机器人接口api调用。
- 最全总结:把模块当做脚本来执行的 7 种案例及其原理
- 经典八种排序算法总结(带动画演示)