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()
следует использовать в предпочтении.