torch-geometric:torch_cluster库knn_graph函数详解 今天在阅读⼀份图神经⽹络的代码时碰到了knn_graph函数。图神经⽹络如果使⽤动态图,通常需要获取节点的k近邻作为邻居节点,这个时候就会⽤到knn_graph函数了。knn_graph函数并不是torch-geometric⾃带的,⽽是torch_cluster库中的函数,这也可以说明为什么安装torch-geometric前需要先安装torch_cluster库。 这⾥,我从⾥搬运knn_graph函数的参数说明和例⼦进⾏介绍: dv观察
从这份中可以看到,这个函数是⽤来计算k近邻的,常⽤的参数有:
(1)x:输⼊张量,即所有节点的特征,形状为[N, F];
(2)batch:⼀般每个epoch都会对⼀个batch的样本数据进⾏处理,⽽不是单个样本。这个参数是⽤来指代输⼊的N个节点分别属于batch中的哪个样本,参数形状为[N]。dataloader⼀般会提供这个参数;
(3)loop:是否包括⾃环,默认为false;
(4)flow:信息流动⽅向,其实就是输出是中⼼节点位置在前,还是邻居节点位置在前,默认为source_to_target,即邻居节点位置在前;
(5)cosine:是否使⽤cosine距离计算节点的间距,默认为false;单子论
另外还有r参数和num_workers参数,因为没⽤过,这⾥只给出猜测:r参数猜测是限定在r距离范围内寻邻居节点,⽽这⾥的 知网向退休教授致歉
num_workers参数猜测和dataloader中的num_workers参数作⽤⼀样,⽽且上图的说明⾥指出如果是⽤gpu进⾏运算的话该参数⽆效。
接下来,我们看⼀下⾥给出的例⼦:
tubikimport torch
from torch_cluster import knn_graph
x = sor([[-1.,-1.],[-1.,1.],[1.,-1.],[1.,1.]])
感生电动势
batch = sor([0,0,0,0])
edge_index = knn_graph(x, k=2, batch=batch, loop=False)
print(edge_index)
>>>tensor([[1,2,0,3,0,3,1,2],
a管理模式[0,0,1,1,2,2,3,3]])
从结果中,我们可以看出,输出结果为⼀个⼆维数组,形状为[2, N*k]。在flow参数默认为source_to_target的情况下,中⼼节点的位置在后。