【问题标题】:Is there function in pytorch similar to tf.contrib.distributions.percentile of tensorflow?pytorch 中是否有类似于 tensorflow 的 tf.contrib.distributions.percentile 的功能?
【发布时间】:2019-07-09 03:23:01
【问题描述】:

PyTorch 中是否有与 Tensorflow 的 tf.contrib.distributions.percentile 相同的功能?

【问题讨论】:

    标签: python tensorflow pytorch


    【解决方案1】:

    有趣的是,PyTorch 似乎并没有为此提供任何运算符,至少不是根据its search function
    不过幸运的是,PyTorch 张量可以很容易地与 NumPy 函数一起使用,因此您可以简单地调用 numpy.percentile,请参见下面的示例:

    import torch as t
    import numpy as np
    
    x = t.Tensor([1,2,3])
    print(np.percentile(x, 30)) # 30-th percentile of x
    # 1.6
    

    【讨论】:

    • 非常感谢您。我认为您的回答以一种方式解决了我的问题。但是当 Tensor 已经与 cuda 并行时,使用 numpy 会有些麻烦。
    • 这是一个非常好的观点!不幸的是,我无法使用 CUDA 访问 Pytorch,但从我在线阅读的内容来看,如果不 (a) 将结果从 GPU 收集回 CPU,或 (b) 编写自定义 CUDA 运算符,这确实是不可能的。还要记住,GPU 初始化的开销本身需要相当多的时间,所以除非你正在处理非常大的张量,否则使用方法 (a) 可能(几乎)有效
    【解决方案2】:

    其实icdf函数给出了逆累积密度函数值,也就是百分位数的值。

    import torch
    from torch.distributions import Normal
    dist = Normal(torch.tensor([0.0]), torch.tensor([1.0]))
    dist.icdf(torch.tensor([0.95])).data.numpy()
    

    结果

    array([1.6449], dtype=float32)
    

    【讨论】:

      【解决方案3】:

      我不知道利弊, 但是有一种方法可以将 cupy 与 pytorch dlpack 一起使用:

      (cupy 不直接支持 pytorch 张量,CuPy 函数不接受 Torch 张量。)

      import torch
      from torch.utils.dlpack import to_dlpack
      from torch.utils.dlpack import from_dlpack
      import cupy
      
      x = torch.Tensor([1, 2, 3]).cuda()
      dx = to_dlpack(x)
      cx = cupy.fromDlpack(dx)
      print(cupy.percentile(cx, 30)) # 30-th percentile of x
      # 1.5999999642372131
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-21
        • 1970-01-01
        • 1970-01-01
        • 2021-04-11
        • 2011-12-29
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        相关资源
        最近更新 更多