Изучение различных методов реализации прокручивания окон в PyTorch

В этой статье блога мы рассмотрим различные методы реализации прокручивающихся окон в PyTorch. Скользящие окна — полезный метод анализа временных рядов и обработки данных, позволяющий нам выполнять вычисления и преобразования в скользящем окне данных. Мы рассмотрим несколько подходов и предоставим примеры кода, демонстрирующие их реализацию.

Метод 1: ручное зацикливание
Один из простых методов – использование ручного зацикливания. Мы перебираем входные данные и на каждом шаге извлекаем желаемый размер окна.

import torch
def rolling_window_manual(data, window_size):
    windows = []
    for i in range(len(data) - window_size + 1):
        window = data[i:i+window_size]
        windows.append(window)
    return torch.stack(windows)
# Usage
data = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
window_size = 3
result = rolling_window_manual(data, window_size)
print(result)

Метод 2: развертывание с помощью View
PyTorch предоставляет функцию unfold, которую можно использовать для создания прокручивающихся окон. Мы изменяем форму входного тензора с помощью функции unfold, а затем применяем view, чтобы получить желаемый размер окна.

import torch
def rolling_window_unfold(data, window_size):
    unfolded = data.unfold(0, window_size, 1)
    windows = unfolded.split(window_size, dim=1)
    return torch.stack(windows)
# Usage
data = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
window_size = 3
result = rolling_window_unfold(data, window_size)
print(result)

Метод 3: просмотр в скользящем окне
Другой подход — использование просмотра в скользящем окне. Мы используем функцию as_stridedдля создания представления входного тензора с желаемым размером окна и шагом.

import torch
def rolling_window_sliding_view(data, window_size):
    stride = data.stride()[0]
    windows = data.as_strided((len(data) - window_size + 1, window_size), (stride, 1))
    return windows
# Usage
data = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
window_size = 3
result = rolling_window_sliding_view(data, window_size)
print(result)

Метод 4: TorchSignal
Если вы работаете с данными временных рядов, библиотека torchsignalобеспечивает эффективную реализацию скользящих окон, специально разработанную для задач обработки сигналов.

import torch
from torchsignal import RollingWindow
def rolling_window_torchsignal(data, window_size):
    rw = RollingWindow(window_size, padding=True)
    windows = rw(torch.unsqueeze(data, dim=1))
    return windows.squeeze(dim=1)
# Usage
data = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
window_size = 3
result = rolling_window_torchsignal(data, window_size)
print(result)

В этой статье мы рассмотрели различные методы реализации прокручивающихся окон в PyTorch. Мы рассмотрели ручное зацикливание, использование unfoldс view, скользящие представления окон и использование библиотеки torchsignalдля задач обработки сигналов. Каждый метод имеет свои преимущества и может подойти для разных сценариев. Используя эти методы, вы можете эффективно обрабатывать данные временных рядов и выполнять вычисления в прокручивающихся окнах в ваших проектах PyTorch.