Формат JSON-представления сети

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

Структура JSON

JSON-объект, создаваемый методом toJSON(), содержит несколько ключевых разделов:

  1. neurons – массив нейронов сети. Каждый нейрон представлен объектом со следующими полями:

    • bias — смещение нейрона (bias);
    • squash — функция активации, используемая нейроном;
    • layer — номер слоя, которому принадлежит нейрон;
    • trace — информация для обучения методом обратного распространения ошибки (если используется);
    • activation — текущее значение активации нейрона;
    • old — значение активации на предыдущем шаге (полезно для рекуррентных сетей);
    • connections — массив входных соединений.
  2. connections – массив соединений между нейронами. Каждый объект соединения содержит:

    • from — индекс нейрона-источника;
    • to — индекс нейрона-приемника;
    • weight — вес соединения;
    • gater — индекс нейрона, который управляет гейтом (если используется модуль гейтинга).
  3. layers – структура слоев сети, определяющая их размер и порядок. Пример:

    "layers": {
        "input": [0, 1, 2],
        "hidden": [3, 4, 5],
        "output": [6]
    }

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

  4. learningRate и другие параметры обучения могут быть включены при сохранении состояния сети, если это необходимо для продолжения обучения после загрузки.

Методы сериализации и десериализации

Сохранение сети в JSON:

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
});

const networkJSON = myNetwork.toJSON();
console.log(JSON.stringify(networkJSON, null, 2));

Загрузка сети из JSON:

const loadedNetwork = Network.fromJSON(networkJSON);

Метод fromJSON полностью восстанавливает структуру сети, включая слои, нейроны, веса соединений и функции активации.

Практические рекомендации

  • Сохранение промежуточных состояний: при долгом обучении полезно периодически сохранять сеть в JSON для защиты от потери данных.
  • Оптимизация размера файла: можно исключать поля, не влияющие на воспроизведение работы сети (например, trace и old), чтобы уменьшить объем JSON.
  • Перенос между проектами: JSON-представление обеспечивает платформонезависимость, что позволяет переносить обученные сети между различными средами исполнения JavaScript.
  • Рекуррентные сети: для RNN JSON сохраняет информацию о старых активациях (old) и трассах (trace), что важно для корректного восстановления состояния сети.

Работа с кастомными функциями активации

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

Взаимодействие с другими форматами

JSON-сохранение удобно конвертировать в другие форматы:

  • для хранения в базе данных можно использовать строковое представление JSON;
  • для передачи по сети — отправлять как стандартный JSON-объект;
  • для анализа структуры сети — визуализировать слои и соединения на основе индексов нейронов.

Использование JSON-представления сети в Synaptic обеспечивает гибкость и безопасность при работе с нейронными сетями, делая процесс обучения и внедрения моделей более управляемым и воспроизводимым.