如何在火炬管中展平张量?

时间:2019-04-06 07:34:45

标签: pytorch

给出一个具有多个维度的张量,我如何将其展平以使其具有一个单一维度?

例如:

>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])

如何将其展平以具有形状:

torch.Size([30])

4 个答案:

答案 0 :(得分:4)

使用torch.reshape,只能传递一个尺寸以使其变平。如果您不希望对维进行硬编码,则只需指定-1即可推断出正确的维。

>>> x = torch.tensor([[1,2], [3,4]])
>>> x.reshape(-1)
tensor([1, 2, 3, 4])

编辑:

例如: enter image description here

答案 1 :(得分:2)

flatten()C++ PyTorch code中使用下面的reshape()

使用flatten(),您可以执行以下操作:

import torch
input = torch.rand(2, 3, 4).cuda()
print(input.shape) # torch.Size([2, 3, 4])
print(input.flatten(start_dim=0, end_dim=1).shape) # torch.Size([6, 4])

同时使用相同的 flattening 如果您想使用reshape,则可以执行以下操作:

print(input.reshape((6,4)).shape) # torch.Size([6, 4])

但是通常您只需要像这样简单地展平:

print(input.reshape(-1).shape) # torch.Size([24])
print(input.flatten().shape) # torch.Size([24])

注意:

reshape()view()更健壮。它适用于任何张量,而view()仅适用于张量t,其中t.is_contiguous()==True

答案 2 :(得分:1)

您可以做一个简单的(with-output-to-string (*standard-output*) (some-function-whose-printed-output-you-want)) ; ==> a string with the actual output

t.view(-1)

答案 3 :(得分:-1)

TL; DR:

使用torch.flatten()中引入的v0.4.1中记录的v1.0rc1

>>> t = torch.tensor([[[1, 2],
                       [3, 4]],
                      [[5, 6],
                       [7, 8]]])
>>> torch.flatten(t)
tensor([1, 2, 3, 4, 5, 6, 7, 8])
>>> torch.flatten(t, start_dim=1)
tensor([[1, 2, 3, 4],
        [5, 6, 7, 8]])

对于v0.4.1和更低版本,请使用t.reshape(-1)


使用t.reshape(-1)

如果请求的视图在内存中是连续的 这将等于t.view(-1),并且不会复制内存。

否则,它将等同于t. contiguous() .view(-1)


其他非选项:

(注意:pytorch的{​​{1}}可能会更改数据,但是numpy's reshape() won't。)


reshape()需要一些讨论。 torch.Tensor.resize_ documentation说:

  

存储被重新解释为C连续的,忽略了当前的步幅(除非目标大小等于当前的大小,在这种情况下张量保持不变)

鉴于当前的步幅将以新的t.resize(t.numel())大小忽略,因此元素 的显示顺序可能与(1, numel())的显示顺序不同。但是,“大小” 可能表示内存大小,而不是张量的大小。

如果reshape(-1)既方便又高效,那么很好,但是t.resize(-1)可以使torch 1.0.1.post2给出:

t = torch.rand([2, 3, 5]);  t.resize(-1)

我对此here提出了功能要求,但共识是RuntimeError: requested resize to -1 (-1 elements in total), but the given tensor has a size of 2x2 (4 elements). autograd's resize can only change the shape of a given tensor, while preserving the number of elements. 是一种低级方法,应优先使用resize()