我不明白将 torch.Size 对象传递给 torch.Tensor 时的行为

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

背景 我试图坚持使用 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
对象似乎充满了伪随机数。

如果这是应该的方式,我对此没有任何问题。我只想了解这种行为背后的基本原理,但我无法找到任何支持/解释这种行为的文档。也许这是一个错误?

python pytorch tensor
1个回答
0
投票

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()。

© www.soinside.com 2019 - 2024. All rights reserved.