pyg aggregate函数
Aggregates是一种在Pyg中使用的功能强大的函数。它计算一个给定张量各个维度上的元素之和、平均值、最小值和最大值等统计量。在本文中,我们将介绍聚合函数在Pyg中的使用、聚合函数的语义意义、以及如何在实际项目中使用聚合函数。
苍茫的天涯是我的爱
一、Pyg中的聚合函数
聚合函数是一个非常有用的函数,在Pyg中有两个分别为`to_den(x)`函数和`to_spar(x)`函数。我们使用`from torch_scatter import scatter_XXX`来调用对应的聚合函数,其中的XXX代表聚合函数的作用。Pyg中的聚合函数都是以scatter_开头的函数,例如:
网络分析法 scatter_add
scatter_max
scatter_mean
scatter_min
scatter_mul
scatter_std
scatter_sum
scatter_var
这些函数都接收两个关键字参数:`index`和`src`。其中,`index`是一个表示张量维度的张量,`src`是待聚合的张量,shape必须和index的前缀一样(前缀是指index第0到N-2维),例如:
```python
from torch_scatter import scatter_add
二、聚合函数的语义
为了更深入地了解聚合函数的语义,请看以下代码:
src = sor([1, 2, 3, 4, 5])
output = scatter_sum(src, index=[1, 1, 2, 0, 1])
# output = [4, 6, 3]
```
聚合函数的语义非常直接,它计算src(通常是一个2D张量)的某些行的总和。在这种情况下,index个元素指定了每个行应该属于哪个聚合块。因此,[1, 1, 2, 0, 1]将src张量拆分为三个聚合块,其中第一个块由第0行和第1行组成,第二个块由第2行组成,第三个块由第3行和第4行组成。然后,聚合函数在每个块中执行聚合操作并返回结果。
在本节中,我们将介绍如何在实际Pyg项目中使用聚合函数。首先介绍较为基础的一个应用,即在通过聚合函数实现图神经网络的邻居聚合池操作。
在远古的GCN神经网络中,我们需要计算$x_{neighbors}^{(l)}=Su_{neighbors}W^{(l)}$,其中S是度矩阵的倒数的卷积,u_{neighbo
rs}是邻居节点的特征张量,W^{(l)}是需要学习的神经网络的参数矩阵。然后我们需要对$x_{neighbors}^{(l)}$进行退火、relu激活等操作得到 $x_{new}^{(l)}=ReLU(x_{neighbors}^{(l)}/\sqrt{d^{(l)}})$,其中$d^{(l)}$是所有邻居的个数加上自己的个数,即为$|neighbors_i|+1$。如果图中每个结点的度不同或者图变化频繁,我们可能需要采用何种操作,因此不同的图神经网络模型在进行信息汇聚时,需要在聚合函数上做出相应的改进。
最基础的是GCN网络中的邻居聚合操作,我们首先模拟一个图,代码如下:
``` python
# 简化如下图 adj列表方式来表示
# 0 -- 1 -- 2
# | |
# 3 -- 4 -- 5
小班开学第一课
edge_index = sor([row, col], dtype=torch.long)
x = sor([
[0.0,0.0], # node 0
[0.0,1.0], # node 1
[1.0,1.0], # node 2
[1.0,0.0], # node 3手棒花
[2.0,1.0], # node 4
形容女孩的词语
[2.0,0.0], # node 5
], dtype=torch.float)
# 对于稀疏图,可以使用to_spar和from_sciprt_spar_tensor提高计算效率。如下面的代码所示
from torch_spar import coalesce
edge_index, _ = coalesce(edge_index, None, x.size(0), x.size(0))
# 恒等映射作为初始不可求的映射,一般来说我们需要像GCN,GAT等卷积神经网络进行训练,使其权重更新为可以求解的映射函数
import Linear
conv = GCNConv(in_channels=2, out_channels=16)
x = conv(x=x, edge_index=edge_index)
```
现在我们可以开始实现邻居池化操作:
``` python
from import global_max_pool
pooling = global_max_pool(x, sor([0, 0, 0, 0, 1, 1]))
```
金猴闹春 在这里,我们使用了global_max_pool函数进行邻居汇聚,您可以使用global_max_pool、global_median_pool、global_add_pool、global_mean_pool等函数。该函数把节点$\{0,1,2,3\}$汇聚为了一个张量,节点$\{4,5\}$也汇聚为了一个张量。这是因为我们将他们分别分为了batch 0和batch 1.最后得到的张量输出形状为(2,16),其中16是GCNCon中out_channel的值。
需要注意的是,PyG的文档是基于1.7.0版本的,若运行以上代码时发现有undefined的情况,可以升级PyG的版本。
以上就是较为基础的邻居池化操作,但在实际应用中,计算信息汇聚的需求不同,实现邻居池化操作的具体方法也存在差异。例如,使用DCGAN生成器时,我们可以使用copy和求和池化方法,例如:
``` python
pooling = (z.view(z.size(0), z.size(1), 1, 1) * x).sum(dim=[2, 3])
武汉社保咨询电话
```
在这个例子中,我们使用了PyTorch的标准方法,对每个节点的特征向量进行乘法。在接下来的操作中,汇聚张量将被称为生成器的输入。四大美人之西施
总之,聚合函数是Pyg一个强大而广泛使用的函数。我们在实践中使用这些函数,很容易地实现信息汇聚和汇总操作,例如图神经网络中的邻居聚合等任务。了解这些函数的语义和使用场景,可以有效地提高我们的开发效率和能力。