Десериализация модели

ConvNetJS предоставляет возможность сохранять и загружать нейронные сети в виде JSON-объектов. Этот подход позволяет сохранять архитектуру сети, параметры слоев, веса и смещения, обеспечивая полную восстановимость модели для дальнейшего использования или продолжения обучения. Десериализация является процессом преобразования JSON-представления модели обратно в рабочий объект нейронной сети (Net).


Структура сериализованной модели

Сериализованная модель в ConvNetJS содержит следующие ключевые элементы:

  • layers — массив объектов, каждый из которых описывает слой сети, его тип, параметры и состояние.
  • biases — массив смещений для нейронов каждого слоя.
  • filters — массив весов фильтров для сверточных слоев.
  • activation — значения активации нейронов, которые могут быть сохранены при необходимости.
  • params — дополнительные параметры слоев, такие как размер фильтров, количество фильтров, шаг свертки, тип функции активации.

Пример JSON-представления небольшого сверточного слоя:

{
    "layers":[
        {"type":"input","out_sx":32,"out_sy":32,"out_depth":3},
        {"type":"conv","sx":5,"filters":[
            {"w":[...],"bias":0.1},
            {"w":[...],"bias":0.2}
        ],"stride":1,"pad":2,"activation":"relu"}
    ],
    "train_opts":{"learning_rate":0.01,"momentum":0.9,"batch_size":10}
}

Основные методы десериализации

1. Создание пустой сети и загрузка параметров

Объект convnetjs.Net предоставляет метод fromJSON(json), который принимает сериализованное состояние сети и восстанавливает её структуру вместе с параметрами.

let net = new convnetjs.Net();
net.fromJSON(jsonData);

После вызова fromJSON объект net полностью готов к использованию: можно производить прямое распространение сигнала через forward(), рассчитывать ошибки и продолжать обучение через trainer.train().


2. Особенности работы с весами и фильтрами

При десериализации важно учитывать:

  • Сверточные слои: массив filters должен совпадать по размерности с количеством фильтров в слое. ConvNetJS автоматически инициализирует фильтры согласно сохранённым значениям.
  • Полносвязные слои: массив weights и biases должен строго соответствовать размерности слоя.
  • Функции активации: в JSON указывается тип функции (relu, sigmoid, tanh), и fromJSON корректно их восстанавливает.

Любое несовпадение структуры при загрузке приведёт к ошибкам в дальнейшем вычислении.


Проверка корректности модели после десериализации

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

  1. Проверка структуры слоев

    console.log(net.layers.length);
    console.log(net.layers.map(l => l.layer_type));

    Это позволяет убедиться, что все слои восстановлены в правильном порядке.

  2. Проверка весов и смещений

    console.log(net.layers[1].filters[0].w.length);
    console.log(net.layers[1].filters[0].bias);

    Сверка размеров массивов гарантирует, что веса корректно загружены.

  3. Тестовое прямое распространение Перед использованием модели для обучения или предсказаний имеет смысл выполнить один проход:

    let x = new convnetjs.Vol(32, 32, 3);
    let output = net.forward(x);
    console.log(output.w);

Особенности при переносе модели

  • Версии ConvNetJS: при обновлениях библиотеки формат JSON может незначительно меняться. Необходимо убедиться, что модель была сохранена совместимой версией.
  • Сохраняемые параметры: при десериализации восстанавливаются только обученные параметры, но не внутренние состояния оптимизаторов. Если требуется продолжение обучения, нужно также сохранить параметры trainer или использовать их стандартные настройки.
  • Многоплатформенность: JSON легко переносится между браузером и сервером Node.js, что делает ConvNetJS удобным инструментом для клиент-серверных приложений с нейросетями.

Продвинутые техники десериализации

  • Частичное восстановление сети: можно загружать веса только для определённых слоев. Это полезно при переносном обучении:

    let pretrained = new convnetjs.Net();
    pretrained.fromJSON(jsonData);
    net.layers[1].filters = pretrained.layers[1].filters;
  • Динамическая модификация архитектуры: после загрузки модели можно добавлять новые слои и повторно инициализировать тренинг для адаптации к новым задачам.

  • Сравнение моделей: десериализованные сети можно сравнивать по весам и смещениям для анализа изменений после обучения.


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