Keras.js — библиотека, позволяющая запускать модели Keras в браузере на чистом JavaScript. Она обеспечивает прямое выполнение нейронных сетей без необходимости отдельного серверного окружения. При работе с временными рядами и последовательными данными ключевую роль играет техника скользящего окна (sliding window) для подготовки входных последовательностей.
Скользящее окно используется для преобразования одномерного временного ряда в набор входных последовательностей фиксированной длины, которые можно подать на нейронную сеть. Основная идея:
window_size, который задаёт
длину последовательности.window_size, при этом окно может сдвигаться на один
или несколько шагов.Пример формулы для одномерного ряда 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]
Для работы с 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 работает с объектом 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.[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 возвращает объект с ключами выходных
слоёв модели, значения которых — предсказания на основе скользящего
окна.Для больших последовательностей следует учитывать:
Пример пакетного формирования последовательностей:
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;
}
window_size зависит от модели и
предсказываемого горизонта.y (скаляр, вектор или многомерный массив).Скользящее окно — основной инструмент для преобразования временных рядов в структуру, удобную для нейронных сетей в Keras.js, обеспечивая точность предсказаний и корректность работы с последовательными данными.