Pytorch remodeler tenseur de dimension

par exemple, j'ai un vecteur 1D avec la dimension (5). Je voudrais le remodeler en matrice 2D (1,5).

Voici comment je le fais avec numpy

>>> import numpy as np
>>> a = np.array([1,2,3,4,5])
>>> a.shape
(5,)
>>> a = np.reshape(a, (1,5))
>>> a.shape
(1, 5)
>>> a
array([[1, 2, 3, 4, 5]])
>>> 

mais comment puis-je faire cela avec le tenseur de Pytorch (et Variable). Je ne veux pas revenir à numpy et passer à la variable Torch à nouveau, parce qu'il va perdre des informations de rétropropagation.

>>> import torch
>>> from torch.autograd import Variable
>>> a = torch.Tensor([1,2,3,4,5])
>>> a

 1
 2
 3
 4
 5
[torch.FloatTensor of size 5]

>>> a.size()
(5L,)
>>> a_var = variable(a)
>>> a_var = Variable(a)
>>> a_var.size()
(5L,)
.....do some calculation in forward function
>>> a_var.size()
(5L,)

Maintenant je veux qu'il taille (1, 5). Comment puis-je redimensionner ou remodeler la dimension du tenseur pytorch dans L'information Variable sans perte de grade. (parce que je les ferai paître dans un autre modèle d'avant en arrière)

17
demandé sur kmario23 2017-04-10 19:38:52

5 réponses

vous pouvez utiliser

a.view(1,5)
Out: 

 1  2  3  4  5
[torch.FloatTensor of size 1x5]
12
répondu Lelik 2017-04-11 11:27:11

Utiliser torche.unsqueeze(entrée, dim=Aucun)

>>> import torch
>>> a = torch.Tensor([1,2,3,4,5])
>>> a

 1
 2
 3
 4
 5
[torch.FloatTensor of size 5]

>>> a = a.unsqueeze(0)
>>> a

 1  2  3  4  5
[torch.FloatTensor of size 1x5]
11
répondu Haha TTpro 2017-04-17 12:01:27

ou vous pouvez l'utiliser, le '-1' signifie que vous n'avez pas à spécifier le nombre d'éléments.

In [3]: a.view(1,-1)
Out[3]:

 1  2  3  4  5
[torch.FloatTensor of size 1x5]
4
répondu Mou Cai 2017-10-08 03:13:51

place modification du tenseur, vous devriez certainement utiliser tenseur.resize_ ():

In [23]: a = torch.Tensor([1, 2, 3, 4, 5])

In [24]: a.shape
Out[24]: torch.Size([5])


# tensor.resize_((`new_shape`))    
In [25]: a.resize_((1,5))
Out[25]: 

 1  2  3  4  5
[torch.FloatTensor of size 1x5]

In [26]: a.shape
Out[26]: torch.Size([1, 5])

à PyTorch, s'il y a un underscore à la fin d'une opération (comme tensor.resize_()) alors que l'opération n' in-place modification du tenseur d'origine.


vous pouvez aussi simplement utiliser np.newaxis dans un tenseur de torche pour augmenter la dimension. Voici un exemple:

In [34]: list_ = range(5)
In [35]: a = torch.Tensor(list_)
In [36]: a.shape
Out[36]: torch.Size([5])

In [37]: new_a = a[np.newaxis, :]
In [38]: new_a.shape
Out[38]: torch.Size([1, 5])
3
répondu kmario23 2017-12-23 21:22:19

cette question a déjà reçu une réponse complète, mais je voudrais ajouter pour les développeurs python moins expérimentés que vous pourriez trouver le * opérateur utile en conjonction avec view().

par exemple, si vous avez une taille de tenseur particulière à laquelle vous voulez qu'un tenseur différent de données se conforme, vous pouvez essayer:

img = Variable(tensor.randn(20,30,3)) # tensor with goal shape
flat_size = 20*30*3
X = Variable(tensor.randn(50, flat_size)) # data tensor

X = X.view(-1, *img.size()) # sweet maneuver
print(X.size()) # size is (50, 20, 30, 3)

Cela fonctionne avec numpy shape aussi:

img = np.random.randn(20,30,3)
flat_size = 20*30*3
X = Variable(tensor.randn(50, flat_size))
X = X.view(-1, *img.shape)
print(X.size()) # size is (50, 20, 30, 3)
2
répondu saetch_g 2017-11-29 20:30:24