Как я могу изменить размер тензора PyTorch с помощью скользящего окна? - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть тензор с размером: torch.Size([118160, 1]). То, что я хочу сделать, это разделить его на n тензоров по 100 элементов в каждом, скользя по 50 элементов за раз. Какой лучший способ добиться этого с PyTorch?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Возможное решение:

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

Однако последние несколько элементов будут короче window_size. Если это нежелательно, вы можете сделать:

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

РЕДАКТИРОВАТЬ:

Более читаемое решение:

# 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
1 голос
/ 11 февраля 2020

Ваше количество элементов должно делиться на 100. Если это не так, вы можете отрегулировать с помощью отступа.

Сначала вы можете выполнить разбиение в исходном списке. Затем выполните разделение списка, в котором первые 50 элементов будут удалены из исходного списка. Затем вы можете выбрать чередующийся порядок из A и B, если хотите сохранить исходный порядок.

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