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