Библиотека Synaptic предоставляет удобные средства для работы с нейронными сетями в JavaScript. Одной из ключевых возможностей является сохранение и последующая загрузка моделей, что позволяет переносить уже обученные сети между проектами или сохранять результаты обучения для повторного использования. В Node.js это особенно важно, так как серверные приложения часто требуют долговременного хранения и масштабирования моделей.
Модель в Synaptic состоит из нейронов,
слоёв и связей между ними. Каждая сеть
имеет метод toJSON(), который возвращает полное
представление структуры сети и её текущих весов в виде объекта 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
});
// Преобразование в JSON
const json = myNetwork.toJSON();
console.log(JSON.stringify(json, null, 2));
Ключевой момент: метод toJSON() сериализует
структуру сети, веса соединений и
пороговые значения нейронов. Это позволяет восстановить
сеть полностью идентичной исходной.
Для сохранения модели в файл используется стандартный модуль Node.js
fs. Наиболее распространённый формат хранения — JSON, так
как он легко читается и совместим с другими языками и платформами.
const fs = require('fs');
// Сохраняем JSON модели в файл
fs.writeFileSync('myNetwork.json', JSON.stringify(myNetwork.toJSON(), null, 2));
Здесь:
writeFileSync — синхронная запись файла. Для больших
моделей можно использовать writeFile для асинхронной
записи.JSON.stringify с параметрами null, 2
форматирует JSON с отступами, что удобно для отладки и визуального
анализа.Для восстановления модели из сохранённого JSON используется метод
Network.fromJSON():
const savedData = fs.readFileSync('myNetwork.json');
const loadedNetwork = Network.fromJSON(JSON.parse(savedData));
console.log(loadedNetwork.activate([0, 1]));
Важные моменты при загрузке:
activate) и
обучению (propagate).Для крупных моделей синхронная запись может блокировать поток
выполнения. Использование асинхронных методов fs.promises
решает эту проблему:
const fsPromises = require('fs').promises;
async function saveNetwork(network, filename) {
const json = JSON.stringify(network.toJSON(), null, 2);
await fsPromises.writeFile(filename, json);
}
async function loadNetwork(filename) {
const data = await fsPromises.readFile(filename, 'utf-8');
return Network.fromJSON(JSON.parse(data));
}
// Пример использования
(async () => {
await saveNetwork(myNetwork, 'myNetwork.json');
const restoredNetwork = await loadNetwork('myNetwork.json');
})();
Асинхронные функции особенно полезны в серверных приложениях, где требуется обработка нескольких сетей одновременно без блокировки основного потока.
При работе с ансамблями или коллекциями сетей удобно хранить их в одном файле:
const networks = {
net1: myNetwork,
net2: anotherNetwork
};
fs.writeFileSync('networks.json', JSON.stringify(
Object.fromEntries(
Object.entries(networks).map(([key, net]) => [key, net.toJSON()])
), null, 2
));
Для восстановления используется аналогичная логика с
Network.fromJSON:
const savedNetworks = JSON.parse(fs.readFileSync('networks.json'));
const restoredNetworks = Object.fromEntries(
Object.entries(savedNetworks).map(([key, data]) => [key, Network.fromJSON(data)])
);
JSON.parse(JSON.stringify(network.toJSON()))
для предварительной валидации.С помощью этих методов можно эффективно управлять нейронными сетями в Node.js, обеспечивая долговременное хранение, переносимость и возможность повторного использования.