图深度学习入门教程(九)——图滤波神经网络模型
本教程是一个系列免费教程,争取每月更新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模型的思想会比模型本身的意义更大。该模型提供了一个非常好的思路,可以使非欧数据与深度学习技术更好的结合到一起。
- 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 数组属性和方法
- Head First设计模式——组合模式
- mmap概述
- 什么是计算机程序?操作系统、指令、进程、线程等
- Head First设计模式——状态模式
- Head First设计模式——代理模式
- [Maven]告警[WARNING] Unable to create Maven project from repository.
- Head First设计模式——复合模式
- [System.currentTimeMillis]/[Calendar.getInstance().getTimeInMillis()]/[new Date().getTime()]
- 【每日一题】32. Longest Valid Parentheses
- 面经手册 · 第3篇《HashMap核心知识,扰动函数、负载因子、扩容链表拆分深度学习(+实践验证)》
- Head First设计模式——桥接模式
- Head First设计模式——生成器模式和责任链模式
- Head First设计模式——蝇量模式和解释器模式
- 【每日一题】33. Search in Rotated Sorted Array
- 【每日一题】34. Find First and Last Position of Element in Sorted Array