Сжатие и восстановление данных

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

Архитектура модели для сжатия

Для задач сжатия и восстановления данных обычно применяются автокодировщики (autoencoders). Автокодировщик состоит из двух основных частей:

  • Энкодер: преобразует входные данные в компактное представление (латентное пространство).
  • Декодер: восстанавливает данные из латентного представления, стремясь минимизировать потерю информации.

В Keras.js модели строятся и обучаются в Python с использованием Keras, а затем экспортируются в формат JSON и весовые файлы для загрузки в браузер.

Пример структуры автокодировщика в Keras (Python):

from keras.models import Model
from keras.layers import Input, Dense

input_dim = 784  # размер входного вектора, например, изображение 28x28
encoding_dim = 64  # размер латентного пространства

input_layer = Input(shape=(input_dim,))
encoded = Dense(encoding_dim, activation='relu')(input_layer)
decoded = Dense(input_dim, activation='sigmoid')(encoded)

autoencoder = Model(inputs=input_layer, outputs=decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

После обучения модель сохраняется в формате JSON:

# Сохранение архитектуры
with open('autoencoder.json', 'w') as f:
    f.write(autoencoder.to_json())

# Сохранение весов
autoencoder.save_weights('autoencoder_weights.h5')

Загрузка модели в Keras.js

В JavaScript Keras.js позволяет загружать модель и веса следующим образом:

import KerasJS from 'keras-js';

// Инициализация модели
const model = new KerasJS.Model({
  filepaths: {
    model: 'autoencoder.json',
    weights: 'autoencoder_weights.buf',
    metadata: 'autoencoder_metadata.json'
  },
  gpu: true
});

// Загрузка модели в память
model.ready()
  .then(() => {
    console.log('Модель загружена');
  })
  .catch(err => console.error(err));

Важно: веса необходимо конвертировать из формата HDF5 в бинарный формат .buf, совместимый с Keras.js. Для этого используются утилиты Keras.js конвертера.

Подготовка данных для сжатия

Данные необходимо нормализовать и преобразовать в формат Float32Array перед передачей в модель:

// Пример нормализации изображения 28x28 пикселей
const inputArray = new Float32Array(28 * 28);
for (let i = 0; i < 28 * 28; i++) {
  inputArray[i] = imageData[i] / 255;  // масштабирование до [0,1]
}

Сжатие и восстановление

После подготовки данных можно выполнить сжатие и восстановление:

const inputData = { input: inputArray };

model.predict(inputData)
  .then(outputData => {
    const reconstructed = outputData.output;
    // reconstructed содержит восстановленные значения пикселей
  })
  .catch(err => console.error(err));

Ключевой момент: латентное представление не выводится напрямую в базовой конфигурации. Для работы с самим сжатием, нужно модифицировать модель, добавив промежуточный слой для извлечения латентного кода:

const encoder = Model(inputs=input_layer, outputs=encoded);

После экспорта и загрузки в Keras.js можно получить сжатое представление для анализа или дальнейшей передачи.

Оптимизация производительности

Использование GPU через WebGL позволяет ускорить обработку больших массивов данных, особенно при работе с изображениями или видео. Рекомендации:

  • Выбирать подходящий batch size для браузера (обычно 1–32).
  • Преобразовывать данные заранее в Float32Array для прямой загрузки в модель.
  • Сохранять модель с оптимизированными весами (float32 вместо float64) для уменьшения объема загружаемых данных.

Метрики восстановления

Для оценки качества восстановления используются метрики:

  • MSE (Mean Squared Error) — среднеквадратичная ошибка между исходными и восстановленными данными.
  • PSNR (Peak Signal-to-Noise Ratio) — для изображений, измеряет пик-сигнал к шуму.

В браузере их можно реализовать с помощью простых функций:

function mse(original, reconstructed) {
  let sum = 0;
  for (let i = 0; i < original.length; i++) {
    const diff = original[i] - reconstructed[i];
    sum += diff * diff;
  }
  return sum / original.length;
}

Применение в реальном времени

Keras.js позволяет выполнять сжатие и восстановление на лету. Примеры применения:

  • Сжатие изображений перед загрузкой на сервер.
  • Восстановление аудиосигналов или видеофреймов в браузере.
  • Генерация компактных представлений для последующей аналитики без отправки исходных данных.

Благодаря использованию автокодировщиков и Keras.js, можно строить полностью клиентские решения для обработки данных с минимальной задержкой и без необходимости обращения к серверу, что обеспечивает конфиденциальность и мгновенную обработку.