EdgeWeightNorm

class dgl.nn.pytorch.conv.EdgeWeightNorm(norm='both', eps=0.0)[source]

基类: Module

此模块根据 GCN 中的形式,对图上正标量边权重进行归一化。

数学上,设置 norm='both' 会产生以下归一化项

\[c_{ji} = (\sqrt{\sum_{k\in\mathcal{N}(j)}e_{jk}}\sqrt{\sum_{k\in\mathcal{N}(i)}e_{ki}})\]

设置 norm='right' 会产生以下归一化项

\[c_{ji} = (\sum_{k\in\mathcal{N}(i)}e_{ki})\]

其中 \(e_{ji}\) 是从节点 \(j\) 到节点 \(i\) 的边的标量权重。

该模块返回归一化权重 \(e_{ji} / c_{ji}\)。

参数:
  • norm (str, optional) – 上述指定的归一化方法。默认值为 ‘both’

  • eps (float, optional) – 分母中的一个小的偏移值。默认值为 0。

示例

>>> import dgl
>>> import numpy as np
>>> import torch as th
>>> from dgl.nn import EdgeWeightNorm, GraphConv
>>> 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)
>>> edge_weight = th.tensor([0.5, 0.6, 0.4, 0.7, 0.9, 0.1, 1, 1, 1, 1, 1, 1])
>>> norm = EdgeWeightNorm(norm='both')
>>> norm_edge_weight = norm(g, edge_weight)
>>> conv = GraphConv(10, 2, norm='none', weight=True, bias=True)
>>> res = conv(g, feat, edge_weight=norm_edge_weight)
>>> print(res)
tensor([[-1.1849, -0.7525],
        [-1.3514, -0.8582],
        [-1.2384, -0.7865],
        [-1.9949, -1.2669],
        [-1.3658, -0.8674],
        [-0.8323, -0.5286]], grad_fn=<AddBackward0>)
forward(graph, edge_weight)[source]

描述

计算 GCN 模型的归一化边权重。

param graph:

图。

type graph:

DGLGraph

param edge_weight:

边的未归一化标量权重。形状应为 \((|E|)\)。

type edge_weight:

torch.Tensor

returns:

归一化的边权重。

rtype:

torch.Tensor

raises DGLError:

情况 1:边权重是多维的。当前此模块仅支持每条边上的标量权重。情况 2:使用 norm='both' 时,边权重包含非正值。这将触发对非正数求平方根和除法。