Pytork如何从numpy创建张量

2024-04-16 15:40:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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)

Tags: ofdevnumpylooprunstorchpytorchmean
1条回答
网友
1楼 · 发布于 2024-04-16 15:40:20

documentation解释说

The returned tensor and ndarray share the same memory. Modifications to the tensor will be reflected in the ndarray and vice versa. The returned tensor is not resizable.

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

需要记住的是,底层内存是共享的,因此张量和numpy数组会相互修改,您应该使用clonecopy执行干净的深度复制并消除这种行为(如果需要),如

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

相关问题 更多 >