EdgeConv
- class dgl.nn.pytorch.conv.EdgeConv(in_feat, out_feat, batch_norm=False, allow_zero_in_degree=False)[source]
基类:
Module
EdgeConv 层,来自论文 Dynamic Graph CNN for Learning on Point Clouds
其描述如下:
\[h_i^{(l+1)} = \max_{j \in \mathcal{N}(i)} ( \Theta \cdot (h_j^{(l)} - h_i^{(l)}) + \Phi \cdot h_i^{(l)})\]其中 \(\mathcal{N}(i)\) 是 \(i\) 的邻居。\(\Theta\) 和 \(\Phi\) 是线性层。
注意
原始公式在最大值操作符内包含一个 ReLU。这等价于先应用最大值操作符,然后再应用 ReLU。
- 参数:
in_feat (int) – 输入特征尺寸;即 \(h_j^{(l)}\) 的维度数量。
out_feat (int) – 输出特征尺寸;即 \(h_i^{(l+1)}\) 的维度数量。
batch_norm (bool) – 是否在消息上包含批量归一化。默认值:
False
。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 EdgeConv
>>> # 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 = EdgeConv(10, 2) >>> res = conv(g, feat) >>> res tensor([[-0.2347, 0.5849], [-0.2347, 0.5849], [-0.2347, 0.5849], [-0.2347, 0.5849], [-0.2347, 0.5849], [-0.2347, 0.5849]], grad_fn=<CopyReduceBackward>)
>>> # 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, 5) >>> conv = EdgeConv(5, 2, 3) >>> res = conv(g, (u_fea, v_fea)) >>> res tensor([[ 1.6375, 0.2085], [-1.1925, -1.2852], [ 0.2101, 1.3466], [ 0.2342, -0.9868]], grad_fn=<CopyReduceBackward>)
- forward(g, feat)[source]
描述
前向计算
- 参数 g:
图。
- 类型 g:
DGLGraph
- 参数 feat:
\((N, D)\) 其中 \(N\) 是节点数量,\(D\) 是特征维度数量。
如果给出一对张量,图必须是只有一个边类型的单二分图,并且这两个张量除第一个轴外必须具有相同的维度。
- 类型 feat:
张量或张量对
- 返回:
新的节点特征。
- 返回类型:
torch.Tensor
- 引发 DGLError:
如果输入图中存在入度为 0 的节点,它将引发 DGLError,因为没有消息会传递到这些节点。这将导致输出无效。通过将
allow_zero_in_degree
参数设置为True
可以忽略此错误。