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)
5 réponses
vous pouvez utiliser
a.view(1,5)
Out:
1 2 3 4 5
[torch.FloatTensor of size 1x5]
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]
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]
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])
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)