给出一个具有多个维度的张量,我如何将其展平以使其具有一个单一维度?
例如:
>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])
如何将其展平以具有形状:
torch.Size([30])
答案 0 :(得分:4)
使用torch.reshape
,只能传递一个尺寸以使其变平。如果您不希望对维进行硬编码,则只需指定-1
即可推断出正确的维。
>>> x = torch.tensor([[1,2], [3,4]])
>>> x.reshape(-1)
tensor([1, 2, 3, 4])
编辑:
答案 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)
使用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)
。
其他非选项:
t.view(-1)
won't copy memory, but may not work depending on original size and stride
t.resize(-1)
给出RuntimeError
(见下文)
t.resize(t.numel())
warning about being a low-level method
(请参见下面的讨论)
(注意: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()
。