AGNNConv

class dgl.nn.pytorch.conv.AGNNConv(init_beta=1.0, learn_beta=True, allow_zero_in_degree=False)[source]

基类: Module

基于注意力机制的图神经网络层,来自论文 Attention-based Graph Neural Network for Semi-Supervised Learning

\[H^{l+1} = P H^{l}\]

其中 \(P\) 计算如下

\[P_{ij} = \mathrm{softmax}_i ( \beta \cdot \cos(h_i^l, h_j^l))\]

其中 \(\beta\) 是一个单标量参数。

参数:
  • init_beta (float, 可选) – 公式中的 \(\beta\),一个单标量参数。

  • learn_beta (bool, 可选) – 如果为 True,\(\beta\) 将成为可学习参数。

  • allow_zero_in_degree (bool, 可选) – 如果图中有入度为 0 的节点,这些节点的输出将无效,因为没有消息传递到这些节点。这对于某些应用程序是有害的,会导致性能悄无声息地下降。如果输入图检测到入度为 0 的节点,此模块将引发 DGLError。通过设置为 True,它将抑制检查并让用户自己处理。默认值: False

注意

入度为零的节点将导致无效的输出值。这是因为没有消息传递到这些节点,聚合函数将应用于空输入。避免这种情况的常见做法是,如果图是同构的,则为图中的每个节点添加一个自循环,这可以通过以下方式实现:

>>> g = ... # a DGLGraph
>>> g = dgl.add_self_loop(g)

调用 add_self_loop 对于某些图可能不起作用,例如异构图,因为无法确定自循环边的类型。对于这些情况,将 allow_zero_in_degree 设置为 True 以解除代码阻塞并手动处理入度为零的节点。处理这种情况的常见做法是在卷积后使用时过滤掉入度为零的节点。

示例

>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import AGNNConv
>>>
>>> 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 = AGNNConv()
>>> res = conv(g, feat)
>>> res
tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
        [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]],
    grad_fn=<BinaryReduceBackward>)
forward(graph, feat)[source]

描述

计算 AGNN 层。

参数 graph:

图。

类型 graph:

DGLGraph

参数 feat:

输入特征,形状为 \((N, *)\),其中 \(N\) 是节点数,\(*\) 可以是任何形状。如果给定一对 torch.Tensor,则该对必须包含两个形状分别为 \((N_{in}, *)\)\((N_{out}, *)\) 的张量,后者中的 \(*\) 必须与前者相等。

类型 feat:

torch.Tensor

返回:

输出特征,形状为 \((N, *)\),其中 \(*\) 应与输入形状相同。

返回类型:

torch.Tensor

抛出 DGLError:

如果输入图中有入度为 0 的节点,它将引发 DGLError,因为没有消息传递到这些节点。这将导致无效输出。可以通过将 allow_zero_in_degree 参数设置为 True 来忽略此错误。