Библиотека Synaptic предоставляет гибкие механизмы для работы с нейронными сетями на JavaScript, включая сохранение состояния сети и динамическое обновление её параметров. В сложных проектах часто требуется частичное сохранение весов или горячая замена весов, чтобы корректировать или улучшать поведение сети без полного обучения с нуля.
Каждая нейронная сеть в Synaptic состоит из слоев, нейронов и связей. Веса представляют собой объекты, содержащие следующие свойства:
weight: числовое значение связи между нейронами.from: ссылка на нейрон, от которого исходит
сигнал.to: нейрон, принимающий сигнал.gater: нейрон, управляющий усилением связи
(опционально).Для сохранения весов используется метод toJSON(),
который возвращает полное представление сети:
const networkJSON = myNetwork.toJSON();
Результат содержит информацию о:
Полное сохранение сети не всегда необходимо. Часто требуется сохранить только определённые слои или выбранные связи. Для этого используется фильтрация объекта JSON.
Пример сохранения весов скрытого слоя:
const networkJSON = myNetwork.toJSON();
const hiddenLayerWeights = networkJSON.connections.filter(conn =>
conn.from.layer === 1 && conn.to.layer === 2
);
const savedWeights = hiddenLayerWeights.map(conn => ({
from: conn.from.index,
to: conn.to.index,
weight: conn.weight
}));
Такой подход позволяет:
Горячая замена весов — это возможность подменять текущие веса сети во время работы без пересоздания всей архитектуры. Это особенно полезно для:
Процесс горячей замены состоит из нескольких шагов:
Пример реализации:
function hotSwapWeights(network, newWeights) {
const connections = network.connections;
newWeights.forEach(newConn => {
const conn = connections.find(c =>
c.from.index === newConn.from && c.to.index === newConn.to
);
if (conn) {
conn.weight = newConn.weight;
}
});
}
Вызов функции:
hotSwapWeights(myNetwork, savedWeights);
После этого сеть будет использовать новые веса без пересоздания или полного переобучения.
Иногда необходимо сохранять веса целого слоя и восстанавливать его позже. Подход заключается в выделении связей, исходящих из слоя, и их сериализации:
function saveLayerWeights(network, layerIndex) {
return network.connections
.filter(conn => conn.from.layer === layerIndex)
.map(conn => ({ from: conn.from.index, to: conn.to.index, weight: conn.weight }));
}
function loadLayerWeights(network, layerIndex, weights) {
weights.forEach(w => {
const conn = network.connections.find(c => c.from.index === w.from && c.to.index === w.to);
if (conn) conn.weight = w.weight;
});
}
Такой метод гарантирует, что веса других слоёв остаются неизменными, а сеть продолжает работу без нарушения структуры.
Использование частичного сохранения и горячей замены весов повышает гибкость и эффективность работы с нейронными сетями в Synaptic, сокращает время обучения и позволяет экспериментировать с разными конфигурациями сети без полного переобучения.