SGConv
- class dgl.nn.pytorch.conv.SGConv(in_feats, out_feats, k=1, cached=False, bias=True, norm=None, allow_zero_in_degree=False)[source]
基类:
Module
来自 Simplifying Graph Convolutional Networks 的 SGC 层
\[H^{K} = (\tilde{D}^{-1/2} \tilde{A} \tilde{D}^{-1/2})^K X \Theta\]其中 \(\tilde{A}\) 是 \(A\) + \(I\)。因此,图输入应该添加自环边。
- 参数:
in_feats (int) – 输入特征的数量;即 \(X\) 的维数。
out_feats (int) – 输出特征的数量;即 \(H^{K}\) 的维数。
k (int) – 跳数 \(K\)。默认值:
1
。cached (bool) –
如果为 True,则模块将缓存
\[(\tilde{D}^{-\frac{1}{2}}\tilde{A}\tilde{D}^{-\frac{1}{2}})^K X\Theta\]在第一次 forward 调用时。此参数只应在直推式学习设置中设置为
True
。bias (bool) – 如果为 True,则在输出中添加一个可学习的偏置。默认值:
True
。norm (可调用激活函数/层或None,可选) – 如果不为 None,则对更新后的节点特征应用归一化。默认值:
False
。allow_zero_in_degree (bool, 可选) – 如果图中有入度为 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 SGConv >>> >>> 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 = SGConv(10, 2, k=2) >>> res = conv(g, feat) >>> res tensor([[-1.9441, -0.9343], [-1.9441, -0.9343], [-1.9441, -0.9343], [-2.7709, -1.3316], [-1.9297, -0.9273], [-1.9441, -0.9343]], grad_fn=<AddmmBackward>)
- forward(graph, feat, edge_weight=None)[source]
说明
计算 Simplifying Graph Convolution 层。
- 参数 graph:
图。
- 类型 graph:
DGLGraph
- 参数 feat:
输入特征,形状为 \((N, D_{in})\),其中 \(D_{in}\) 是输入特征的大小,\(N\) 是节点数。
- 类型 feat:
torch.Tensor
- 参数 edge_weight:
在消息传递过程中使用的边权重。这等同于在上面的公式中使用加权邻接矩阵,并且 \(\tilde{D}^{-1/2}\tilde{A} \tilde{D}^{-1/2}\) 基于
dgl.nn.pytorch.conv.graphconv.EdgeWeightNorm
。- 类型 edge_weight:
torch.Tensor, 可选
- 返回:
输出特征,形状为 \((N, D_{out})\),其中 \(D_{out}\) 是输出特征的大小。
- 返回类型:
torch.Tensor
- 引发 DGLError:
如果输入图中有入度为 0 的节点,将引发 DGLError,因为没有消息传递到这些节点。这将导致输出无效。通过将
allow_zero_in_degree
参数设置为True
可以忽略此错误。
注意
如果
cache
设置为 True,则feat
和graph
在训练期间不应更改,否则将得到错误的结果。