SAGEConv

class dgl.nn.pytorch.conv.SAGEConv(in_feats, out_feats, aggregator_type, feat_drop=0.0, bias=True, norm=None, activation=None)[源码]

基类: Module

来自 大规模图上的归纳式表示学习 的 GraphSAGE 层

\[ \begin{align}\begin{aligned}h_{\mathcal{N}(i)}^{(l+1)} &= \mathrm{aggregate} \left(\{h_{j}^{l}, \forall j \in \mathcal{N}(i) \}\right)\\h_{i}^{(l+1)} &= \sigma \left(W \cdot \mathrm{concat} (h_{i}^{l}, h_{\mathcal{N}(i)}^{l+1}) \right)\\h_{i}^{(l+1)} &= \mathrm{norm}(h_{i}^{(l+1)})\end{aligned}\end{align} \]

如果提供了每条边上的权重张量,聚合方式变为

\[h_{\mathcal{N}(i)}^{(l+1)} = \mathrm{aggregate} \left(\{e_{ji} h_{j}^{l}, \forall j \in \mathcal{N}(i) \}\right)\]

其中 \(e_{ji}\) 是从节点 \(j\) 到节点 \(i\) 的边上的标量权重。请确保 \(e_{ji}\) 可以与 \(h_j^{l}\) 进行广播运算。

参数:
  • in_feats (int, 或 int 对) –

    输入特征大小;即 \(h_i^{(l)}\) 的维度数量。

    SAGEConv 可以应用于同构图和单向 二分图。如果该层应用于单向二分图,in_feats 指定源节点和目标节点的输入特征大小。如果给出了一个标量,则源节点和目标节点的特征大小将采用相同的值。

    如果聚合器类型是 gcn,则要求源节点和目标节点的特征大小相同。

  • out_feats (int) – 输出特征大小;即 \(h_i^{(l+1)}\) 的维度数量。

  • aggregator_type (str) – 要使用的聚合器类型 (mean, gcn, pool, lstm)。

  • feat_drop (float) – 特征上的 Dropout 比率,默认值: 0

  • bias (bool) – 如果为 True,则向输出添加一个可学习的偏置。默认值: True

  • norm (可调用的激活函数/层None, 可选) – 如果不为 None,则对更新后的节点特征应用归一化。

  • activation (可调用的激活函数/层None, 可选) – 如果不为 None,则对更新后的节点特征应用激活函数。默认值: None

示例

>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import SAGEConv
>>> # Case 1: Homogeneous graph
>>> g = dgl.graph(([0,1,2,3,2,5], [1,2,3,4,0,3]))
>>> g = dgl.add_self_loop(g)
>>> feat = th.ones(6, 10)
>>> conv = SAGEConv(10, 2, 'pool')
>>> res = conv(g, feat)
>>> res
tensor([[-1.0888, -2.1099],
        [-1.0888, -2.1099],
        [-1.0888, -2.1099],
        [-1.0888, -2.1099],
        [-1.0888, -2.1099],
        [-1.0888, -2.1099]], grad_fn=<AddBackward0>)
>>> # Case 2: Unidirectional bipartite graph
>>> u = [0, 1, 0, 0, 1]
>>> v = [0, 1, 2, 3, 2]
>>> g = dgl.heterograph({('_N', '_E', '_N'):(u, v)})
>>> u_fea = th.rand(2, 5)
>>> v_fea = th.rand(4, 10)
>>> conv = SAGEConv((5, 10), 2, 'mean')
>>> res = conv(g, (u_fea, v_fea))
>>> res
tensor([[ 0.3163,  3.1166],
        [ 0.3866,  2.5398],
        [ 0.5873,  1.6597],
        [-0.2502,  2.8068]], grad_fn=<AddBackward0>)
forward(graph, feat, edge_weight=None)[源码]

描述

计算 GraphSAGE 层。

参数 graph:

图。

类型 graph:

DGLGraph

参数 feat:

如果给出了一个 torch.Tensor,它代表形状为 \((N, D_{in})\) 的输入特征,其中 \(D_{in}\) 是输入特征的大小,\(N\) 是节点数量。如果给出了一个 torch.Tensor 对,则该对必须包含两个形状分别为 \((N_{in}, D_{in_{src}})\)\((N_{out}, D_{in_{dst}})\) 的张量。

类型 feat:

torch.Tensor 或 torch.Tensor 对

参数 edge_weight:

可选的边上张量。如果给出,卷积将根据消息进行加权。

类型 edge_weight:

torch.Tensor, 可选

返回:

输出特征,形状为 \((N_{dst}, D_{out})\),其中 \(N_{dst}\) 是输入图中的目标节点数量,\(D_{out}\) 是输出特征的大小。

返回类型:

torch.Tensor

reset_parameters()[源码]

描述

重新初始化可学习参数。

注意

线性权重 \(W^{(l)}\) 使用 Glorot 均匀初始化方法进行初始化。LSTM 模块对其权重使用 xavier 初始化方法。