Как изменить трехмерный тензор формы (3, 1, 2) в (1, 2, 3) - PullRequest
0 голосов
/ 06 июня 2018

Я намеревался

(Pdb) aa = torch.tensor([[[1,2]], [[3,4]], [[5,6]]])
(Pdb) aa.shape
torch.Size([3, 1, 2])
(Pdb) aa
tensor([[[ 1,  2]],

        [[ 3,  4]],

        [[ 5,  6]]])
(Pdb) aa.view(1, 2, 3)
tensor([[[ 1,  2,  3],
         [ 4,  5,  6]]])

Но что я действительно хочу, это

tensor([[[ 1,  3,  5],
         [ 2,  4,  6]]])

Как?

В моем приложении я пытаюсь преобразовать свои входные данные изформа (L, N, C_in) в (N, C_in, L) для использования Conv1d , где

  • L: длина последовательности
  • N:размер пакета
  • C_in: количество каналов на входе, я также понимаю это как размерность входа на каждой позиции последовательности.

Мне также интересно, как вводитсяConv1d не имеет такой же формы ввода, как GRU ?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Можно переставлять оси до нужной формы.(В некотором смысле это похоже на операцию np.rollaxis).

In [90]: aa
Out[90]: 
tensor([[[ 1,  2]],

        [[ 3,  4]],

        [[ 5,  6]]])

In [91]: aa.shape
Out[91]: torch.Size([3, 1, 2])

# pass the desired ordering of the axes as argument
# assign the result back to some tensor since permute returns a "view"
In [97]: permuted = aa.permute(1, 2, 0)

In [98]: permuted.shape
Out[98]: torch.Size([1, 2, 3])

In [99]: permuted
Out[99]: 
tensor([[[ 1,  3,  5],
         [ 2,  4,  6]]])
0 голосов
/ 06 июня 2018

Это один из способов сделать это, все еще надеемся увидеть решение с помощью одной операции.

(Pdb) torch.transpose(aa, 0, 2).t()
tensor([[[ 1,  3,  5],
         [ 2,  4,  6]]])
(Pdb) torch.transpose(aa, 0, 2).t().shape
torch.Size([1, 2, 3])
...