GMMConv

class dgl.nn.pytorch.conv.GMMConv(in_feats, out_feats, dim, n_kernels, aggregator_type='sum', residual=False, bias=True, allow_zero_in_degree=False)[source]

基类: Module

高斯混合模型卷积层,出自论文 Geometric Deep Learning on Graphs and Manifolds using Mixture Model CNNs

\[ \begin{align}\begin{aligned}u_{ij} &= f(x_i, x_j), x_j \in \mathcal{N}(i)\\w_k(u) &= \exp\left(-\frac{1}{2}(u-\mu_k)^T \Sigma_k^{-1} (u - \mu_k)\right)\\h_i^{l+1} &= \mathrm{aggregate}\left(\left\{\frac{1}{K} \sum_{k}^{K} w_k(u_{ij}), \forall j\in \mathcal{N}(i)\right\}\right)\end{aligned}\end{align} \]

其中 \(u\) 表示一个顶点与其邻居之间的伪坐标,使用函数 \(f\) 计算;\(\Sigma_k^{-1}\)\(\mu_k\) 是可学习的参数,分别表示高斯核的协方差矩阵和均值向量。

参数:
  • in_feats (int) – 输入特征数;即 \(x_i\) 的维度数。

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

  • dim (int) – 伪坐标的维度;即 \(u_{ij}\) 的维度数。

  • n_kernels (int) – 核的数量 \(K\)

  • aggregator_type (str) – 聚合器类型(sum, mean, max)。默认值:sum

  • residual (bool) – 如果为 True,则在此层内部使用残差连接。默认值:False

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

  • 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 GMMConv
>>> # 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 = GMMConv(10, 2, 3, 2, 'mean')
>>> pseudo = th.ones(12, 3)
>>> res = conv(g, feat, pseudo)
>>> res
tensor([[-0.3462, -0.2654],
        [-0.3462, -0.2654],
        [-0.3462, -0.2654],
        [-0.3462, -0.2654],
        [-0.3462, -0.2654],
        [-0.3462, -0.2654]], 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)
>>> pseudo = th.ones(5, 3)
>>> conv = GMMConv((10, 5), 2, 3, 2, 'mean')
>>> res = conv(g, (u_fea, v_fea), pseudo)
>>> res
tensor([[-0.1107, -0.1559],
        [-0.1646, -0.2326],
        [-0.1377, -0.1943],
        [-0.1107, -0.1559]], grad_fn=<AddBackward0>)
forward(graph, feat, pseudo)[source]

描述

计算高斯混合模型卷积层。

参数 graph:

图。

类型 graph:

DGLGraph

参数 feat:

如果给定单个张量,则是形状为 \((N, D_{in})\) 的输入特征,其中 \(D_{in}\) 是输入特征的大小,\(N\) 是节点数。如果给定一对张量,则这对张量必须包含两个形状分别为 \((N_{in}, D_{in_{src}})\)\((N_{out}, D_{in_{dst}})\) 的张量。

类型 feat:

torch.Tensor

参数 pseudo:

伪坐标张量,形状为 \((E, D_{u})\),其中 \(E\) 是图的边数,\(D_{u}\) 是伪坐标的维度。

类型 pseudo:

torch.Tensor

返回值:

输出特征,形状为 \((N, D_{out})\),其中 \(D_{out}\) 是输出特征的大小。

返回类型:

torch.Tensor

引发 DGLError:

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

reset_parameters()[source]

描述

重新初始化可学习参数。

注意

全连接层参数使用 Glorot uniform 初始化,偏置初始化为零。mu 权重使用正态分布初始化,inv_sigma 初始化为常数 1.0。