web-dev-qa-db-fra.com

remodelage d'un tenseur avec rembourrage en pytorch

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?

12
yusuf

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.

9
nemo

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 rembourrage
  • value pour un remplissage constant.
14
cleros