如何展平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])