EdgeWeightNorm๏ƒ

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

Bases: Module

This module normalizes positive scalar edge weights on a graph following the form in GCN.

Mathematically, setting norm='both' yields the following normalization term:

cji=(โˆ‘kโˆˆN(j)ejkโˆ‘kโˆˆN(i)eki)

And, setting norm='right' yields the following normalization term:

cji=(โˆ‘kโˆˆN(i)eki)

where eji is the scalar weight on the edge from node j to node i.

The module returns the normalized weight eji/cji.

Parameters:
  • norm (str, optional) โ€“ The normalizer as specified above. Default is โ€˜bothโ€™.

  • eps (float, optional) โ€“ A small offset value in the denominator. Default is 0.

Examples

>>> 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]๏ƒ

Description๏ƒ

Compute normalized edge weight for the GCN model.

param graph:

The graph.

type graph:

DGLGraph

param edge_weight:

Unnormalized scalar weights on the edges. The shape is expected to be (|E|).

type edge_weight:

torch.Tensor

returns:

The normalized edge weight.

rtype:

torch.Tensor

raises DGLError:

Case 1: The edge weight is multi-dimensional. Currently this module only supports a scalar weight on each edge. Case 2: The edge weight has non-positive values with norm='both'. This will trigger square root and division by a non-positive number.