Размер тензора формы Pytorch

например, у меня есть 1D вектор с размерностью (5). Я хотел бы преобразовать его в 2D-матрицу (1,5).

вот как я это делаю с 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]])
>>> 

но как я могу это сделать с тензором Pytorch (и переменной). Я не хочу снова переключаться на numpy и снова переключаться на переменную Torch, потому что она потеряет информацию о обратном перемещении.

вот что у меня есть в 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,)

теперь я хочу, чтобы размер был (1, 5). Как изменить размер или измените размерность тензора pytorch в переменной без информации о градации потерь. (потому что я буду кормить в другую модель, прежде чем назад)

5 ответов


можно использовать

a.view(1,5)
Out: 

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

использовать факел.unsqueeze (input, dim, out=нет)

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

или вы можете использовать это, '-1' означает, что вам не нужно указывать количество элементов.

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

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

на на месте модификация тензора, вы обязательно должны использовать тензор.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, если в конце операции есть подчеркивание (например,tensor.resize_()), то эта операция делает in-place модификация исходного тензора.


кроме того, вы можете просто использовать np.newaxis в Тензоре факела для увеличения размера. Вот пример:

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])

на этот вопрос уже был дан исчерпывающий ответ, но я хочу добавить для менее опытных разработчиков python, что вы можете найти * оператор полезный совместно с view().

например, если у вас есть определенный размер тензора, которому вы хотите соответствовать другой тензор данных, вы можете попробовать:

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)

это работает с numpy shape тоже:

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)