Каков размерный диапазон [-1,0] в Pytorch? - PullRequest
2 голосов
/ 12 января 2020

Так что я изо всех сил пытаюсь понять некоторую терминологию о коллекциях в Pytorch. Я продолжаю сталкиваться с однотипными ошибками о том, что диапазон моих тензоров неверен, и когда я пытаюсь найти решение в Google, объяснения еще больше сбивают с толку.

Вот пример :

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([0.3300, 0.3937, -0.3113, -0.2880])
output = m(input)

Я не вижу ничего плохого в приведенном выше коде, и я определил мой LogSoftmax для принятия одномерного ввода. Таким образом, согласно моему опыту работы с другими языками программирования, коллекция [0.3300, 0.3937, -0.3113, -0.2880] представляет собой одно измерение.

Вышеприведенное вызывает следующую ошибку для m(input):

IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

Что это значит?

Я передал одномерный тензор, но потом он говорит мне, что ожидал диапазон [-1, 0], but got 1.

  • Диапазон чего?
  • Почему ошибка сравнения размеров 1 с [-1, 0]?
  • Что означают два числа [-1, 0]?

Я искал объяснение этой ошибки, и я нахожу такие вещи, как эта ссылка, которые не имеют смысла для меня как программиста:

https://github.com/pytorch/pytorch/issues/5554#issuecomment -370456868

Так что я смог чтобы исправить вышеприведенный код, добавив другое измерение в мои тензорные данные.

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([[-0.3300, 0.3937, -0.3113, -0.2880]])
output = m(input)

Так что это работает, но я не понимаю, как [-1,0] объясняет вложенную коллекцию.

Дальнейшие эксперименты показал, что также работает следующее:

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([[0.0, 0.1], [1.0, 0.1], [2.0, 0.1]])
output = m(input)

Итак, dim=1 означает коллекцию коллекций, но я не понимаю, как это означает [-1, 0].

Когда я пытаюсь использовать LogSoftmax(dim=2)

m = torch.nn.LogSoftmax(dim=2)
input = torch.tensor([[0.0, 0.1], [1.0, 0.1], [2.0, 0.1]])
output = m(input)

Выше приведено следующее сообщение об ошибке:

IndexError: Размер вне диапазона (ожидается, что он находится в диапазоне [-2, 1], но получил 2)

Опять путаница, что dim=2 равно [-2, 1], потому что где 1 значение взято из?

Я могу исправить вышеуказанную ошибку путем вложения коллекций другого уровня, но на данный момент я не понимаю, какие значения LogSoftmax ожидают.

m = torch.nn.LogSoftmax(dim=2)
input = torch.tensor([[[0.0, 0.1]], [[1.0, 0.1]], [[2.0, 0.1]]])
output = m(input)

Меня очень смущает эта терминология [-1, 0] и [-2, 1]?

Если первое значение является вложенной глубиной, то почему оно отрицательно и что может означать второе число?

Нет кода ошибки , связанного с этой ошибкой. Поэтому было трудно найти документацию по этому вопросу. Кажется, это чрезвычайно распространенная ошибка, из-за которой люди смущаются, и я ничего не могу найти в документации по Pytorch, в которой конкретно говорится об этом.

1 Ответ

2 голосов
/ 12 января 2020

При указании измерения тензора в качестве аргумента для функции (например, m = torch.nn.LogSoftmax(dim=1)) вы можете использовать положительное индексирование измерения, начиная с 0 для первого измерения, 1 для второго и т.д. c.
В качестве альтернативы вы можете использовать отрицательное индексирование измерения, чтобы начать с последнего измерения до первого: -1 означает последнее измерение, -2 - второе с последнего и т. Д. c.

Пример:
Если у вас есть четырехмерный тензор измерений b -by- c -by- h -by- w, тогда

  • Доступ к измерению «партия» (первый) возможен как dim=0 или dim=-4.
  • Доступ к измерению «канал» (второй) можно получить как dim=1 или dim=-3 ,
  • Размер «высота» / «вертикальный» (третий) может быть доступен как dim=2 или dim=-2.
  • Размер "ширина" / "горизонтальный" (четвертый) может быть доступен как dim=3 или dim=-1.

Следовательно, если у вас есть 4D-тензор * Аргумент 1036 * может принимать значения в диапазоне [-4, 3].

. В вашем случае у вас есть 1D-тензор, и, следовательно, аргумент dim может быть равным 0 или -1 (что в данном случае устаревшего равнозначно измерение).

...