.flatten()
和.view(-1)
都在PyTorch中拉平张量。有什么不同?
.flatten()
是否复制张量的数据?.view(-1)
更快吗?.flatten()
不起作用的情况?我试图阅读PyTorch的文档,但是它不能回答这些问题。
答案 0 :(得分:3)
flatten
只是 view
的常见用例的 convenient alias。1
还有其他几个:
功能 | 等价的 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_dim
和 end_dim
参数展平特定的连续维度子集。
reshape
。答案 1 :(得分:1)
除了@adeelh的评论,还有另一个区别:torch.flatten()
产生.reshape()
,而differences between .reshape()
and .view()
则是:
[...]
torch.reshape
可能会返回原始张量的副本或视图。您不能指望它返回视图或副本。另一个差异是reshape()可以在连续和非连续的张量上运行,而view()只能在连续的张量上运行。另请参阅此处有关连续的含义
对于上下文:
一段时间以来,社区要求使用flatten
函数,并且在Issue #7743之后,该功能已在PR #8578中实现。
您可以看到扁平化here的实现,在.reshape()
行中可以看到对return
的调用。