【问题标题】:How to convert a pytorch tensor into a numpy array?如何将 pytorch 张量转换为 numpy 数组?
【发布时间】:2019-06-13 13:09:16
【问题描述】:

我有一个火炬张量

a = torch.randn(1, 2, 3, 4, 5)

如何在 numpy 中获取它?

类似

b = a.tonumpy()

输出应该和我做的一样

b = np.random.randn(1, 2, 3, 4, 5)

【问题讨论】:

    标签: python numpy pytorch


    【解决方案1】:

    复制自pytorch doc:

    a = torch.ones(5)
    print(a)
    

    张量([1., 1., 1., 1., 1.])

    b = a.numpy()
    print(b)
    

    [1. 1. 1. 1. 1.]


    根据与@John 的以下讨论:

    如果张量在(或可以)在 GPU 上,或者如果它(或可以)需要 grad,则可以使用

    t.detach().cpu().numpy()

    我建议仅根据需要对代码进行 uglify。

    【讨论】:

    • 在我的torch副本中最好把a.detach().cpu().numpy()
    • @LarsEricson 为什么?
    • 像这样将张量转换为 NumPy 会有什么复杂性?
    • @Sid 我相信o(1) 在大多数情况下,但并非总是如此。见github.com/pytorch/pytorch/blob/master/torch/csrc/utils/…numpy.org/devdocs/reference/c-api/…
    • 这是真的,尽管我相信如果没有必要,两者都是无用的,所以过度杀伤只是在打字中,如果编写一个接受未知来源的张量的函数,则有一些价值。对于您对拉斯的原始问题的误解,我深表歉意。总而言之,detachcpu 并非在所有情况下都是必需的,但在最常见的情况下可能是必需的(因此值得一提)。 numpy 在任何情况下都是必要的,但它本身通常是不够的。任何未来的人都应该参考上面链接的问题或 pytorch 文档以获取更多信息。
    【解决方案2】:

    您可以尝试以下方法

    1. torch.Tensor().numpy()
    2. torch.Tensor().cpu().data.numpy()
    3. torch.Tensor().cpu().detach().numpy()
    

    【讨论】:

      【解决方案3】:

      另一个有用的方法:

      a = torch(0.1, device='cuda')
      
      a.cpu().data.numpy()
      

      回答

      数组(0.1, dtype=float32)

      【讨论】:

        【解决方案4】:

        这是来自fastai core的函数:

        def to_np(x):
            "Convert a tensor to a numpy array."
            return apply(lambda o: o.data.cpu().numpy(), x)
        

        可能使用来自预期 PyTorch 库的函数是一个不错的选择。

        如果您查看PyTorch Transformers 内部,您会发现这个code

        preds = logits.detach().cpu().numpy()
        

        所以你可能会问为什么需要detach() 方法?当我们想从 AD 计算图中分离张量时需要它。

        仍然注意 CPU 张量和 numpy 数组是相连的。它们共享相同的存储空间:

        import torch
        tensor = torch.zeros(2)
        numpy_array = tensor.numpy()
        print('Before edit:')
        print(tensor)
        print(numpy_array)
        
        tensor[0] = 10
        
        print()
        print('After edit:')
        print('Tensor:', tensor)
        print('Numpy array:', numpy_array)
        

        输出:

        Before edit:
        tensor([0., 0.])
        [0. 0.]
        
        After edit:
        Tensor: tensor([10.,  0.])
        Numpy array: [10.  0.]
        

        第一个元素的值由张量和numpy数组共享。在张量中将其更改为 10 也会在 numpy 数组中更改它。

        这就是我们需要小心的原因,因为改变 numpy 数组也会改变 CPU 张量。

        【讨论】:

          【解决方案5】:

          您可能会发现以下两个功能很有用。

          1. torch.Tensor.numpy()
          2. torch.from_numpy()

          【讨论】:

            【解决方案6】:

            有时如果有“应用”渐变,您首先必须将.detach() 函数放在.numpy() 函数之前。

            loss = loss_fn(preds, labels)
            print(loss.detach().numpy())
            

            【讨论】:

              猜你喜欢
              • 2020-06-27
              • 2019-04-27
              • 2019-10-23
              • 2021-02-24
              • 2021-04-28
              • 2020-03-16
              • 2021-01-08
              • 1970-01-01
              • 2020-02-09
              相关资源
              最近更新 更多