Скользящее окно и подготовка последовательностей

Keras.js — библиотека, позволяющая запускать модели Keras в браузере на чистом JavaScript. Она обеспечивает прямое выполнение нейронных сетей без необходимости отдельного серверного окружения. При работе с временными рядами и последовательными данными ключевую роль играет техника скользящего окна (sliding window) для подготовки входных последовательностей.

Принцип скользящего окна

Скользящее окно используется для преобразования одномерного временного ряда в набор входных последовательностей фиксированной длины, которые можно подать на нейронную сеть. Основная идея:

  • Определяется размер окна window_size, который задаёт длину последовательности.
  • Последовательность данных разбивается на фрагменты длиной window_size, при этом окно может сдвигаться на один или несколько шагов.
  • Каждое окно формирует входные данные (X), а следующий элемент за окном становится целевым значением (y).

Пример формулы для одномерного ряда data:

X[i] = data[i : i + window_size]
y[i] = data[i + window_size]

Таким образом, из временного ряда [1, 2, 3, 4, 5] при window_size = 3 получаем:

X = [[1,2,3], [2,3,4]]
y = [4, 5]

Подготовка последовательностей в JavaScript

Для работы с Keras.js данные должны быть представлены в виде массивов Float32. Основной шаг — создание функции для формирования скользящих окон:

function createSequences(data, windowSize) {
    const X = [];
    const y = [];
    for (let i = 0; i < data.length - windowSize; i++) {
        X.push(data.slice(i, i + windowSize));
        y.push(data[i + windowSize]);
    }
    return {
        X: new Float32Array(X.flat()),
        y: new Float32Array(y)
    };
}

Пояснения к коду:

  • data.slice(i, i + windowSize) извлекает текущую последовательность.
  • X.flat() превращает двумерный массив в одномерный, так как Keras.js принимает тензоры в формате Float32Array.
  • Результат функции возвращает объект с массивами X и y, готовыми к формированию тензоров.

Формирование входного тензора для Keras.js

Keras.js работает с объектом KerasJS.Model, где входные данные передаются в виде словаря, ключами которого являются имена входных слоёв модели. Для последовательных данных:

const sequences = createSequences(data, windowSize);
const inputShape = [sequences.X.length / windowSize, windowSize]; 

const inputTensor = {
    input_1: sequences.X  // 'input_1' — имя входного слоя модели
};
  • inputShape описывает форму данных [batch_size, timesteps].
  • Для многомерных временных рядов добавляется дополнительная размерность [batch_size, timesteps, features].

Преобразование многомерных последовательностей

Если данные содержат несколько признаков на каждый временной шаг, функция формирования скользящего окна модифицируется:

function createMultivariateSequences(data, windowSize) {
    const X = [];
    const y = [];
    for (let i = 0; i < data.length - windowSize; i++) {
        const seq = [];
        for (let j = i; j < i + windowSize; j++) {
            seq.push(data[j]); // data[j] — массив признаков
        }
        X.push(seq);
        y.push(data[i + windowSize]);
    }
    return {
        X: new Float32Array(X.flat(2)), // двумерное окно с flatten
        y: new Float32Array(y.flat())
    };
}
  • Используется flat(2) для корректного преобразования двумерного массива [timesteps, features] в одномерный массив для Keras.js.
  • Такой подход позволяет работать с LSTM и GRU слоями, которые ожидают вход с тремя измерениями [batch, timesteps, features].

Настройка модели и предсказание

После подготовки данных создаётся экземпляр модели Keras.js:

const model = new KerasJS.Model({
    filepath: 'model.bin',
    gpu: true
});

model.ready().then(() => {
    const output = model.predict(inputTensor);
    console.log(output);
});
  • Параметр gpu: true позволяет использовать WebGL для ускорения вычислений.
  • model.predict возвращает объект с ключами выходных слоёв модели, значения которых — предсказания на основе скользящего окна.

Оптимизация обработки больших рядов

Для больших последовательностей следует учитывать:

  • Пакетная обработка: разбиение данных на батчи, чтобы избежать перегрузки памяти.
  • Сдвиг окна >1: ускоряет вычисления, уменьшая количество последовательностей.
  • Нормализация данных: стандартизация или масштабирование признаков улучшает качество обучения.

Пример пакетного формирования последовательностей:

function batchSequences(data, windowSize, batchSize) {
    const batches = [];
    for (let i = 0; i < data.length - windowSize; i += batchSize) {
        const batchEnd = Math.min(i + batchSize, data.length - windowSize);
        const Xbatch = [];
        const ybatch = [];
        for (let j = i; j < batchEnd; j++) {
            Xbatch.push(data.slice(j, j + windowSize));
            ybatch.push(data[j + windowSize]);
        }
        batches.push({
            X: new Float32Array(Xbatch.flat()),
            y: new Float32Array(ybatch)
        });
    }
    return batches;
}
  • Такой подход снижает нагрузку на память и ускоряет интерактивное использование Keras.js в браузере.

Особенности работы с временными рядами

  • Последовательность данных критична: порядок элементов нельзя нарушать.
  • Выбор window_size зависит от модели и предсказываемого горизонта.
  • Выходной слой модели должен соответствовать форме y (скаляр, вектор или многомерный массив).

Скользящее окно — основной инструмент для преобразования временных рядов в структуру, удобную для нейронных сетей в Keras.js, обеспечивая точность предсказаний и корректность работы с последовательными данными.