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.
3 Réponses :
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)
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)
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