我正在浏览
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]])
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]])
未初始化数据是来自未初始化内存的数据。 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)