背景 我试图坚持使用 torch 框架,以确保如果所使用的数据结构位于 GPU 中,那么它全部位于 GPU 中,反之亦然,这样我就不会混合主机和设备级别的变量。
问题 所以我想定义一个变量,或者一个包含维度值的小向量。所以我有一个包含数据的
torch.Tensor
,让我们全部data
。所以如果我写 data.shape
它会返回
torch.Size([1, 2000, 3000])
所以我想将这些信息存储在另一个
torch.Tensor
对象中,所以我写:
dimensional_tensor = torch.Tensor(data.shape)
问题是它不存储这些值,而是生成一个
Tensor
对象,其看起来像伪随机数并且与 data.shape
形状相同,即,如果我写 dimensional_tensor
,我会得到此输出:
tensor([[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.],
[0., 0., 0., ..., 0., 0., 0.]])
如果我写的话
dimensional_tensor = torch.Tensor(list(data.shape))
甚至
dimensional_tensor = torch.tensor(data.shape)
然后它就会做我想要的事情。这是怎么回事?
我使用的是pytorch 2.1.0。我不知道如何查看Python源代码并找出为什么会发生这种情况。我怀疑这可能是因为 torch 是二进制级别的代码。
正如我上面提到的,我希望调用
torch.Tensor(data.shape)
会产生一个 torch.Tensor
,其中包含 data.shape
调用的数值。
结果: 尺寸为
torch.Tensor
的 data.shape
对象似乎充满了伪随机数。
如果这是应该的方式,我对此没有任何问题。我只想了解这种行为背后的基本原理,但我无法找到任何支持/解释这种行为的文档。也许这是一个错误?
torch.Tensor
构造函数被重载,以执行与torch.tensor
和torch.empty
相同的操作。 torch.empty 返回一个充满未初始化数据的张量。张量的形状由可变参数大小定义。因此,当您使用 torch.Tensor
调用 torch.Size
时,预期的行为是获得看似随机(未初始化)的数据,其形状由 torch.Size
对象定义。
开发人员在 pytorch 论坛上对此有一个很棒的答案,这也解释了为什么会这样:
我们的 torch.Tensor 构造函数被重载,以执行与 torch.tensor 和 torch.empty 相同的操作。我们认为这种重载会使代码变得混乱,因此我们将 torch.Tensor 拆分为 torch.tensor 和 `torch.empty。所以@yxchng是的,在某种程度上,torch.tensor的工作原理与torch.Tensor类似(当你传入数据时)。 @ProGamerGov 不,两者都不应该比另一个更有效率。只是 torch.empty 和 torch.tensor 具有比我们传统的 torch.Tensor 构造函数更好的 API。
你是对的,这应该记录下来,但是提到
要使用预先存在的数据创建张量,请使用 torch.tensor()。