1. ホーム
  2. pytorch

[解決済み】pytorchでテンソルを平らにする方法は?

2022-02-07 03:43:32

質問内容

多次元のテンソルがあるとき、それを平らにして一次元にするにはどうしたらよいか?

>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])

どのように平らにすれば、形を持つようになるのでしょうか。

torch.Size([30])

解決方法は?

TL;DR: torch.flatten()

使用方法 torch.flatten() で紹介した v0.4.1 でドキュメント化されています。 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]])

v0.4.1以前のバージョンでは t.reshape(-1) .


t.reshape(-1) :

要求されたビューがメモリ上で連続している場合 と同じになります。 t.view(-1) となり、メモリがコピーされなくなります。

そうでない場合は、以下と同等となります。 t. contiguous() .view(-1) .


その他の非オプション

(注 pytorch 's reshape() はデータを変更することができますが numpy 's reshape() はしない .)


t.resize(t.numel()) は、少し議論が必要です。その torch.Tensor.resize_ ドキュメンテーション は言う。

ストレージは、現在のストライドを無視してC-contiguousとして再解釈される(ターゲットサイズが現在のサイズと等しい場合を除き、その場合テンソルは変更されないままである)。

現在のストライドが無視されることを考えると、新しい (1, numel()) のサイズでは、要素の順序は かもしれない とは異なる順序で表示されます。 reshape(-1) . ただし、"size" かもしれない はテンソルのサイズではなく、メモリサイズを意味する。

があればいいのですが。 t.resize(-1) は、利便性と効率性の両方の観点から機能しますが torch 1.0.1.post2 , t = torch.rand([2, 3, 5]); t.resize(-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() は低レベルのメソッドであり reshape() を優先的に使用すべきです。