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

Posted

技术标签:

【中文标题】在pytorch中连接两个不同形状的火炬张量【英文标题】:Concatenating two torch tensors of different shapes in pytorch 【发布时间】:2020-08-27 06:26:18 【问题描述】:

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

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

a = torch.rand(64,300)

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

list(a1[0]) == list(a)
Out[32]: False

【问题讨论】:

【参考方案1】:

您必须在第一个维度上使用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]

它不会弄乱您的数据,它只是添加肤浅的1 维度(reshape 无论如何都不会正确完成)。

【讨论】:

感谢您的回答。我不应该在这里使用 reshape 对吗?另外,unsqueeze 是做什么的?为什么使用安全? 你也可以使用reshape(64, 1, 300),但它很冗长。 unsqueeze64300 之间添加1 维度,因此形状是可广播的。它是安全的,因为它只更改内部数据表示(它保存在连续的 C++ 数组中),例如跨步等。只有当数据不能以这种非侵入性方式“重塑”时才会复制数据(如果你不想复制你应该使用view)。但是你必须知道它是如何工作的,这样你才不会意外地混淆尺寸。

以上是关于在pytorch中连接两个不同形状的火炬张量的主要内容,如果未能解决你的问题,请参考以下文章

如何连接具有 2 个不同维度的 2d 张量

PyTorch 中的连接张量

pytorch,AttributeError:模块“火炬”没有属性“张量”

从火炬张量方法中解压和扩展的numpy等效代码

如何使用 TensorFlow 连接两个具有不同形状的张量?

在pytorch闪电中定义两个张量的以下乘法