Что означает -1 в представлении pytorch? - PullRequest
0 голосов
/ 11 июня 2018

Как следует из вопроса, что -1 делает в pytorch view?

In [2]: a = torch.arange(1, 17)

In [3]: a
Out[3]:
tensor([  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
         11.,  12.,  13.,  14.,  15.,  16.])

In [7]: a.view(-1,1)
Out[7]:
tensor([[  1.],
        [  2.],
        [  3.],
        [  4.],
        [  5.],
        [  6.],
        [  7.],
        [  8.],
        [  9.],
        [ 10.],
        [ 11.],
        [ 12.],
        [ 13.],
        [ 14.],
        [ 15.],
        [ 16.]])

In [8]: a.view(1,-1)
Out[8]:
tensor([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
          11.,  12.,  13.,  14.,  15.,  16.]])

Создает ли оно (-1) дополнительное измерение?Он ведет себя так же, как numpy reshape -1?

Ответы [ 3 ]

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

Да, он ведет себя как -1 в numpy.reshape(), то есть фактическое значение для этого измерения будет выведено таким образом, чтобы количество элементов в представлении совпадало с исходным количеством элементов.

Дляэкземпляр:

import torch

x = torch.arange(6)

print(x.view(3, -1))      # inferred size will be 2 as 6 / 3 = 2
# tensor([[ 0.,  1.],
#         [ 2.,  3.],
#         [ 4.,  5.]])

print(x.view(-1, 6))      # inferred size will be 1 as 6 / 6 = 1
# tensor([[ 0.,  1.,  2.,  3.,  4.,  5.]])

print(x.view(1, -1, 2))   # inferred size will be 3 as 6 / (1 * 2) = 3
# tensor([[[ 0.,  1.],
#          [ 2.,  3.],
#          [ 4.,  5.]]])

# print(x.view(-1, 5))    # throw error as there's no int N so that 5 * N = 6
# RuntimeError: invalid argument 2: size '[-1 x 5]' is invalid for input with 6 elements

print(x.view(-1, -1, 3))  # throw error as only one dimension can be inferred
# RuntimeError: invalid argument 1: only one dimension can be inferred
0 голосов
/ 13 июня 2018

Из документации PyTorch :

>>> x = torch.randn(4, 4)
>>> x.size()
torch.Size([4, 4])
>>> y = x.view(16)
>>> y.size()
torch.Size([16])
>>> z = x.view(-1, 8)  # the size -1 is inferred from other dimensions
>>> z.size()
torch.Size([2, 8])
0 голосов
/ 11 июня 2018

Полагаю, это работает аналогично np.reshape.

из здесь :

Новая форма должна быть совместима с исходной формой.Если целое число, то результатом будет одномерный массив этой длины.Одно измерение формы может быть -1.В этом случае значение выводится из длины массива и оставшихся измерений .

Если вы берете a = torch.arange(1, 18), вы можете просмотреть его различными способами, такими как a.view(-1,6), a.view(-1,9), a.view(3,-1) и т. Д.

...