首页 > 其他分享 >pyg学习

pyg学习

时间:2023-09-17 20:56:45浏览次数:34  
标签:node Tensor torch 学习 edge geometric data pyg

官网:https://pytorch-geometric.readthedocs.io/en/latest/

目录

geometric

图数据

pyg里一个图是torch_geometric.data.Data的instance
Data 试图模仿常规 Python 字典的行为。
参数:

  • x (torch.Tensor, optional) – 图里节点的feature,大小是[num_nodes, num_node_features]
  • edge_index (LongTensor, optional) – COO格式地去描述图的连接性,[2, num_edges]。也就是记录每条边的头尾实体。edge index在{0,...,num_nodes-1}的范围
  • edge_attr (torch.Tensor, optional) – 图里边的feature,大小是[num_edges, num_edge_features]
  • y (torch.Tensor, optional) – 具有任意形状的图级graph-level或节点级node-level真实标签。图级[1,],node级[num_nodes,]。【不懂啥意思】
  • pos (torch.Tensor, optional) – 节点的位置矩阵,大小为[num_nodes, num_dimensions]【不懂啥意思】
  • **kwargs (optional) – 其他自行添加的属性

假设目前构造了一个图Data,命名为graph
可能常用的函数:

  • to_dict() - 返回图里各个参数的值的dict,key是参数名,比如graph.to_dict()['edge_attr']
  • update(data: Union[Data, Dict[str, Any]]) - 根据其他的data来更新当前data【不知道是怎么Union的】
  • subgraph(subset: Tensor) - 返回子图 subset表示了node indices,可以是LongTensor or BoolTensor表示留存的nodes【但是好像只有新版本有这个函数,python3.7torch_geometric2.0.1没有】
  • edge_subgraph(subset: Tensor) - 返回子图,但是目前会保留所有的nodes(即使是isolated)【新版本】
  • to_heterogeneous(node_type: Optional[Tensor] = None, edge_type: Optional[Tensor] = None, node_type_names: Optional[List[str]] = None, edge_type_names: Optional[List[Tuple[str, str, str]]] = None)
    转换为异质图【新版本,没细看】
  • apply(func: Callable, *args: str) - *args是图里需要修改的参数,func是对参数进行修改的函数,需要返回修改后的参数值。比如:
def test_func(tensor):
    shape = tensor.shape
    tensor = torch.zeros(shape)
    return tensor
graph.apply(test_func, "x", "edge_attr")

这个apply的作用就是对data里的x属性和edge_attr属性做test_func操作(令tensor全为0)
同理有apply_函数,作用是不需要func返回修改后的值,直接就能修改了。

  • clone() - copy.deepcopy当前graph
  • coalesce() - 删除重复出现的边

图数据的设备切换:

  • graph.cpu() # 官网做法
  • graph.cuda('cuda:0') # 官网做法
  • graph.to(device='cuda:0')

数据的detach(不求梯度)【注意freeze是求梯度但是不更新】举例:https://blog.csdn.net/weixin_44562957/article/details/120950157

  • detach(*args: str)- detach全部或者只detach args中的参数
    detach_类似
    freeze是如下:
for param in B.parameters():
    param.requires_grad = False

常用的属性:
用到再查:https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.data.Data.html#torch_geometric.data.Data

合法性检查:

  • data.validate(raise_on_error=True) 但是只在新版上可以用
    有其他检查函数:
data.has_isolated_nodes()
data.has_self_loops()
data.is_directed()
...

异质图:https://pytorch-geometric.readthedocs.io/en/latest/generated/torch_geometric.data.HeteroData.html#torch_geometric.data.HeteroData

Message Passing

propagate的参数:edge_index, size=None, 多传的参数
propagate也可以重新,参考源码。
propagate的执行顺序:
1.out = self.message(args)
2.out = self.aggregate(out, args)
3.out = self.update(out, args)

注意,message传参的时候需要定义参数名字。但是实际上aggregate、update里的参数可以不仅是message里的参数
查看message_passing.py源码后可以发现,每次执行函数之前都会通过inspector.py的distribute函数来寻找参数。
根据源码可知,如果edge_index是SparseTensor类型,就会把message和aggregate结合为一个函数message_and_aggregate

自定义message,输入是(propagate多传的参数),每个node处理每个邻居、邻边信息。如下,norm是自定义加的参数,可以继续加

def message(self, x_j, norm):
    # x_j has shape [E, out_channels] 代表当前nodes接收到的邻居/邻边信息 
    return norm.view(-1, 1) * x_j  # 返回当前node聚合的结果

自定义aggregate,输入是(message的输出, propagate多传的参数),每个node聚合message得到的每个邻居邻边的信息。
比如可以直接在MP的参数里传aggr='add',也可以直接自定义,一般情况下等价自定义如下:

