PyTorch中的.flatten()和.view(-1)有什么区别?

时间:2019-07-27 16:35:19

标签: pytorch

.flatten().view(-1)都在PyTorch中拉平张量。有什么不同?

  1. .flatten()是否复制张量的数据?
  2. .view(-1)更快吗?
  3. 是否有.flatten()不起作用的情况?

我试图阅读PyTorch的文档,但是它不能回答这些问题。

2 个答案:

答案 0 :(得分:3)

flatten 只是 view 的常见用例的 convenient alias1

还有其他几个:

<头>
功能 等价的 view 逻辑
flatten() view(-1)
flatten(start, end) view(*t.shape[:start], -1, *t.shape[end+1:])
squeeze() view(*[s for s in t.shape if s != 1])
unsqueeze(i) view(*t.shape[:i-1], 1, *t.shape[i:])

请注意,flatten 允许您使用 start_dimend_dim 参数展平特定的连续维度子集。


  1. 实际上是表面上等效的 reshape

答案 1 :(得分:1)

除了@adeelh的评论,还有另一个区别:torch.flatten()产生.reshape(),而differences between .reshape() and .view()则是:

  
      
  • [...] torch.reshape可能会返回原始张量的副本或视图。您不能指望它返回视图或副本。

  •   
  • 另一个差异是reshape()可以在连续和非连续的张量上运行,而view()只能在连续的张量上运行。另请参阅此处有关连续的含义

  •   

对于上下文:

  • 一段时间以来,社区要求使用flatten函数,并且在Issue #7743之后,该功能已在PR #8578中实现。

  • 您可以看到扁平化here的实现,在.reshape()行中可以看到对return的调用。