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

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


Метод toJSON()

Объект сети в Synaptic предоставляет метод toJSON(), который возвращает сериализованное представление сети в виде JSON-объекта. Этот объект включает:

  • neurons — массив нейронов с их типами, входами, выходами и функциями активации.
  • connections — список соединений между нейронами с указанием источника, цели и веса.
  • inputs и outputs — индексы входных и выходных нейронов.
  • trainer (если сеть обучалась через Trainer) — информация о параметрах обучения и истории тренировки.

Пример сериализации сети:

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

// Создание сети с двумя слоями
let inputLayer = new Layer(2);
let hiddenLayer = new Layer(3);
let outputLayer = new Layer(1);

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

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

// Сериализация в JSON
let networkJSON = myNetwork.toJSON();
console.log(JSON.stringify(networkJSON, null, 2));

Особенности метода toJSON():

  • Не сохраняет методы сети, только структуру и данные.
  • Объект можно хранить в базе данных, файле или отправлять по сети.
  • Включает все веса и смещения, что позволяет восстановить сеть без потерь.

Восстановление сети с Network.fromJSON()

Для восстановления сети используется статический метод Network.fromJSON(json), который принимает объект JSON или строку JSON, возвращает экземпляр сети с теми же нейронами, слоями и весами.

Пример восстановления:

// Восстановление сети из JSON
let restoredNetwork = Network.fromJSON(networkJSON);

// Проверка работы сети
let output = restoredNetwork.activate([1, 0]);
console.log(output);

Особенности восстановления:

  • Сеть полностью повторяет исходное состояние.
  • Можно обучать восстановленную сеть заново, изменения не зависят от оригинальной сети.
  • Любые дополнительные свойства, добавленные вручную в объект сети, не сохраняются автоматически.

Сохранение и загрузка из файлов

Часто требуется не просто сериализовать в память, но и сохранять сеть на диск. Для этого используется модуль fs:

const fs = require('fs');

// Сохранение сети
fs.writeFileSync('network.json', JSON.stringify(networkJSON, null, 2));

// Загрузка сети
let loadedJSON = JSON.parse(fs.readFileSync('network.json'));
let loadedNetwork = Network.fromJSON(loadedJSON);

Преимущества хранения в файле:

  • Долговременное хранение состояния сети.
  • Возможность обмена сетью между разными приложениями.
  • Стабильность при обновлении кода — веса и структура остаются неизменными.

Сериализация сложных сетей

Synaptic поддерживает не только простые прямые сети, но и сложные архитектуры с несколькими слоями, петлями и рекуррентными связями. В JSON будут сохранены:

  • Все слои и нейроны, включая рекуррентные соединения.
  • Веса всех связей, включая петли.
  • Индексы нейронов для входов, выходов и скрытых слоев.

Пример рекуррентной сети:

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

let input = new Layer(2);
let hidden = new Layer(3);
let output = new Layer(1);

// Рекуррентное соединение
hidden.project(hidden);
input.project(hidden);
hidden.project(output);

let rnn = new Network({ input, hidden: [hidden], output });

let rnnJSON = rnn.toJSON();
let restoredRNN = Network.fromJSON(rnnJSON);

С помощью сериализации можно переносить рекуррентные сети без потери состояния и архитектуры.


Советы по работе с JSON-сериализацией

  1. Минимизация размера — можно удалять неиспользуемые поля из JSON для экономии памяти.
  2. Версионирование — сохранять версию структуры сети, чтобы корректно восстанавливать старые сети после изменений кода.
  3. Безопасность — при загрузке JSON из ненадёжных источников проверять структуру, чтобы избежать ошибок при fromJSON.

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