文章目录

  • 一、基本概念
  • 二、PGL使用
  • 三、图论基础

课程地址: 图神经网络7日打卡营

一、基本概念

图:由节点和边组成的 G=(V, E)vertice是节点,edge是边,例如社交网络中每个人就是节点,人与人之间的关系就是边

图学习:语音、图像和文本有规则的数据结构,对于不规则的数据如社交网络,使用图学习可以方便的处理不规则数据,充分利用图结构的信息。

图学习的应用:

  • 节点级别任务:金融诈骗检测中,节点是用户和商家,边是用户和商家之间的交互,利用图模型预测潜在的金融诈骗分子。在目标检测案例中,将3D点云数据中点与点之间距离作为边,通过图结构可以进行3D目标检测
  • 边级别任务:推荐系统中,通过已有的用户-商品数据建立用户图行为关系,得到节点的向量表示,进而进行推荐任务
  • 图级别任务:气味识别,利用图神经网络识别分子结构进而识别气味

图学习算法的分类:

二、PGL使用

PGL是图学习的框架,安装方式如下:

pip install pgl

PGL的优点:

  • 易用性:建图方便
  • 高效性:运行速度快
  • 大规模:支持十亿节点百亿边
  • 丰富性:预置了主流的图学习算法

PGL简单代码实现

import pgl
from pgl import graph  # 导入 PGL 中的图模块
import paddle.fluid as fluid # 导入飞桨框架
import numpy as npdef build_graph():# 定义图中的节点数目,我们使用数字来表示图中的每个节点num_nodes = 10# 定义图中的边集edge_list = [(2, 0), (2, 1), (3, 1),(4, 0), (5, 0),(6, 0), (6, 4), (6, 5), (7, 0), (7, 1),(7, 2), (7, 3), (8, 0), (9, 7)]# 随机初始化节点特征,特征维度为 dd = 16feature = np.random.randn(num_nodes, d).astype("float32")# 随机地为每条边赋值一个权重edge_feature = np.random.randn(len(edge_list), 1).astype("float32")# 创建图对象,最多四个输入g = graph.Graph(num_nodes = num_nodes,edges = edge_list,node_feat = {'feature':feature},edge_feat ={'edge_feature': edge_feature})return gg = build_graph()

首先创建图,最多需要四个输入:节点数目、边集、节点特征和边的权重

def model_layer(gw, nfeat, efeat, hidden_size, name, activation):'''gw: GraphWrapper 图数据容器,用于在定义模型的时候使用,后续训练时再feed入真实数据nfeat: 节点特征efeat: 边权重hidden_size: 模型隐藏层维度activation: 使用的激活函数'''# 定义 send 函数def send_func(src_feat, dst_feat, edge_feat):# 将源节点的节点特征和边权重共同作为消息发送return src_feat['h'] * edge_feat['e']# 定义 recv 函数def recv_func(feat):# 目标节点接收源节点消息,采用 sum 的聚合方式return fluid.layers.sequence_pool(feat, pool_type='sum')# 触发消息传递机制msg = gw.send(send_func, nfeat_list=[('h', nfeat)], efeat_list=[('e', efeat)])output = gw.recv(msg, recv_func)output = fluid.layers.fc(output,size=hidden_size,bias_attr=False,act=activation,name=name)return output

定义图模型层,包括send函数,rece函数和消息传递机制

