3
votes

Comment ajouter un tenseur 2D à chaque tenseur 2D à partir d'un tenseur 3D

J'essaye d'ajouter un tenseur 2d à chaque tenseur 2d à partir d'un tenseur 3d. Disons que j'ai un tenseur a avec la forme (2,3,2) et un tenseur b avec (2,2) shape.

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

Je veux savoir s'il existe une méthode dans pytorch qui peut faire cela.


0 commentaires

3 Réponses :


0
votes

Ce que vous voulez faire:

a = (a.transpose(0, 1) + b).transpose(0, 1)
print(a) # prints the same tensor

Résultat:

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

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

Vous pouvez faire la même chose comme suit.

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)


0 commentaires

3
votes

Le moyen le plus efficace de le faire serait d'ajouter une deuxième dimension supplémentaire à b et d'utiliser la diffusion pour ajouter:

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 commentaires

0
votes

La solution proposée par @SinaAfrooze est correcte mais ce n'est pas la plus rapide.

TL; DR: torch.add (b.unsqueeze (1), a) est plus rapide.


Benchmarks:

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 commentaires