J'ai un tenseur avec des dimensions (30, 35, 49)
. Je veux le remodeler en (30, 35, 512)
afin de pouvoir se multiplier avec un autre tenseur qui a aussi la forme (30, 35, 512)
.
Je veux faire un rembourrage sur le tenseur avec (30, 35, 49)
dimension pour en faire (30, 35, 512)
dimensionnel.
Comment cela peut-il être fait?
La solution la plus simple consiste à allouer un tenseur avec votre valeur de remplissage et les dimensions cibles et affecter la partie pour laquelle vous avez des données:
target = torch.zeros(30, 35, 512)
source = torch.ones(30, 35, 49)
target[:, :, :49] = source
Notez qu'il n'y a aucune garantie que le remplissage de votre tenseur avec des zéros puis sa multiplication avec un autre tenseur ait un sens à la fin, c'est à vous de décider.
Bien que la solution de @ nemo fonctionne correctement, il existe une routine interne pytorch, torch.nn.functional.pad
, qui fait de même - et qui a quelques propriétés qu'une solution torch.ones(*sizes)*pad_value
ne le fait pas (à savoir d'autres formes de remplissage, comme le remplissage de réflexion ou le remplissage de réplication ... il vérifie également certaines propriétés liées au gradient):
import torch.nn.functional as F
source = torch.Rand((5,10))
# now we expand to size (7, 11) by appending a row of 0s at pos 0 and pos 6,
# and a column of 0s at pos 10
result = F.pad(input=source, pad=(0, 1, 1, 1), mode='constant', value=0)
La sémantique des arguments est:
input
: le tenseur source,pad
: une liste de longueur 2 * len(source.shape)
de la forme (début dernier axe, fin dernier axe, début 2ème avant-dernier axe, fin 2ème avant-dernier axe, début 3e avant-dernier axe, etc. ) qui indique le nombre de dimensions à ajouter au début et à la fin de chaque axe,mode
: 'constant'
, 'reflect'
ou 'replicate'
. Par défaut: 'constant'
Pour les différents types de rembourragevalue
pour un remplissage constant.