dgl.topk_edges

dgl.topk_edges(graph, feat, k, *, descending=True, sortby=None, etype=None)[source]

通过在graph中的边特征feat上按索引sortby的特征进行图级别的top-k操作,返回图级别的表示。

如果descending设置为False,则返回k个最小的元素。

如果sortby设置为None,该函数将在所有维度上独立执行top-k操作,相当于调用torch.topk(graph.edata[feat], dim=0)

Parameters:
  • (DGLGraph) – 图。

  • feat (str) – 特征字段。

  • k (int) – “top-k”中的k

  • 降序 (bool) – 控制是否返回最大或最小的元素。

  • sortby (int, optional) – 根据哪个特征进行排序。如果为 None,则所有特征独立排序。

  • etype (str, typle of str, optional) – 边类型。如果图中只有一种边类型,则可以省略。

Returns:

  • sorted_feat (Tensor) – 一个形状为 \((B, K, D)\) 的张量,其中 \(B\) 是输入图的批量大小。

  • sorted_idx (Tensor) – 一个形状为 \((B, K)`(:math:`(B, K, D)\) 的张量(如果 sortby 设置为 None),其中 \(B\) 是输入图的批量大小,\(D\) 是特征大小。

注释

如果一个例子有 \(n\) 个节点并且 \(nsorted_feat 张量将会用零填充第 \(n+1\) 到第 \(k\) 行;

示例

>>> import dgl
>>> import torch as th

创建两个DGLGraph对象并初始化它们的边特征。

>>> g1 = dgl.graph(([0, 1, 2, 3], [1, 2, 3, 0]))         # Graph 1
>>> g1.edata['h'] = th.rand(4, 5)
>>> g1.edata['h']
tensor([[0.0297, 0.8307, 0.9140, 0.6702, 0.3346],
        [0.5901, 0.3030, 0.9280, 0.6893, 0.7997],
        [0.0880, 0.6515, 0.4451, 0.7507, 0.5297],
        [0.5171, 0.6379, 0.2695, 0.8954, 0.5197]])
>>> g2 = dgl.graph(([0, 1, 2, 3, 4], [1, 2, 3, 4, 0]))   # Graph 2
>>> g2.edata['h'] = th.rand(5, 5)
>>> g2.edata['h']
tensor([[0.3168, 0.3174, 0.5303, 0.0804, 0.3808],
        [0.1323, 0.2766, 0.4318, 0.6114, 0.1458],
        [0.1752, 0.9105, 0.5692, 0.8489, 0.0539],
        [0.1931, 0.4954, 0.3455, 0.3934, 0.0857],
        [0.5065, 0.5182, 0.5418, 0.1520, 0.3872]])

在批处理图中,基于边属性 h 的Top-k。

>>> bg = dgl.batch([g1, g2], edata=['h'])
>>> dgl.topk_edges(bg, 'h', 3)
(tensor([[[0.5901, 0.8307, 0.9280, 0.8954, 0.7997],
          [0.5171, 0.6515, 0.9140, 0.7507, 0.5297],
          [0.0880, 0.6379, 0.4451, 0.6893, 0.5197]],
         [[0.5065, 0.9105, 0.5692, 0.8489, 0.3872],
          [0.3168, 0.5182, 0.5418, 0.6114, 0.3808],
          [0.1931, 0.4954, 0.5303, 0.3934, 0.1458]]]), tensor([[[1, 0, 1, 3, 1],
          [3, 2, 0, 2, 2],
          [2, 3, 2, 1, 3]],
         [[4, 2, 2, 2, 4],
          [0, 4, 4, 1, 0],
          [3, 3, 0, 3, 1]]]))

在批量图中沿索引-1对边缘属性h进行Top-k操作。 (用于SortPooling)

>>> dgl.topk_edges(bg, 'h', 3, sortby=-1)
(tensor([[[0.5901, 0.3030, 0.9280, 0.6893, 0.7997],
          [0.0880, 0.6515, 0.4451, 0.7507, 0.5297],
          [0.5171, 0.6379, 0.2695, 0.8954, 0.5197]],
         [[0.5065, 0.5182, 0.5418, 0.1520, 0.3872],
          [0.3168, 0.3174, 0.5303, 0.0804, 0.3808],
          [0.1323, 0.2766, 0.4318, 0.6114, 0.1458]]]), tensor([[1, 2, 3],
         [4, 0, 1]]))

在单个图中基于边属性 h 的Top-k。

>>> dgl.topk_edges(g1, 'h', 3)
(tensor([[[0.5901, 0.8307, 0.9280, 0.8954, 0.7997],
          [0.5171, 0.6515, 0.9140, 0.7507, 0.5297],
          [0.0880, 0.6379, 0.4451, 0.6893, 0.5197]]]), tensor([[[1, 0, 1, 3, 1],
          [3, 2, 0, 2, 2],
          [2, 3, 2, 1, 3]]]))