Хранение модели в localStorage браузера

Библиотека Synaptic предоставляет удобный интерфейс для создания и обучения нейронных сетей на JavaScript. Одним из важных аспектов работы с нейронными сетями является сохранение обученной модели для последующего использования. В веб-приложениях это можно реализовать с помощью localStorage, который обеспечивает хранение данных в браузере пользователя между сессиями.

Сериализация модели

Для сохранения нейронной сети необходимо преобразовать её в формат, который может быть безопасно сохранён в localStorage. В Synaptic предусмотрен метод toJSON(), возвращающий объект с полным описанием архитектуры сети и её весов:

const synaptic = require('synaptic');
const { Layer, Network } = synaptic;

// Создание простой сети
const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const myNetwork = new Network({
  input: inputLayer,
  hidden: [hiddenLayer],
  output: outputLayer
});

// Преобразование сети в JSON
const networkJSON = myNetwork.toJSON();

После получения JSON-объекта его можно конвертировать в строку для сохранения в localStorage:

const jsonString = JSON.stringify(networkJSON);
localStorage.setItem('myNetwork', jsonString);

Загрузка модели из localStorage

Для восстановления сети используется метод Network.fromJSON(), который принимает объект с конфигурацией сети. Сначала необходимо извлечь строку из localStorage и преобразовать её обратно в объект:

const savedNetworkString = localStorage.getItem('myNetwork');
if (savedNetworkString) {
    const savedNetworkJSON = JSON.parse(savedNetworkString);
    const restoredNetwork = Network.fromJSON(savedNetworkJSON);
}

Таким образом, обученная сеть может быть восстановлена в любой момент без повторного обучения.

Управление версиями и совместимостью

При обновлении архитектуры сети или изменений в коде важно контролировать совместимость сохранённых моделей. Для этого можно добавлять метаинформацию:

const networkData = {
    version: '1.0',
    timestamp: Date.now(),
    network: myNetwork.toJSON()
};

localStorage.setItem('myNetwork', JSON.stringify(networkData));

При загрузке проверка версии позволяет корректно обрабатывать несовместимые модели:

const savedDataString = localStorage.getItem('myNetwork');
if (savedDataString) {
    const savedData = JSON.parse(savedDataString);
    if (savedData.version === '1.0') {
        const restoredNetwork = Network.fromJSON(savedData.network);
    } else {
        console.warn('Версия модели не совпадает. Возможно, требуется миграция.');
    }
}

Оптимизация хранения

LocalStorage ограничен по объёму (обычно около 5–10 МБ). Для уменьшения размера сохраняемой модели можно использовать:

  • Сжатие JSON с помощью библиотек типа lz-string:
const compressed = LZString.compress(JSON.stringify(myNetwork.toJSON()));
localStorage.setItem('myNetworkCompressed', compressed);
  • Сохранение только весов и конфигурации слоёв, если архитектура сети заранее известна, чтобы не дублировать неизменяемые структуры.

Автоматическое обновление модели

Для веб-приложений, которые адаптируются под пользовательские данные, можно реализовать автоматическое обновление модели при завершении обучения:

function saveNetwork(network) {
    const data = JSON.stringify(network.toJSON());
    localStorage.setItem('myNetwork', data);
}

function trainAndSave(network, trainingSet) {
    trainingSet.forEach(sample => {
        network.activate(sample.input);
        network.propagate(0.3, sample.output);
    });
    saveNetwork(network);
}

Особенности использования

  • Сериализация объектов Synaptic сохраняет полную структуру сети, включая веса и смещения.
  • Восстановление сети полностью повторяет её состояние на момент сохранения.
  • LocalStorage синхронен, поэтому операции чтения и записи выполняются быстро, но для больших моделей следует учитывать задержки и лимит объёма.
  • При работе с асинхронными веб-приложениями может потребоваться обертывание операций в setTimeout или использование Web Workers для предотвращения блокировки интерфейса.

Хранение модели в localStorage позволяет создавать интерактивные веб-приложения с устойчивым обучением нейронных сетей без необходимости обращения к серверу, сохраняя пользовательские данные локально и обеспечивая быстрый доступ к обученной модели.