Как добавить 2d-тензор в каждый 2-й тензор из 3d-тензора - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь добавить 2d-тензор к каждому 2-мерному тензору из 3D-тензора. Допустим, у меня есть тензор a с формой (2,3,2) и тензор b с формой (2,2).

a = [[[1,2],
      [1,2],
      [1,2]],
     [[3,4],
      [3,4],
      [3,4]]]

b = [[1,2], [3,4]]

#the result i want to get
a[:, 0, :] + b
a[:, 1, :] + b
a[:, 2, :] + b

Я хочу знать, есть ли в pytorch метод, который может это сделать.

Ответы [ 3 ]

2 голосов
/ 10 мая 2019

Самый эффективный способ сделать это - добавить дополнительное второе измерение к b и использовать широковещательную передачу для добавления:

a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
b = torch.Tensor([[1,2],[3,4]])
a += b.unsqueeze(1)
0 голосов
/ 11 мая 2019

Решение @SinaAfrooze предложено правильно, но оно не самое быстрое.

TL; DR: torch.add(b.unsqueeze(1), a) быстрее.


Тесты:

import torch
a = torch.Tensor([[[1,2],[1,2],[1,2]],[[3,4],[3,4],[3,4]]])
b = torch.Tensor([[1,2],[3,4]])
z = a + b.unsqueeze(1)

%timeit k = torch.add(b.unsqueeze(1), a)
4.08 µs ± 25.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%timeit z = a + b.unsqueeze(1)
4.14 µs ± 29 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

torch.equal(k, z)
True
0 голосов
/ 09 мая 2019

Что вы хотите сделать:

a = [[[1,2],
      [1,2],
      [1,2]],
     [[3,4],
      [3,4],
      [3,4]]]

b = [[1,2], [3,4]]

a = torch.LongTensor(a)
b = torch.LongTensor(b)

a[:, 0, :] += b
a[:, 1, :] += b
a[:, 2, :] += b

print(a)

Вывод:

tensor([[[2, 4],
         [2, 4],
         [2, 4]],

        [[6, 8],
         [6, 8],
         [6, 8]]])

Вы можете сделать то же самое, как указано ниже.

a = (a.transpose(0, 1) + b).transpose(0, 1)
print(a) # prints the same tensor
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...