Сохранение сети через toJSON

Brain.js — это библиотека на JavaScript, предназначенная для создания, обучения и использования нейронных сетей. Один из ключевых аспектов работы с сетями — возможность сохранять их состояние для последующего использования без повторного обучения. Метод toJSON обеспечивает удобный способ сериализации обученной нейронной сети в формат, который можно записать на диск или передать по сети.


Основы работы с toJSON

Метод toJSON применяется к объекту нейронной сети после её обучения. Он возвращает объект JavaScript, содержащий все параметры сети:

  • веса нейронов;
  • смещения (biases);
  • конфигурацию слоёв;
  • параметры активационных функций.

Пример базового использования:

const brain = require('brain.js');
const net = new brain.NeuralNetwork();

net.train([
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
]);

const json = net.toJSON();
console.log(JSON.stringify(json, null, 2));

В этом примере сеть обучается на задаче XOR, после чего её состояние сериализуется в объект. JSON.stringify используется для визуализации структуры в удобочитаемом формате.


Структура JSON, создаваемого toJSON

Объект JSON, возвращаемый методом, включает несколько ключевых частей:

  1. sizes — массив, указывающий количество нейронов в каждом слое.
  2. layers — объект, содержащий все слои и их нейроны, с весами и смещениями.
  3. outputLookup и inputLookup — объекты, позволяющие сопоставлять входные и выходные значения с их индексами (актуально для категориальных данных).
  4. trainOpts — параметры обучения, если они были переданы.

Пример структуры слоя:

{
  "layers": {
    "0": {
      "0": {"bias": 0.1, "weights": {"0": 0.5, "1": -0.3}},
      "1": {"bias": -0.2, "weights": {"0": -0.1, "1": 0.7}}
    },
    "1": {
      "0": {"bias": 0.05, "weights": {"0": 1.2, "1": -0.9}}
    }
  }
}

Каждый нейрон хранит собственный bias и веса на входные соединения. Это позволяет полностью восстановить состояние сети при загрузке.


Сценарии использования

Сохранение сети с помощью toJSON применяется в следующих ситуациях:

  • Повторное использование обученной сети без необходимости повторного обучения.
  • Передача сети между клиентом и сервером (например, обучение на сервере и использование на клиенте).
  • Версионирование моделей — хранение состояния сети для последующей отладки или анализа изменений.

Сохранение на диск

Для записи сети на диск можно использовать стандартный модуль fs в Node.js:

const fs = require('fs');

const trainedNetJSON = net.toJSON();
fs.writeFileSync('network.json', JSON.stringify(trainedNetJSON, null, 2));

Это создаёт файл network.json, содержащий сериализованную сеть. Такой файл можно хранить как конфигурацию или версию модели.


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

Восстановление сети выполняется через метод fromJSON:

const fs = require('fs');
const brain = require('brain.js');

const net = new brain.NeuralNetwork();
const savedJSON = JSON.parse(fs.readFileSync('network.json', 'utf8'));

net.fromJSON(savedJSON);

// Проверка работы сети после загрузки
console.log(net.run([1, 0]));

После вызова fromJSON сеть полностью готова к использованию и не требует повторного обучения.


Практические советы

  1. Сохранять сеть после каждого успешного обучения, чтобы избежать потери данных при сбоях.
  2. Использовать формат JSON для обмена моделями, так как он легко читается и переносится между различными окружениями.
  3. Контролировать размер сети, так как большие сети создают объёмные JSON-файлы.
  4. Версионировать файлы с моделями, чтобы при необходимости можно было откатиться к предыдущей версии сети.

Отличие toJSON от toFunction

Метод toFunction создаёт компактную JavaScript-функцию, способную вычислять выходные значения сети, но без возможности изменения весов или повторного обучения. toJSON сохраняет всё состояние сети, что делает его идеальным для дальнейшей модификации и обучения.


С помощью toJSON в Brain.js достигается полная переносимость нейронных сетей, сохранение и восстановление их состояния, что значительно упрощает управление моделями в производственных и учебных проектах.