Как мне сгладить тензор в pytorch? - PullRequest
0 голосов
/ 06 апреля 2019

Учитывая тензор нескольких измерений, как мне сгладить его так, чтобы он имел одно измерение?

Например:

>>> t = torch.rand([2, 3, 5])
>>> t.shape
torch.Size([2, 3, 5])

Как мне сгладить его, чтобы иметь форму:

torch.Size([30])

Ответы [ 2 ]

5 голосов
/ 06 апреля 2019

Используйте torch.reshape, и только одно измерение может быть передано для выравнивания.Если вы не хотите, чтобы размер был жестко задан, можно указать только -1, и будет выведен правильный размер.

>>> x = torch.tensor([[1,2], [3,4]])
>>> x.reshape(-1)
tensor([1, 2, 3, 4])

РЕДАКТИРОВАТЬ:

Для вашего примера: enter image description here

0 голосов
/ 06 апреля 2019

TL; DR:

Используйте torch.flatten(), который был представлен в v0.4.1 и задокументирован в v1.0rc1 :

>>> t = torch.tensor([[[1, 2],
                       [3, 4]],
                      [[5, 6],
                       [7, 8]]])
>>> torch.flatten(t)
tensor([1, 2, 3, 4, 5, 6, 7, 8])
>>> torch.flatten(t, start_dim=1)
tensor([[1, 2, 3, 4],
        [5, 6, 7, 8]])

Для v0.4.1 и более ранних версий используйте t.reshape(-1).


С t.reshape(-1):

Если запрошенное представление является непрерывным в памяти это будет эквивалентно t.view(-1), и память не будет скопирована.

В противном случае оно будет эквивалентно t.contiguous().view(-1).


Другие не опции:

(Примечание: pytorch reshape() может изменить данные, но numpy * reshape() не .)


t.resize(t.numel()) нуждается в некотором обсуждении. torch.Tensor.resize_ документация гласит:

Хранилище повторно интерпретируется как C-смежное, игнорируя текущие шаги (если целевой размер не равен текущему размеру, в этом случае тензор остается неизменным)

Учитывая, что текущие шаги будут игнорироваться с новым размером (1, numel()), порядок элементов может появляться в другом порядке, чем с reshape(-1). Однако «size» может означать размер памяти, а не размер тензорного.

Было бы неплохо, если бы t.resize(-1) работал и для удобства, и для эффективности, но с torch 1.0.1.post2, t = torch.rand([2, 3, 5]); t.resize(-1) дает:

RuntimeError: requested resize to -1 (-1 elements in total), but the given 
tensor has a size of 2x2 (4 elements). autograd's resize can only change the 
shape of a given tensor, while preserving the number of elements.

Я поднял запрос функции для этого здесь , но все согласились с тем, что resize() - это метод низкого уровня, и reshape() следует использовать в предпочтении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...