3 votes

Comment puis-je redimensionner un tenseur PyTorch avec une fenêtre coulissante ?

J'ai un tenseur avec une taille : torch.Size([118160, 1]) . Ce que je veux faire, c'est le diviser en n tenseurs de 100 éléments chacun, en glissant par 50 éléments à la fois. Quelle est la meilleure façon d'y parvenir avec PyTorch ?

1voto

ychnh Points 157

Votre nombre d'éléments doit être divisible par 100. Si ce n'est pas le cas, vous pouvez l'ajuster avec le padding.

Vous pouvez d'abord effectuer un fractionnement sur la liste originale. Puis faire un split sur la liste où les 50 premiers éléments sont retirés de la liste originale. Vous pouvez ensuite échantillonner en alternant l'ordre de A et B si vous voulez préserver l'ordre original.

A = yourtensor
B = yourtensor[50:] + torch.zeros(50,1)
A_ = A.view(100,-1)
B_ = B.view(100,-1)

1voto

Yahia Zakaria Points 461

Une solution possible :

window_size = 100
stride = 50
splits = [x[i:min(x.size(0),i+window_size)] for i in range(0,x.size(0),stride)]

Cependant, les derniers éléments seront plus courts que ceux de l'année précédente. window_size . Si cela n'est pas souhaité, vous pouvez le faire :

splits = [x[i:i+window_size] for i in range(0,x.size(0)-window_size+1,stride)]

EDIT :

Une solution plus lisible :

# if keep_short_tails is set to True, the slices shorter than window_size at the end of the result will be kept 
def window_split(x, window_size=100, stride=50, keep_short_tails=True):
  length = x.size(0)
  splits = []

  if keep_short_tails:
    for slice_start in range(0, length, stride):
      slice_end = min(length, slice_start + window_size)
      splits.append(x[slice_start:slice_end])
  else:
    for slice_start in range(0, length - window_size + 1, stride):
      slice_end = slice_start + window_size
      splits.append(x[slice_start:slice_end])

  return splits

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X