边权重归一化
- class dgl.nn.pytorch.conv.EdgeWeightNorm(norm='both', eps=0.0)[source]
Bases:
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}\)。
示例
>>> 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
为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'
。 这将触发平方根和除以非正数的操作。