def aggregate(self, inputs: Tensor, index: Tensor, dim_size: Optional[int] = None) -> Tensor:
    return scatter(inputs, index, dim=self.node_dim, dim_size=dim_size, reduce=self.aggr)

自定义update,输入是(aggregate的输出,propagate多传的参数),每个node根据聚合的信息来更新表示。一般来说直接输出aggregate的输出,不需要重写update。

def update(self, inputs:Tensor):
    return inputs

torch_scatter

https://pytorch-scatter.readthedocs.io/en/latest/functions/scatter.html
把src的数据,根据index的dim axis分类,执行reduce操作(sum/mul/mean/min/max),输出到out张量里(或者scatter函数直接返回)

from torch_scatter import scatter

src = torch.randn(10, 6, 64)
index = torch.tensor([0, 1, 0, 1, 2, 1])

# Broadcasting in the first and last dim.
out = scatter(src, index, dim=1, reduce="sum")

print(out.size())

输出:

torch.Size([10, 3, 64])

一些代码解释

inspector.py

标签:node,Tensor,torch,学习,edge,geometric,data,pyg
From: https://www.cnblogs.com/ReflexFox/p/17708758.html

相关文章

  • 畅购商城学习日志(总)
    ​ 前言       目前是大四物联网工程的双非二本学生,然后想从事java开发,但目前java就业形势严峻,大多招聘岗位都要求到了微服务这一块,所以做这个微服务项目以做代学,主要是记录下自己做的过程中遇到的错误以及解决方法,算当作记录自己学习的收获吧。资源       ......
  • 畅购商城学习日志9.17
    org.springframework.beans.factory.BeanDefinitionStoreException:Failedtoparseconfigurationclass[com.changgou.GoodsApplication];nestedexceptionisorg.springframework.context.annotation.ConflictingBeanDefinitionException:Annotation-specifiedbeann......
  • 学习笔记2
    文件操作内容在C语言中,二进制文件是以数据在内存中的二进制存储形式(内码)原样保存的文件;而文本文件则是以字符的ASCII码值进行存储与编码的文件,文件的内容就是字符。文本文件和二进制文件都可以作为用户的数据文件,当写数据到磁盘时,文本文件需要把内存中的二进制形式转换成A......
  • 学习笔记(2)
    一、任务详情自学教材第九章,提交学习笔记(10分)本章是复习C语言中的文件操作内容,结构化从文本文件操作,二进制文件操作两个大内容考虑,以前可能只关注文本文件的操作,我们以后更多的是操作二进制文件。文本文件中考虑字符读写,行读写,任意位置读写等文件操作都有什么?二进制文件和文......
  • 第九章“学习笔记”
    ------------恢复内容开始------------I/O库函数一、库函数基本内容 系统调用函数:open()、read()、write()、lseek()、close(); I/O库函数:fopen()、fread()、fwrite()、fseek()、fclose()在系统调用中,文件描述符fd是一个整数,在库I/O中,fp是一个文件流指针。fopen()发出open()系统调用用......
  • 学习后的顺序表(结点内容只设学号、姓名),表内采用数组,数组0位存放数据,相关的函数均按此
    #include<iostream>#include<string.h>usingnamespacestd;typedefstruct{ intid; stringname;}Node;//结点定义typedefstruct{ Node*element;//基地址(动态长度) intlength;//表长}Linklist;#defineMAXSIZE100//最大长度voidmenu();//声明菜单函数voidCreatelist(Lin......
  • 《信息安全系统设计与实现》第二周学习笔记
    第九章I/O库函数I/O库函数与系统调用系统调用函数open()read()write()lseek()close()I/O库函数fopen()fread()fwrite()fseek()fclose()I/O库函数的算法fread算法:第一次调用fread()时候,FILE结构体的缓冲区是空的,fread()使用保......
  • 信息安全系统设计与实现——学习笔记2
    任务详情:自学教材第九章,提交学习笔记Part1知识点归纳&GPT提问知识点归纳系统调用函数和I/O库函数系统调用函数是直接与操作系统交互的函数,用于进行底层的文件操作。I/O库函数则是建立在系统调用函数之上的高级函数,提供更方便和易于使用的接口来进行文件的读写操作。这些函......
  • 学习笔记2
    I/O库函数一、知识点总结1.I/O库函数与系统调用每个I/O库函数的根都在对应的系统调用函数中。2.I/O库函数的算法fread算法(1)第一次调用:FILE结构体的缓冲区是空的。(2)随后的每次调用:尝试满足来自FILE结构体内部缓冲区的调用。fwrite算法与fread()算法相似,只是数据传输方......
  • 学习笔记2(第九章)
    一、知识点归纳1、C语言中常用的文件操作函数文件打开和关闭fopen:FILE*fopen(constchar*filename,constchar*mode);打开一个文件,如果成功,返回一个FILE*指针,否则返回NULL.mode可以是:"r":只读打开"w":写入打开(如果文件存在则清空内容,如果不存在则创建)"a":......