class Model(object):def __init__(self, graph):"""graph: 我们前面创建好的图"""# 创建 GraphWrapper 图数据容器,用于在定义模型的时候使用,后续训练时再feed入真实数据self.gw = pgl.graph_wrapper.GraphWrapper(name='graph',node_feat=graph.node_feat_info(),edge_feat=graph.edge_feat_info())# 作用同 GraphWrapper,此处用作节点标签的容器self.node_label = fluid.layers.data("node_label", shape=[None, 1],dtype="float32", append_batch_size=False)def build_model(self):# 定义两层model_layeroutput = model_layer(self.gw, self.gw.node_feat['feature'], self.gw.edge_feat['edge_feature'],hidden_size=8, name='layer_1', activation='relu')output = model_layer(self.gw, output, self.gw.edge_feat['edge_feature'],hidden_size=1, name='layer_2', activation=None)# 对于二分类任务,可以使用以下 API 计算损失loss = fluid.layers.sigmoid_cross_entropy_with_logits(x=output, label=self.node_label)# 计算平均损失loss = fluid.layers.mean(loss)# 计算准确率prob = fluid.layers.sigmoid(output)pred = prob > 0.5pred = fluid.layers.cast(prob > 0.5, dtype="float32")correct = fluid.layers.equal(pred, self.node_label)correct = fluid.layers.cast(correct, dtype="float32")acc = fluid.layers.reduce_mean(correct)return loss, acc

定义两层图模型

# 是否在 GPU 或 CPU 环境运行
use_cuda = False
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()# 定义程序,也就是我们的 Program
startup_program = fluid.Program() # 用于初始化模型参数
train_program = fluid.Program()   # 训练时使用的主程序,包含前向计算和反向梯度计算
test_program = fluid.Program()    # 测试时使用的程序,只包含前向计算with fluid.program_guard(train_program, startup_program):model = Model(g)# 创建模型和计算 Lossloss, acc = model.build_model()# 选择Adam优化器,学习率设置为0.01adam = fluid.optimizer.Adam(learning_rate=0.01)adam.minimize(loss) # 计算梯度和执行梯度反向传播过程# 复制构造 test_program,与 train_program的区别在于不需要梯度计算和反向过程。
test_program = train_program.clone(for_test=True)# 定义一个在 place(CPU)上的Executor来执行program
exe = fluid.Executor(place)
# 参数初始化
exe.run(startup_program) # 获取真实图数据
feed_dict = model.gw.to_feed(g)
# 获取真实标签数据
# 由于我们是做节点分类任务,因此可以简单的用0、1表示节点类别。其中,黄色点标签为0,绿色点标签为1。
y = [0,1,1,1,0,0,0,1,0,1]
label = np.array(y, dtype="float32")
label = np.expand_dims(label, -1)
feed_dict['node_label'] = label

训练前准备

