Как правильно получить доступ к элементам в 3D-Pytorch-Tensor? - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь получить доступ к нескольким элементам в 3D-Pytorch-Tensor, но количество возвращаемых элементов неверно.

Это мой код:

import torch

a = torch.FloatTensor(4,3,2)
print("a = {}".format(a))
print("a[:][:][0] = {}".format(a[:][:][0]))

Это вывод:

a = tensor([[[-4.8569e+36,  3.0760e-41],
         [ 2.7953e+20,  1.6928e+22],
         [ 3.1692e-40,  7.2945e-15]],

        [[ 2.5011e+24,  1.3173e-39],
         [ 1.7229e-07,  4.1262e-08],
         [ 4.1490e-08,  6.4103e-10]],

        [[ 3.1728e-40,  5.8258e-40],
         [ 2.8776e+32,  6.7805e-10],
         [ 3.1764e-40,  5.4229e+08]],

        [[ 7.2424e-37,  1.3697e+07],
         [-2.0362e-33,  1.8146e+11],
         [ 3.1836e-40,  1.9670e+34]]])
a[:][:][0] = tensor([[-4.8569e+36,  3.0760e-41],
        [ 2.7953e+20,  1.6928e+22],
        [ 3.1692e-40,  7.2945e-15]])

Я бы ожидал что-то вроде этого:

a[:][:][0] = tensor([[-4.8569e+36,  2.7953e+20, 3.1692e-40, 
          2.5011e+24, 1.7229e-07, 4.1490e-08, 
          3.1728e-40, 2.8776e+32, 3.1764e-40, 
          7.2424e-37, -2.0362e-33, 3.1836e-40]])

Может кто-нибудь объяснить мне, как я могу прийти к этому результату? Заранее большое спасибо!

Я получаю точно ожидаемый результат при выполнении:

for i in range(4):
   for j in range(3):
      print("a[{}][{}][0] = {}".format(i,j, a[i][j][0]))

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вот некоторые объяснения и правильный способ индексации элементов, которые вы ищете:

# input tensor to work with
In [11]: a = torch.arange(4*3*2).reshape(4,3,2)

# check its shape
In [12]: a.shape
Out[12]: torch.Size([4, 3, 2])

# inspect/annotate the tensor
In [13]: a
Out[13]:            # (    4      ,  3    ,    2      ) <= shape
tensor([[[ 0,  1],    | # block-0 | row-0 | col-0 col-1
         [ 2,  3],    | # block-0 | row-1 | col-0 col-1
         [ 4,  5]],   | # block-0 | row-2 | col-0 col-1

        [[ 6,  7],    | # block-1 | row-0 | col-0 col-1
         [ 8,  9],    | # block-1 | row-1 | col-0 col-1
         [10, 11]],   | # block-1 | row-2 | col-0 col-1

        [[12, 13],    | # block-2 | row-0 | col-0 col-1
         [14, 15],    | # block-2 | row-1 | col-0 col-1
         [16, 17]],   | # block-2 | row-2 | col-0 col-1

        [[18, 19],    | # block-3 | row-0 | col-0 col-1
         [20, 21],    | # block-3 | row-1 | col-0 col-1
         [22, 23]]])  | # block-3 | row-2 | col-0 col-1


# slice out what we need; (in all blocks, all rows, column-0)
In [14]: a[:, :, 0]
Out[14]: 
tensor([[ 0,  2,  4],
        [ 6,  8, 10],
        [12, 14, 16],
        [18, 20, 22]])

Объяснение / Разъяснение

Тензор имеет форму [4, 3, 2], где 4 представляет количество блоков (блок-0, ... блок-3). Далее у нас есть 3, который представляет количество строк в каждом блоке. И наконец, у нас есть 2, которые представляют количество столбцов в каждой строке. Мы разрезаем это, используя обозначение нарезки a[:, :, 0].

Чтобы получить доступ к блоку , нам понадобится только один индекс (а именно: a [0], ... a [3]). Чтобы получить доступ к определенной строке в конкретном блоке , нам понадобятся два индекса (а именно: [0, 1], ... a [3,2]). Чтобы получить доступ к определенному столбцу определенной строки из определенного блока , нам потребуются три индекса (а именно: [0, 1, 1] и т. Д.) .,)


Я предполагаю, что ваш случай вызвал путаницу из-за использования torch.FloatTensor(). Проблема с использованием torch.FloatTensor() заключается в том, что он будет распределять ненужные значения или значения, оставленные предыдущей программой, которая использовала эти блоки памяти. Иногда это может вызывать недоумение, потому что между последующими запусками мы можем получить противоречивые результаты.

0 голосов
/ 04 мая 2019

Короткий ответ, вам нужно использовать a[:, :, 0]

Дополнительные пояснения: Когда вы делаете a[:], он возвращает a сам.Таким образом, a[:][:][0] - это то же самое, что и a[0], который даст вам элементы в 0-й позиции первой оси (следовательно, размер равен (3,2)).То, что вы хотите, это элементы с 0-й позиции последней оси, для которых вам нужно сделать a[:, :, 0].

...