web-dev-qa-db-fra.com

Comment puis-je ajouter un élément à un tenseur de Pytorch le long d'une certaine dimension?

J'ai un tenseur inps, qui a une taille de [64, 161, 1] et j'ai quelques nouvelles données d qui a une taille de [64, 161]. Comment puis-je ajouter d à inps tel que la nouvelle taille est [64, 161, 2]?

3
Shamoon

Il y a une manière plus propre à l'aide de .unsqueeze() et torch.cat(), qui utilise directement l'interface Pytorch:

import torch

# create two sample vectors
inps = torch.randn([64, 161, 1])
d = torch.randn([64, 161])

# bring d into the same format, and then concatenate tensors
new_inps = torch.cat((inps, d.unsqueeze(2)), dim=-1)
print(new_inps.shape)  # [64, 161, 2]

Essentiellement, il est essentiel de léger que la deuxième dimension apporte déjà les deux tenseurs dans la même forme; Il suffit de faire attention à désactiver le long de la bonne dimension. De même, la Concaténation est malheureusement nommée différemment de la fonction numpy nommée autre que similaire, mais se comporte de la même manière. Notez que au lieu de laisser torch.cat comprendre la dimension en fournissant dim=-1, vous pouvez également fournir explicitement la dimension de concaténer, dans ce cas en le remplaçant avec dim=2.

Gardez à l'esprit la différence entre la concaténation et l'empilement , ce qui est utile pour des problèmes similaires avec les dimensions de tenseur.

1
dennlinger

Vous devez d'abord remodeler d afin qu'il ait une troisième dimension le long de laquelle la concaténation devient possible. Après avoir une troisième dimension et que les deux tenseurs ont le même nombre de dimensions, vous pouvez utiliser TORCH.CAT ((INPS, D), 2) pour les empiler.

old_shape = Tuple(d.shape)
new_shape = old_shape + (1,)
inps_new = torch.cat( (inps, d.view( new_shape ), 2)
1
Conor