pytorch geometric GraphSAGE代码样例reddit和ogbn_products_sage,为何subgraph_loader将sizes设成[-1]

  • loader
  • inference

loader

关于GraphSAGEpytorch 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_loadersizes=[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]相关推荐

  1. idea内存溢出解决_各种OOM代码样例及解决方法

    针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java.lang.OutOfMe ...

  2. java二重循环计数_java的二重循环代码样例

    1.计算三个班的平均分 import java.util.Scanner; public class AvgScore{ public static void main (Sting[] args){ ...

  3. Android拍照上传代码样例

    2019独角兽企业重金招聘Python工程师标准>>> Android拍照上传代码样例 1.LoginWindow.java --登录窗口 package com.hemi.rhet ...

  4. python开发接口故障码_Python代码样例

    Python代码样例 链接复制成功! 分享 微博 分享文档到微博 微信 扫码分享文档 复制链接 复制链接到剪贴板 更新时间:2020/10/27 GMT+08:00 Python代码样例如下所示: & ...

  5. 各种OOM代码样例及解决方法

    点击上方「蓝字」关注我们 针对目前大家对OOM的类型不太熟悉,那么来总结一下各种OOM出现的情况以及解决方法.把各种OOM的情况列出来,然后逐一进行代码编写复现和提供解决方法. 1. 堆溢出-java ...

  6. 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)

    TensorFlow.Keras和Pytorch是目前深度学习的主要框架,也是入门深度学习必须掌握的三大框架,但是官方文档相对内容较多,初学者往往无从下手.本人从github里搜到三个非常不错的学习资 ...

  7. 控制文件夹递归深度_TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)...

    TensorFlow.Keras和Pytorch是目前深度学习的主要框架,也是入门深度学习必须掌握的三大框架,但是官方文档相对内容较多,初学者往往无从下手.本人从github里搜到三个非常不错的学习资 ...

  8. JSP→基本语法/静态内容/指令/动作/表达式/小脚本(Scriptlet)/声明/注释、JSP页面声明周期、代码样例、九大隐式内置对象及方法代码样例

    JSP(全称JavaServer Pages)是一种动态网页技术标准. 指令 注释 小脚本 声明 表达式 JSP页面声明周期 九九乘法表样例 九大隐式内置对象 out get与post请求方式区别 r ...

  9. 23 种设计模式详解(全23种,含代码样例)

    设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式 ...

最新文章

  1. 2.JS执行上下文和变量对象
  2. java启动无线网络连接_在无线模式存在的情况下,如何连接无线网络
  3. oracle自动售票服务器,一种基于Oracle数据库客户端的业务自动处理方法与流程
  4. 深度运用LSTM神经网络并与经典时序模型对比
  5. C++实现complex number复数的算法(附完整源码)
  6. 欢迎大家多来关注下!
  7. python常见内置函数_python常见的内置函数
  8. php如何传递字符串,如何将PHP字符串传递给Javascript函数调用?
  9. oracle 如何查看日志?
  10. linux列出管道,lsof列出的管道列表示什么意思?_linux_开发99编程知识库
  11. 【原】python中文文本挖掘资料集合
  12. python 属性描述符
  13. bootstrap中container类和container-fluid类的区别
  14. Playframework项目启动后自动停止问题记录
  15. unexpected error ConnectionError object has no attribute
  16. python基础之列表、元组和字典
  17. Hive语言手册-ORC
  18. 通达OA2019安装教程
  19. SSH之known_hosts文件
  20. 分享112个HTML娱乐休闲模板,总有一款适合您

热门文章

  1. 微信小程序之自定义表单组件(radio)
  2. 关于0x80070091 目录不是空的
  3. Kali 开机启动慢解决方案(用时56秒)
  4. java技术面试一定要跳出来的坑,可曾听闻!
  5. 论文笔记——HDD算法:异构网络中信息扩散的深度学习方法
  6. 《快速掌握PyQt5》第二章 信号与槽——裁判鸣枪与选手开跑
  7. Win系统 - 微信居然自带修复工具?快来试试
  8. 面试 | 铁憨憨程序员怎么写好简历?先把这个问题改掉先!
  9. AFL++: Combining Incremental Steps of Fuzzing Research
  10. win10开机显示无网络连接服务器,Win10开机无法连接网络