如何展平pytorch中的张量?

如何展平pytorch中的张量?,pytorch,Pytorch,给定一个多维张量,我如何展平它,使它有一个一维 例如: 如何将其展平以形成形状: torch.Size([30]) TL;DR:torch.flatte() 在以下文件中介绍并记录的用途: 对于v0.4.1和更早版本,使用 使用t.重塑(-1): 如果请求的视图在内存中是连续的 这将相当于,并且不会复制内存 否则它将相当于t..view(-1) 其他非选择: t.view(-1) t.resize(-1)给出RuntimeError(见下文) t.resize(t.numel()) (见

给定一个多维张量,我如何展平它,使它有一个一维

例如:

如何将其展平以形成形状:

torch.Size([30])
TL;DR:
torch.flatte()
在以下文件中介绍并记录的用途:

对于v0.4.1和更早版本,使用


使用
t.重塑(-1)

如果请求的视图在内存中是连续的 这将相当于,并且不会复制内存

否则它将相当于
t.
.view(-1)


其他非选择:

  • t.view(-1)

  • t.resize(-1)
    给出
    RuntimeError
    (见下文)

  • t.resize(t.numel())
    (见下文讨论)

(注意:
pytorch
restrape()
可能会更改数据,但是。)


t.resize(t.numel())
需要一些讨论。报告说:

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

考虑到当前步幅将被新的
(1,numel())
大小忽略,元素的顺序可能与
重塑(-1)
的顺序不同。然而,“大小”可能意味着内存的大小,而不是张量的大小

如果
t.resize(-1)
既方便又高效,但是使用
torch 1.0.1.post2
t=torch.rand([2,3,5]),那就太好了;t、 调整大小(-1)
提供:

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()
是一种低级方法,应该优先使用
restrape()

使用
torch。restrape
只能传递一个维度来展平它。如果不希望对尺寸进行硬编码,只需指定
-1
,即可推断出正确的尺寸

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

例如:
flatte()
在中的下方使用
重塑()

使用
flatte()
可以执行以下操作:

导入火炬
输入=torch.rand(2,3,4).cuda()
打印(输入.形状)#火炬.尺寸([2,3,4])
打印(输入.展平(开始尺寸=0,结束尺寸=1).shape)#火炬尺寸([6,4])
而对于相同的展平,如果要使用
重塑
,则可以执行以下操作:

打印(输入.整形((6,4)).shape)#火炬.尺寸([6,4])
但通常你只需要做如下简单的展平:

打印(输入.整形(-1).shape)#火炬.尺寸([24])
打印(input.flatte().shape)#火炬尺寸([24])
注:

restrape()
view()
更健壮。它将在任何张量上工作,而
view()
仅在张量
t
上工作,其中
t.是连续的()==True


您可以执行一个简单的
t.view(-1)


您只需指定
-1
挤压
操作实际上是不必要的。
重塑
可以做到这一点。
重塑()
可能会返回原始张量的副本或视图。上面答案中的Doco链接.torch.flatte(var,start\u dim=1),start\u dim参数很好。由于
torch.rand([2,3,5])而失败。
。有关输出,请参见我的答案。@TomHale请查看附带的屏幕截图。我不明白为什么要用“向下投票”而不是简单的轻推。我用的是
restrape
注意
restrape()
总是复制内存。不总是像前面解释的那样
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.
>>> x = torch.tensor([[1,2], [3,4]])
>>> x.reshape(-1)
tensor([1, 2, 3, 4])
>>>t = torch.rand([2, 3, 5])
>>>t = t.view(-1)
>>>t.shape
torch.Size([30])