python - from_numpy - pytorch tutorial
Pytorch remodelar dimensiĆ³n tensorial (6)
Por ejemplo, tengo vector 1D con dimensión (5). Me gustaría remodelarlo en matriz 2D (1,5).
Así es como lo hago con 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]])
>>>
Pero, ¿cómo puedo hacer eso con Pytorch Tensor (y Variable)? No quiero volver a cambiar a numpy y volver a cambiar a la variable Torch, ya que perderá la información de backpropagation.
Esto es lo que tengo en Pytorch.
>>> 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,)
Ahora quiero que el tamaño sea (1, 5). ¿Cómo puedo redimensionar o remodelar la dimensión del tensor de pytorch en Variable sin información de graduación de pérdida? (porque voy a alimentar a otro modelo antes de retroceder)
Esta pregunta ya ha sido respondida a fondo, pero quiero agregar para los desarrolladores de Python con menos experiencia que pueda encontrar útil al operador *
junto con view()
.
Por ejemplo, si tiene un tamaño de tensor particular al que desea que se ajuste un tensor de datos diferente, puede intentar:
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)
Esto funciona también con la shape
numpy:
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)
Para la modificación en el lugar del tensor, definitivamente debe usar tensor.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])
En PyTorch, si hay un guión bajo al final de una operación (como tensor.resize_()
), entonces esa operación realiza in-place
modificación en el in-place
del tensor original.
Además, puede simplemente usar np.newaxis
en un Tensor de antorcha para aumentar la dimensión. Aquí hay un ejemplo:
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])
Use torch.unsqueeze (input, dim, out = None)
>>> 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]
o puede usar esto, el ''-1'' significa que no tiene que especificar el número de los elementos.
In [3]: a.view(1,-1)
Out[3]:
1 2 3 4 5
[torch.FloatTensor of size 1x5]
podrías usar
a.view(1,5)
Out:
1 2 3 4 5
[torch.FloatTensor of size 1x5]
import torch
>>>a = torch.Tensor([1,2,3,4,5])
>>>a.size()
torch.Size([5])
#use view to reshape
>>>b = a.view(1,a.shape[0])
>>>b
tensor([[1., 2., 3., 4., 5.]])
>>>b.size()
torch.Size([1, 5])
>>>b.type()
''torch.FloatTensor''