EdgeConv

class dgl.nn.pytorch.conv.EdgeConv(in_feat, out_feat, batch_norm=False, allow_zero_in_degree=False)[source]

基类: Module

EdgeConv 层,来自论文 Dynamic Graph CNN for Learning on Point Clouds

其描述如下:

\[h_i^{(l+1)} = \max_{j \in \mathcal{N}(i)} ( \Theta \cdot (h_j^{(l)} - h_i^{(l)}) + \Phi \cdot h_i^{(l)})\]

其中 \(\mathcal{N}(i)\)\(i\) 的邻居。\(\Theta\)\(\Phi\) 是线性层。

注意

原始公式在最大值操作符内包含一个 ReLU。这等价于先应用最大值操作符,然后再应用 ReLU。

参数:
  • in_feat (int) – 输入特征尺寸;即 \(h_j^{(l)}\) 的维度数量。

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

  • batch_norm (bool) – 是否在消息上包含批量归一化。默认值: False

  • allow_zero_in_degree (bool, optional) – 如果图中存在入度为 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 EdgeConv
>>> # 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 = EdgeConv(10, 2)
>>> res = conv(g, feat)
>>> res
tensor([[-0.2347,  0.5849],
        [-0.2347,  0.5849],
        [-0.2347,  0.5849],
        [-0.2347,  0.5849],
        [-0.2347,  0.5849],
        [-0.2347,  0.5849]], grad_fn=<CopyReduceBackward>)
>>> # 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, 5)
>>> conv = EdgeConv(5, 2, 3)
>>> res = conv(g, (u_fea, v_fea))
>>> res
tensor([[ 1.6375,  0.2085],
        [-1.1925, -1.2852],
        [ 0.2101,  1.3466],
        [ 0.2342, -0.9868]], grad_fn=<CopyReduceBackward>)
forward(g, feat)[source]

描述

前向计算

参数 g:

图。

类型 g:

DGLGraph

参数 feat:

\((N, D)\) 其中 \(N\) 是节点数量,\(D\) 是特征维度数量。

如果给出一对张量,图必须是只有一个边类型的单二分图,并且这两个张量除第一个轴外必须具有相同的维度。

类型 feat:

张量或张量对

返回:

新的节点特征。

返回类型:

torch.Tensor

引发 DGLError:

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