pytorch geometric GraphSAGE代码样例reddit和ogbn_products_sage,为何subgraph_loader将sizes设成[-1]
pytorch geometric GraphSAGE代码样例reddit和ogbn_products_sage,为何subgraph_loader将sizes设成[-1]
- loader
- inference
loader
关于GraphSAGE
,pytorch geometric
的作者给出了给了两个代码样例reddit和ogbn_prodcuts_sage。ogbn_prodcuts_sage中,模型在做训练和推断的时候,data loader
分别是按照以下方式定义的:
train_loader = NeighborSampler(data.edge_index, node_idx=train_idx,sizes=[15, 10, 5], batch_size=1024,shuffle=True, num_workers=12)
subgraph_loader = NeighborSampler(data.edge_index, node_idx=None, sizes=[-1],batch_size=4096, shuffle=False,num_workers=12)
从train_loader
的sizes=[15, 10, 5]
,可以看出来这是一个三层sage
卷积的图网络,从第一层到第三层抽样的邻居数目分别是15, 10, 5
。做推断的时候,我们就不会再用邻居抽样了,而是选取全部的邻居。因此subgraph_loader
中的sizes
设成了[-1]
。但是[-1]
只取了所有的一阶邻居,而这是一个三层的图网络,为什么不设成[-1, -1, -1]
,取所有的三阶邻居呢?
关于pytorch geometric
中的loader
是如何工作的,这篇博文中有提到(pytorch geometric教程四 利用NeighorSampler实现节点维度的mini-batch + GraphSAGE样例)。
inference
回答这个问题前,我们看一下这个代码样例中的inference
函数,我加上了一些注释:
def inference(self, x_all):pbar = tqdm(total=x_all.size(0) * self.num_layers)pbar.set_description('Evaluating')# Compute representations of nodes layer by layer, using *all*# available edges. This leads to faster computation in contrast to# immediately computing the final representations of each batch.total_edges = 0for i in range(self.num_layers):xs = []for batch_size, n_id, adj in subgraph_loader:edge_index, _, size = adj.to(device)total_edges += edge_index.size(1)x = x_all[n_id].to(device) #使用上一层卷积跟新过的embedding, x_allx_target = x[:size[1]]x = self.convs[i]((x, x_target), edge_index)if i != self.num_layers - 1:x = F.relu(x)xs.append(x.cpu())pbar.update(batch_size)x_all = torch.cat(xs, dim=0) # 使用这一层卷积得到的embedding来更新x_allpbar.close()return x_all
注意到其中有一个for i in range(self.num_layers)
的循环,总结这段代码在做的事情就是:
for i in 卷积层数:对于所有节点,利用一阶邻居更新embedding
不是取所有的n阶邻居,计算一次就得到节点最终的embedding
,这里用的技巧是,只取所有一阶邻居,但是迭代跟新n次。这两种方式的结果是相同的。
但是为什么要使用这种曲折的方式,而不是直接取n阶邻居呢?
首先训练的时候为什么要对邻居采样,就是因为整张图的计算非常消耗内存。所以设计了minibatch
邻居采样的计算方式,同时实现了更快收敛和内存节省。而推断如果取全部n阶邻居,随着邻居节点数的指数级增多,也会使内存消耗指数级增加。对于比较稠密的图,或者图中存在度数很大的节点的时候,n阶邻居可能相当于把整张图放了进来,或许会出现out of memory
的情况。 所以只取一阶邻居,但是迭代n次,是计算效率更高,内存消耗更小的方法。尤其对于比较稠密的图,这一点体现更为明显。
pytorch geometric GraphSAGE代码样例reddit和ogbn_products_sage,为何subgraph_loader将sizes设成[-1]相关推荐
- idea内存溢出解决_各种OOM代码样例及解决方法
针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java.lang.OutOfMe ...
- java二重循环计数_java的二重循环代码样例
1.计算三个班的平均分 import java.util.Scanner; public class AvgScore{ public static void main (Sting[] args){ ...
- Android拍照上传代码样例
2019独角兽企业重金招聘Python工程师标准>>> Android拍照上传代码样例 1.LoginWindow.java --登录窗口 package com.hemi.rhet ...
- python开发接口故障码_Python代码样例
Python代码样例 链接复制成功! 分享 微博 分享文档到微博 微信 扫码分享文档 复制链接 复制链接到剪贴板 更新时间:2020/10/27 GMT+08:00 Python代码样例如下所示: & ...
- 各种OOM代码样例及解决方法
点击上方「蓝字」关注我们 针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java ...
- 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)
TensorFlow.Keras和Pytorch是目前深度学习的主要框架,也是入门深度学习必须掌握的三大框架,但是官方文档相对内容较多,初学者往往无从下手.本人从github里搜到三个非常不错的学习资 ...
- 控制文件夹递归深度_TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)...
TensorFlow.Keras和Pytorch是目前深度学习的主要框架,也是入门深度学习必须掌握的三大框架,但是官方文档相对内容较多,初学者往往无从下手.本人从github里搜到三个非常不错的学习资 ...
- JSP→基本语法/静态内容/指令/动作/表达式/小脚本(Scriptlet)/声明/注释、JSP页面声明周期、代码样例、九大隐式内置对象及方法代码样例
JSP(全称JavaServer Pages)是一种动态网页技术标准. 指令 注释 小脚本 声明 表达式 JSP页面声明周期 九九乘法表样例 九大隐式内置对象 out get与post请求方式区别 r ...
- 23 种设计模式详解(全23种,含代码样例)
设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式 ...
最新文章
- 2.JS执行上下文和变量对象
- java启动无线网络连接_在无线模式存在的情况下,如何连接无线网络
- oracle自动售票服务器,一种基于Oracle数据库客户端的业务自动处理方法与流程
- 深度运用LSTM神经网络并与经典时序模型对比
- C++实现complex number复数的算法(附完整源码)
- 欢迎大家多来关注下!
- python常见内置函数_python常见的内置函数
- php如何传递字符串,如何将PHP字符串传递给Javascript函数调用?
- oracle 如何查看日志?
- linux列出管道,lsof列出的管道列表示什么意思?_linux_开发99编程知识库
- 【原】python中文文本挖掘资料集合
- python 属性描述符
- bootstrap中container类和container-fluid类的区别
- Playframework项目启动后自动停止问题记录
- unexpected error ConnectionError object has no attribute
- python基础之列表、元组和字典
- Hive语言手册-ORC
- 通达OA2019安装教程
- SSH之known_hosts文件
- 分享112个HTML娱乐休闲模板,总有一款适合您
热门文章
- 微信小程序之自定义表单组件(radio)
- 关于0x80070091 目录不是空的
- Kali 开机启动慢解决方案(用时56秒)
- java技术面试一定要跳出来的坑,可曾听闻!
- 论文笔记——HDD算法:异构网络中信息扩散的深度学习方法
- 《快速掌握PyQt5》第二章 信号与槽——裁判鸣枪与选手开跑
- Win系统 - 微信居然自带修复工具?快来试试
- 面试 | 铁憨憨程序员怎么写好简历?先把这个问题改掉先!
- AFL++: Combining Incremental Steps of Fuzzing Research
- win10开机显示无网络连接服务器,Win10开机无法连接网络