Synaptic — это библиотека для построения и обучения нейронных сетей в JavaScript. Одной из важных возможностей при работе с сложными сетями является визуализация структуры сети и связей между нейронами. Визуализация помогает понять топологию сети, распределение весов и активность нейронов в процессе обучения.
Сеть в Synaptic строится на основе трёх основных компонентов:
Каждый нейрон имеет следующие ключевые свойства:
activation — текущее значение активации нейрона.bias — смещение нейрона, которое влияет на порог
активации.connections — объект, содержащий ссылки на входящие
(projected) и исходящие (connections)
связи.incoming и outgoing — списки с активными
связями для вычислений в прямом и обратном проходе.Слои позволяют объединять нейроны для упрощения построения сети. Они обладают методами:
add(neuron) — добавление нейрона в слой.project(layer) — установка связей с другим слоем.activate(input) — передача входных данных через
слой.propagate(rate, target) — обратное распространение
ошибки.Для построения карты связей требуется извлечь из сети информацию о нейронах и связях:
function extractNetworkData(network) {
const neurons = [];
const links = [];
network.layers.input.list.forEach(n => neurons.push({id: n.ID, layer: 'input'}));
network.layers.hidden.forEach((layer, idx) => {
layer.list.forEach(n => neurons.push({id: n.ID, layer: `hidden_${idx}`}));
});
network.layers.output.list.forEach(n => neurons.push({id: n.ID, layer: 'output'}));
neurons.forEach(neuron => {
neuron.connections.forEach(conn => {
links.push({
source: neuron.id,
target: conn.to.ID,
weight: conn.weight
});
});
});
return {neurons, links};
}
В этом примере создаётся объект, содержащий список нейронов с их идентификаторами и список связей с весами. Это позволяет построить граф сети в любом визуализаторе, поддерживающем узлы и рёбра.
Для наглядного отображения сети часто используют D3.js, так как она поддерживает динамические графы с позиционированием узлов. Основные шаги:
d3.forceSimulation для автоматического
расположения узлов.Пример кода для визуализации:
const svg = d3.select("svg")
.attr("width", 800)
.attr("height", 600);
const {neurons, links} = extractNetworkData(network);
const link = svg.selectAll(".link")
.data(links)
.enter()
.append("line")
.attr("stroke-width", d => Math.abs(d.weight) * 2)
.attr("stroke", d => d.weight > 0 ? "green" : "red");
const node = svg.selectAll(".node")
.data(neurons)
.enter()
.append("circle")
.attr("r", 10)
.attr("fill", d => d.layer.startsWith('input') ? 'blue' : d.layer.startsWith('hidden') ? 'orange' : 'purple'));
const simulation = d3.forceSimulation(neurons)
.force("link", d3.forceLink(links).id(d => d.id).distance(50))
.force("charge", d3.forceManyBody().strength(-200))
.force("center", d3.forceCenter(400, 300));
simulation.on("tick", () => {
link
.attr("x1", d => d.source.x)
.attr("y1", d => d.source.y)
.attr("x2", d => d.target.x)
.attr("y2", d => d.target.y);
node
.attr("cx", d => d.x)
.attr("cy", d => d.y);
});
Вес связей можно визуализировать через толщину линии или градиент цвета. Это позволяет быстро определить сильные и слабые связи.
Активация нейронов также может отображаться цветом узла: более интенсивный цвет — высокая активация, бледный — низкая.
Пример изменения цвета нейронов в реальном времени:
function updateNodeColors(neurons) {
node.attr("fill", d => {
const activation = d.activation || 0;
return `rgb(${Math.floor(255 * activation)}, 0, ${Math.floor(255 * (1 - activation))})`;
});
}
Это создаёт динамическую карту активности сети, полезную для анализа работы модели на конкретных входных данных.
Для больших сетей с сотнями нейронов важно:
В Synaptic структура сети представлена явно через нейроны и их связи, что делает возможным построение наглядной и информативной визуализации. Использование D3.js или аналогичных библиотек позволяет:
Комплексный подход к визуализации помогает выявлять слабые места сети и оптимизировать её архитектуру ещё до обучения или тестирования.