【问题标题】:what does pytorch do for creating tensor from numpypytorch 为从 numpy 创建张量做了什么
【发布时间】:2021-07-31 12:59:47
【问题描述】:

当我致电torch.from_numpy 时,我对torch 所做的事情很感兴趣。顾名思义,PyTorch 似乎创建了一个 Tensor 实例并分配内存以将内容从 numpy ndarray 复制到自身。但是 PyTorch 是如何完成 memcpy 工作的,PyTorch 在后台还做了什么?似乎张量的实现在autograd。但我不知道我应该寻找哪个部分。

我有这个问题,因为我发现从 numpy 构造张量非常快。而且比直接创建张量还要快

a = np.random.randn(100,100)
%timeit torch.from_numpy(a)
759 ns ± 7.53 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit torch.randn(100,100)
61 µs ± 2.46 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit torch.zeros(100,100)
3.1 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

【问题讨论】:

    标签: python numpy pytorch numpy-ndarray tensor


    【解决方案1】:

    documentation 解释说

    返回的张量和 ndarray 共享相同的内存。对张量的修改将反映在 ndarray 中,反之亦然。返回的张量不可调整大小。

    这些句子暗示不涉及内存复制(否则修改将不会反映在另一个中)。这就是操作如此之快的原因:pytorch 仅创建一个指向 numpy 数组底层数据的指针,并将该指针“分配”给一个张量。 此函数根本不分配或复制任何内存。因此,from_numpy 只是复制一个指针(它是一个整数)并可能执行一些检查。

    要记住的重要一点是,底层内存是共享的,因此张量和 numpy 数组相互修改,您应该使用clone 或copy 执行干净的深拷贝并摆脱它行为(如果需要),例如

    b = torch.from_numpy(a).clone()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-13
      • 2018-09-20
      • 2021-09-11
      • 1970-01-01
      • 2018-12-28
      • 2018-01-15
      • 2020-12-14
      • 2021-01-16
      相关资源
      最近更新 更多