tutorial from_numpy python numpy deep-learning pytorch tensor

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''