web-dev-qa-db-fra.com

Redimensionner le tenseur de PyTorch

J'utilise actuellement la fonction tensor.resize () pour redimensionner un tenseur en une nouvelle forme t = t.resize(1, 2, 3).

Cela me donne un avertissement de dépréciation:

le redimensionnement non sur place est obsolète

Par conséquent, je voulais passer à la fonction tensor.resize_(), qui semble être le remplacement sur place approprié. Cependant, cela me laisse avec un

ne peut pas redimensionner les variables qui nécessitent grad

erreur . Je peux retomber sur

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

c'est ce que fait tensor.resize () pour éviter l'avertissement de dépréciation . Cela ne me semble pas être une solution appropriée, mais plutôt un hack pour moi . Comment utiliser correctement tensor.resize_() dans ce cas?

3
LL_

Vous pouvez plutôt choisir d'utiliser tensor.reshape ou torch.reshape comme suit:

# 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

Utilisez simplement t = t.contiguous().view(1, 2, 3) si vous ne voulez pas vraiment changer ses données. 

Si ce n'est pas le cas, l'opération sur place resize_ cassera le graphe de calcul de grad de t.
Si cela ne vous dérange pas, utilisez simplement t = t.data.resize_(1,2,3).

0
Daniel