for epoch in range(30):train_loss = exe.run(train_program,feed=feed_dict,      # feed入真实训练数据fetch_list=[loss],   # fetch出需要的计算结果return_numpy=True)[0]print('Epoch %d | Loss: %f' % (epoch, train_loss))test_acc = exe.run(test_program, feed=feed_dict, fetch_list=[acc], return_numpy=True)[0]
print("Test Acc: %f" % test_acc)

训练及测试

三、图论基础

百度图神经网络学习——day01相关推荐

  1. 百度图神经网络学习——day05:图神经网络进阶模型

    文章目录 一.ERNISage 1.ERNIESage Node 2.ERNIESage Edge 3.ERNIESage 1-Neighbour 二.UniMP 三.编程实践 1.ERNIESage ...

  2. 百度图神经网络学习——day04:图神经网络算法(二)

    文章目录 一.图采样 1.GraphSAGE 2.PinSAGE 二.邻居聚合 1.GIN模型的聚合函数 2.其他复杂的聚合函数 三.编程实现 1.GraphSage采样函数实现 2.GraphSag ...

  3. 百度图神经网络学习——day03:图神经网络算法(一)

    文章目录 一.图卷积网络(Graph Convolutional Network) 1.核心公式 2.算法流程 二.图注意力算法(GAT) 1.计算方法 2.多头Attention 三.空间GNN 四 ...

  4. 百度图神经网络学习——day02:图游走类模型

    文章目录 一.DeepWalk和node2vec 1.DeepWalk 2.node2vec 二.methpath2vec及其变种 三.编程实践 1.DeepWalk实现 2.SkipGram模型训练 ...

  5. 【论文解读】Graph Normalization (GN):为图神经网络学习一个有效的图归一化

    作者|平安产险视觉计算组 编辑丨极市平台 本文为极市开发者投稿,转载请获授权. 极市专栏 论文推荐:在图神经网络里面,应该如何选择更好的归一化技术?本文将介绍一种为图神经网络学习有效的图归一化的方式. ...

  6. 逆势而上的技术:图神经网络学习来了!

    要问这几年一直在逆势而上的技术有哪些?你一定不会忽略它--图神经网络. 相比传统神经网络,图神经网络的优势非常明显: 1.非顺序排序的特征学习:GNN的输出不以节点的输入顺序为转移的. 2.两个节点之 ...

  7. 2023.2.9,周四【图神经网络 学习记录23】动态图算法 之 SGNN(DGNN):更新组件(update component),传播组件(propagation component)

    路虽远,行则将至. 声明:仅学习使用. 前情提要: 2023.2.9,周四[图神经网络 学习记录22]动态图算法 之 EvolveGCN:离散型动态GNN网络,将GNN和RNN结合到同一层,结合时间和 ...

  8. 2023.2.3,周五【图神经网络 学习记录17】二部图——BiNE算法:显式关系,隐式关系;新的随机游走方式 特点:随机游走次数 是跟节点中心性相关的,在随机游走的过程中 添加一个停止随机游走的概率

    声明:仅学习使用~ 前情提要: 2023.2.2,周四[图神经网络 学习记录16]异构图Graph Embedding算法--GATNE(异构图多属性 多边 类型算法),不建议普通PC跑-PyChar ...

  9. 【GNN报告】考虑拓扑信息的图神经网络学习

    1.简介 打算之后在本博客里存放BAAI里面邀请的所有演讲者有关GNN的报告学习(本人筛选的都是自己感兴趣的或者感觉还不错的) 2.报告 腾讯林衍凯:图神经网络,考虑「拓扑信息」会怎样? [专栏:前沿 ...

最新文章

  1. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin
  2. 新手用python2还是3-新手用python2还是3
  3. Redis 主从复制的原理及演进
  4. 语言设计谁年龄大_这桌子谁设计的?脑洞够大,除能360°翻转,打台球,乒乓球都行...
  5. 谷歌地图VS苹果地图:大数据领域竞争
  6. IDEA VUE项目报错 Export declarations are not supported by current JavaScript version
  7. 初学react.js
  8. 点击按钮跳转页面_获取快手主页跳转url scheme 协议的方法(app通用方法)
  9. QT5入门学习(一)
  10. 使用JavaScript开发IE浏览器本地插件实例
  11. 杂记-2018.04.09
  12. 180501 逆向-RedHat(Reverse)
  13. 前端页面查看PDF文档内容总结
  14. arduino yun 京东_ArduinoYun教程之配置Arduino Yun环境
  15. Trips CodeForces - 1037E
  16. power 见解_客户见解的两个简单来源,可改善用户体验
  17. 应对大厂面试,我是如何学会React Hooks的
  18. RabbitMQ 创建 virtual host
  19. word快速制作多个单面桌签、号码牌等
  20. SparkContext应用:rdd算子 sql练习

热门文章

  1. 前端综合学习笔记---异步、ES6/7、Module、Promise同步 vs 异步
  2. 几个查看进程及日志的命令
  3. NSOperation 开发
  4. 【实战-Linux】--搭建CA认证中心实现https取证
  5. linux文件系统格式化
  6. 关闭linux日志功能后性能测试
  7. 前端自动化测试概览【超全面介绍】包你学废
  8. spss分析qpcr数据_谁说菜鸟不会数据分析--SPSS篇
  9. 这些面试用例设计,你肯定遇到过(朋友圈、电梯、发红包、支付)
  10. ❤️不一样的测试之旅:医疗行业软件测试有什么不一样?❤️