在pytorch中连接两个不同形状的火炬张量

Rus*_*own 0 concat concatenation torch pytorch tensor

我有两个火炬张量。一种有形[64, 4, 300],一种有形[64, 300]。如何连接这两个张量以获得 shape 的合成张量[64, 5, 300]。我知道tensor.cat用于此的函数,但为了使用该函数,我需要重塑第二个张量以匹配张量的维数。我听说不应该对张量进行整形,因为它可能会弄乱张量中的数据。我该如何进行这种连接?

我试过重塑,但接下来的部分让我对这种重塑更加怀疑。

a = torch.rand(64,300)

a1 = a.reshape(64,1,300)

list(a1[0]) == list(a)
Out[32]: False
Run Code Online (Sandbox Code Playgroud)

Szy*_*zke 5

您必须torch.cat沿第一个维度使用并unsqueeze在第一个维度上使用,如下所示:

import torch

first = torch.randn(64, 4, 300)
second = torch.randn(64, 300)

torch.cat((first, second.unsqueeze(dim=1)), dim=1)
# Shape: [64, 5, 300]
Run Code Online (Sandbox Code Playgroud)

它不会弄乱您的数据,它只会添加表面1维度(reshape无论如何都不会)。

  • 您也可以使用“reshape(64, 1, 300)”,但它很冗长。“unsqueeze”在“64”和“300”之间添加“1”维度,因此形状是可广播的。它是安全的,因为它仅使用步幅等更改内部数据表示(它保存在连续的 C++ 数组中)。仅当数据不能以这种非侵入性方式“重塑”时才会复制数据(如果您不想复制)如果发生这种情况,你应该使用“view”)。但你必须知道它是如何工作的,这样你才不会意外地混淆尺寸。 (2认同)