【问题标题】:Concatenating two torch tensors of different shapes in pytorch在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

【问题讨论】:

    标签: concatenation pytorch concat tensor torch


    【解决方案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)。但是你必须知道它是如何工作的,这样你才不会意外地混淆尺寸。
    猜你喜欢
    • 2021-05-21
    • 2021-07-08
    • 2018-10-29
    • 2022-07-20
    • 2017-02-23
    • 2022-01-12
    • 2020-04-16
    • 2018-11-20
    • 2018-04-29
    相关资源
    最近更新 更多