Например, у меня есть вектор 1Д с измерением (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 и переключиться на вновь переменной Факел, потому что это будет потеря обратного распространения информации.
Вот что я имею в 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 в переменной без потери информации град. (потому что я буду кормить в другую модель, прежде чем назад)
Используйте факел.unsqueeze(вход, Евгений,=Нет)
>>> 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]
Для на месте изменение тензора, вы должны обязательно использовать тензора.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, если там'с подчеркиванием в конце операции (как тензор.resize_ ()`), то эта операция делает в месте модификация к оригинальной тензора.
Также, вы можете просто использовать `НП.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, который вы могли бы найти оператора *
полезно в сочетании с Вид()
.
Например, если у вас есть конкретный размер тензор, который вы хотите другой тензор данных, чтобы соответствовать, вы могли бы попробовать:
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 форма
ТОО:
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)
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'
Предположим следующий код:
import torch
import numpy as np
a = torch.tensor([1, 2, 3, 4, 5])
Следующие три вызова имеют тот же эффект:
res_1 = a.unsqueeze(0)
res_2 = a.view(1, 5)
res_3 = a[np.newaxis,:]
res_1.shape == res_2.shape == res_3.shape == (1,5) # Returns true
Обратите внимание, что для любой из полученных тензоров, если вы измените данные в них, вы также изменении данных, потому что они не'т иметь копию данных, а ссылку на исходные данные.
res_1[0,0] = 2
a[0] == res_1[0,0] == 2 # Returns true
Другой способ сделать это будет с помощью resize_ в место работы:
a.shape == res_1.shape # Returns false
a.reshape_((1, 5))
a.shape == res_1.shape # Returns true
Будьте осторожны с использованием resize_ или на месте эксплуатации с Автоград
. См. следующее обсуждение: https://pytorch.org/docs/stable/notes/autograd.html#in-place-operations-with-autograd