Сериализация сети в JSON

Сериализация нейронной сети — процесс преобразования структуры модели и её параметров в формат, который может быть сохранён на диск, передан по сети или восстановлен в другом сеансе работы программы. В библиотеке ConvNetJS сериализация осуществляется с помощью формата JSON, что обеспечивает простоту интеграции и универсальность хранения.


Представление сети в виде JSON

В ConvNetJS сеть представляется объектом класса ConvNetJS.Net. Этот объект содержит все параметры, необходимые для восстановления модели:

  • Слои (layers) — массив объектов, каждый из которых описывает тип слоя, его размерности, параметры и функции активации.
  • Веса и смещения (filters, biases) — массивы чисел, хранящие значения обученных весов и смещений для каждого слоя.
  • Гиперпараметры (learning_rate, momentum и др.) — параметры, использованные при обучении сети.

Метод toJSON() используется для создания сериализованного представления сети:

var json = net.toJSON();
var jsonString = JSON.stringify(json);
  • toJSON() возвращает объект JavaScript, содержащий полную структуру сети и её параметры.
  • JSON.stringify преобразует объект в строку, пригодную для сохранения в файл или отправки через HTTP.

Сохранение и загрузка модели

Для хранения сети используется стандартная работа с файлами или локальным хранилищем браузера:

// Сохранение в локальное хранилище
localStorage.setItem('mymodel', JSON.stringify(net.toJSON()));

// Загрузка из локального хранилища
var saved = localStorage.getItem('mymodel');
var json = JSON.parse(saved);
var net2 = new convnetjs.Net();
net2.fromJSON(json);

Метод fromJSON(json) восстанавливает объект Net с точными параметрами и структурой исходной сети. После вызова этой функции можно сразу выполнять прямой проход (forward) и использовать сеть для предсказаний.


Структура JSON

Типичный объект JSON для ConvNetJS включает следующие ключи:

  • layers — массив слоёв, каждый объект слоя содержит:

    • type — тип слоя (input, conv, relu, fc, softmax и др.)
    • out_sx, out_sy, out_depth — размеры выхода слоя
    • filters — массив фильтров для свёрточного слоя
    • biases — смещения слоя
    • дополнительные параметры специфичные для слоя (stride, pad, activation)
  • train_opts — параметры обучения (learning_rate, momentum, batch_size и др.)

Пример фрагмента JSON для полносвязного слоя:

{
  "type": "fc",
  "out_sx": 1,
  "out_sy": 1,
  "out_depth": 10,
  "biases": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  "filters": [
    [0.01, -0.02, 0.03, ...],
    ...
  ]
}

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


Особенности работы с сериализацией

  1. Совместимость версий — при обновлении ConvNetJS структура JSON может изменяться. Необходимо проверять совместимость версий при загрузке сохранённых моделей.
  2. Размер JSON — крупные сети могут формировать JSON-файлы размером несколько мегабайт. Для уменьшения объёма можно использовать сжатие (gzip) или хранение в бинарном формате.
  3. Сохранение состояния тренировки — ConvNetJS хранит параметры обучения (train_opts), но не хранит историю градиентов и оптимизаторов. Восстановленная сеть продолжит обучение с текущих весов, но без полной истории предыдущих итераций.

Применение сериализации

  • Сохранение обученной модели для использования в продакшене без необходимости повторного обучения.
  • Передача сети между устройствами или клиент-серверными приложениями, где сервер обучает модель, а клиент выполняет предсказания.
  • Архивирование экспериментов и повторное воспроизведение результатов.

С помощью сериализации JSON ConvNetJS обеспечивает гибкость и лёгкость интеграции нейронных сетей в веб-приложения и учебные проекты.