Интеграция с Express

Для интеграции нейронных сетей в приложение на Express сначала необходимо установить саму библиотеку Brain.js и менеджер пакетов npm. Используется стандартная установка через терминал:

npm install brain.js

После этого библиотеку подключают в проекте следующим образом:

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

Express-приложение обычно имеет структуру с файлом app.js или server.js. В этом файле создаётся экземпляр приложения:

const express = require('express');
const app = express();
app.use(express.json());

Подключение Brain.js в таком контексте позволяет использовать нейронные сети для обработки данных прямо в маршрутах сервера.


Создание и обучение нейронной сети

Brain.js предоставляет несколько типов сетей: NeuralNetwork, LSTMNetwork, recurrent.LSTM. Для простых задач классификации и прогнозирования чаще используется NeuralNetwork.

const net = new brain.NeuralNetwork({
  hiddenLayers: [10, 10],
  learningRate: 0.01
});

Параметры сети:

  • hiddenLayers — массив чисел, задающий количество нейронов в скрытых слоях.
  • learningRate — коэффициент скорости обучения.

Обучение сети происходит на примерах входных и выходных данных:

const trainingData = [
  { input: { red: 1, green: 0, blue: 0 }, output: { color: 1 } },
  { input: { red: 0, green: 1, blue: 0 }, output: { color: 0 } }
];

net.train(trainingData, {
  iterations: 20000,
  errorThresh: 0.005,
  log: true,
  logPeriod: 1000
});

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

  • iterations — максимальное количество циклов обучения.
  • errorThresh — порог ошибки, при достижении которого обучение останавливается.
  • log и logPeriod — позволяют отслеживать процесс обучения.

Создание маршрутов Express для работы с сетью

После обучения нейронной сети можно обрабатывать запросы через API. Пример POST-маршрута, который получает данные цвета и возвращает предсказание:

app.post('/predict', (req, res) => {
  const input = req.body;
  const output = net.run(input);
  res.json(output);
});

Особенности интеграции:

  • express.json() необходим для корректного парсинга JSON-тела запроса.
  • req.body содержит входные данные для нейронной сети.
  • Ответ res.json(output) возвращает предсказание клиенту.

Сохранение и загрузка сети

Для постоянного использования сети после обучения можно сохранить её состояние в файл:

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

Загрузка сети из файла:

const savedNet = new brain.NeuralNetwork();
const data = fs.readFileSync('network.json');
savedNet.fromJSON(JSON.parse(data));

Это позволяет не обучать сеть заново при каждом запуске приложения, что особенно важно для крупных сетей.


Пример интеграции с реальными данными

Для работы с пользовательскими данными часто используют формы на фронтенде, которые отправляют JSON на сервер. Пример структуры данных:

{
  "red": 0.2,
  "green": 0.5,
  "blue": 0.3
}

На сервере:

app.post('/classify-color', (req, res) => {
  const colorData = req.body;
  const prediction = net.run(colorData);
  res.json({ predictedClass: prediction });
});

Для больших проектов целесообразно выделять отдельный модуль для работы с нейронной сетью:

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

function trainNetwork(trainingData) {
  net.train(trainingData);
}

function predict(input) {
  return net.run(input);
}

module.exports = { trainNetwork, predict };

И использовать его в маршрутах:

const { predict } = require('./neuralNetwork');

app.post('/predict', (req, res) => {
  const result = predict(req.body);
  res.json(result);
});

Обработка ошибок и асинхронность

Хотя Brain.js выполняет обучение синхронно, в Express важно использовать try-catch для обработки возможных исключений:

app.post('/predict', (req, res) => {
  try {
    const result = net.run(req.body);
    res.json(result);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

Для больших сетей обучение можно выполнять в отдельном процессе или через worker threads, чтобы не блокировать основной поток Express:

const { Worker } = require('worker_threads');

function trainInWorker(data) {
  return new Promise((resolve, reject) => {
    const worker = new Worker('./trainWorker.js', { workerData: data });
    worker.on('message', resolve);
    worker.on('error', reject);
  });
}

Настройка производительности

Рекомендации:

  • Уменьшение размера скрытых слоев ускоряет обучение.
  • Оптимизация learningRate и iterations позволяет достичь баланса между точностью и скоростью.
  • Для постоянного использования предпочтительно предобученные сети и загрузка их из JSON.

Совмещение с другими библиотеками

Brain.js легко интегрируется с:

  • Mongoose для хранения обучающих данных в MongoDB.
  • Redis для кэширования результатов предсказаний.
  • Socket.io для отправки предсказаний в реальном времени на фронтенд.

Пример с кэшированием результата:

const redis = require('redis');
const client = redis.createClient();

app.post('/predict', async (req, res) => {
  const key = JSON.stringify(req.body);
  const cached = await client.get(key);
  if (cached) return res.json(JSON.parse(cached));

  const result = net.run(req.body);
  await client.set(key, JSON.stringify(result));
  res.json(result);
});

Эта структура позволяет создавать мощные и производительные API на Express, использующие нейронные сети Brain.js для анализа данных, классификации и прогнозирования в реальном времени.