web-dev-qa-db-ja.com

PyTorch Tensorのサイズ変更

現在、テンソルのサイズを新しい形状t = t.resize(1, 2, 3)に変更するためにtensor.resize()関数を使用しています。

これは私に非推奨の警告を与えます:

非インプレースのサイズ変更は廃止されました

したがって、適切なインプレース置換のように見えるtensor.resize_()関数に切り替えたいと思いました。ただし、これにより、

gradを必要とする変数のサイズを変更できません

エラー。私はフォールバックできます

_from torch.autograd._functions import Resize
Resize.apply(t, (1, 2, 3))
_

これは、非推奨の警告を回避するためにtensor.resize()が行うことです。これは適切な解決策のようには見えませんが、むしろハックです。この場合、tensor.resize_()を正しく使用するにはどうすればよいですか?

6
LL_

代わりにtensor.reshapeまたはtorch.reshapeのように:

# a `Variable` tensor
In [15]: ten = torch.randn(6, requires_grad=True)

# this would throw RuntimeError error
In [16]: ten.resize_(2, 3)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-16-094491c46baa> in <module>()
----> 1 ten.resize_(2, 3)

RuntimeError: cannot resize variables that require grad

# RuntimeError can be resolved by using `tensor.reshape`
In [17]: ten.reshape(2, 3)
Out[17]: 
tensor([[-0.2185, -0.6335, -0.0041],
        [-1.0147, -1.6359,  0.6965]])

# yet another way of changing tensor shape
In [18]: torch.reshape(ten, (2, 3))
Out[18]: 
tensor([[-0.2185, -0.6335, -0.0041],
        [-1.0147, -1.6359,  0.6965]])
2
kmario23

データを変更したくない場合は、単にt = t.contiguous().view(1, 2, 3)を使用してください。

そうでない場合、インプレース_resize__操作はtのgrad計算グラフを壊します。
それが重要でない場合は、t = t.data.resize_(1,2,3)を使用してください。

0
Daniel

次のようなことを試してください:

import torch
x = torch.tensor([[1, 2], [3, 4], [5, 6]])
print(":::",x.resize_(2, 2))
print("::::",x.resize_(3, 3))
0
Sunil