pytorch - How do I flatten a tensor in pytorch?
问题描述
Given a tensor of multiple dimensions, how do I flatten it so that it has a single dimension?
Eg:
>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])
How do I flatten it to have shape:
torch.Size([30])
解决方案
TL;DR: torch.flatten()
Use torch.flatten()
which was introduced in v0.4.1 and documented in 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]])
For v0.4.1 and earlier, use t.reshape(-1)
.
With t.reshape(-1)
:
If the requested view is contiguous in memory
this will equivalent to t.view(-1)
and memory will not be copied.
Otherwise it will be equivalent to t.
contiguous()
.view(-1)
.
Other non-options:
t.view(-1)
won't copy memory, but may not work depending on original size and stridet.resize(-1)
givesRuntimeError
(see below)t.resize(t.numel())
warning about being a low-level method (see discussion below)
(Note: pytorch
's reshape()
may change data but numpy
's reshape()
won't.)
t.resize(t.numel())
needs some discussion. The torch.Tensor.resize_
documentation says:
The storage is reinterpreted as C-contiguous, ignoring the current strides (unless the target size equals the current size, in which case the tensor is left unchanged)
Given the current strides will be ignored with the new (1, numel())
size, the order of the elements may apppear in a different order than with reshape(-1)
. However, "size" may mean the memory size, rather than the tensor's size.
It would be nice if t.resize(-1)
worked for both convenience and efficiency, but with torch 1.0.1.post2
, t = torch.rand([2, 3, 5]); t.resize(-1)
gives:
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.
I raised a feature request for this here, but the consensus was that resize()
was a low level method, and reshape()
should be used in preference.
推荐阅读
- php - 将 echo php 添加到 jQuery 窗口确认()
- makefile - 是否可以强制 GNU Make 更具体地说明实际缺少哪些依赖项?
- python - 比较数据框中的两列并使用熊猫样式突出显示值
- php - PHP XPath - 使用“评估”读取节点属性时遇到问题
- python - 如何在pyqt5中允许tab键按下事件
- java - LibGDX:从坠落的物体施加自然力
- matlab - 如何调用 M 文件到 Simulink 模型?
- javascript - 为什么 WebGL 可用的扩展会有所不同?
- python - 多个 GPU 上的 TensorFlow
- reactjs - 将环境变量从服务器传递到您的 Create-React-App