pytorch.empty函数中未初始化的数据是什么

问题描述 投票:0回答:2

我正在浏览

pytorch
教程并遇到
pytorch.empty
功能。有人提到空可以用于未初始化的数据。但是,当我打印它时,我得到了一个值。这和
pytorch.rand
有什么区别,它也生成数据(我知道 rand 生成 0 和 1 之间的值)。下面是我尝试过的代码

a = torch.empty(3,4)
print(a)

输出:

tensor([[ 8.4135e-38,  0.0000e+00,  6.2579e-41,  5.4592e-39],
        [-5.6345e-08,  2.5353e+30,  5.0447e-44,  1.7020e-41],
        [ 1.4000e-38,  5.7697e-05,  2.5353e+30,  2.1580e-43]])
b = torch.rand(3,4)
print(b)

输出:

tensor([[ 0.1514,  0.8406,  0.2708,  0.3422],
        [ 0.7196,  0.6120,  0.4476,  0.6705],
        [ 0.6989,  0.2086,  0.5100,  0.8285]])

这是官方文档的链接

python multidimensional-array memory-management pytorch tensor
2个回答
11
投票

一旦调用

torch.empty()
,就会根据张量的大小(形状)分配一块内存。 未初始化的数据,意味着
torch.empty()
将简单地按原样返回内存块中的值。这些值可以是默认值,也可以是由于某些其他操作而存储在这些内存块中的值,这些操作之前使用了该部分内存块。


这是一个简单的说明:

# a block of memory with the values in it
In [74]: torch.empty(2, 3)
Out[74]: 
tensor([[-1.0049e+08,  4.5688e-41, -9.1450e-38],
        [ 3.0638e-41,  4.4842e-44,  0.0000e+00]])

# same run; but note the change in values.
# i.e. different memory addresses than on the previous run were used.
In [75]: torch.empty(2, 3)
Out[75]: 
tensor([[-1.0049e+08,  4.5688e-41, -7.9421e-38],
        [ 3.0638e-41,  4.4842e-44,  0.0000e+00]])

0
投票

未初始化数据是来自未初始化内存的数据。 empty() 为自己分配内存,但之后

empty()
不会初始化其内存以获取已知数据。基本上,在分配内存后,内存会使用已知数据进行初始化,因为未初始化的分配内存具有未知数据(我们不知道数据是什么)。 *即使在未初始化的分配内存中也总会有一些数据。

您可以使用 manual_seed() 检查

rand(()
中的数据和 empty() 中的数据是否不同,如下所示:

*备忘录

  • rand()
    有一个随机种子来生成随机数。
  • empty()
    没有随机种子。
  • manual_seed()
    可以设置特定的种子来为
    rand()
    生成相同的随机数。

rand()
.*重复运行,总能得到相同的随机数:

import torch

torch.manual_seed(seed=8)

torch.rand(2, 3)
# tensor([[0.5979, 0.8453, 0.9464],
#         [0.2965, 0.5138, 0.6443]])

empty()
.*重复运行,你不可能总是得到相同的随机数:

import torch

torch.manual_seed(seed=8)

torch.empty(2, 3)
# tensor([[-1.0295e+08, 4.4141e-41, -1.0295e+08],
#         [4.4141e-41, 0.0000e+00, 0.0000e+00]])

此外,

empty()
可以比
rand()
更快地创建张量,因为
empty()
不需要内存初始化,如下所示。 *
empty()
rand()
快:

import torch

%timeit torch.empty(3, 2, 4)
# 2.67 µs ± 293 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit torch.rand(3, 2, 4)
# 4.07 µs ± 83.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
© www.soinside.com 2019 - 2024. All rights reserved.