Python — не единственный язык программирования, который подходит для машинного обучения. Сегодня смотрим, какие библиотеки для ML есть на JavaScript. С их помощью можно добавить возможности машинного обучения в веб- и мобильные приложения — от чат-ботов до распознавания изображений.
TensorFlow.js
TensorFlow.js — самая популярная JS-библиотека для машинного обучения. Работать с ней можно непосредственно в браузере или на Node.js. Эта библиотека предоставляет практически полный набор инструментов для создания и обучения моделей, в том числе с подкреплением.
Для чего подойдёт:
- классификация изображений, определение объектов, распознавание лиц;
 - генерация и обработка изображений;
 - перевод, генерация и обработка текста;
 - преобразование речи в текст;
 - рекомендательные системы;
 - обучение агентов в игровых средах;
 - анализ временных рядов и предсказания;
 - обработка сигналов;
 - анализ данных и кластеризация.
 
Посмотрите, какие штуки создают с помощью этой библиотеки:
С помощью TensorFlow.js можно создавать интерактивные веб-приложения с машинным обучением, которые могут реагировать на пользовательский ввод в реальном времени. Например, чтобы пользователь наводил камеру на текст, а модель тут же его распознавала.
Особенности TensorFlow.js:
- Позволяет не только выполнять предсказания, но и обучать модели непосредственно в браузере.
 - Умеет импортировать модели, обученные в TensorFlow, Keras и других фреймворках, и экспортировать их для использования в других средах.
 - Может использовать WebGL для выполнения вычислений на графическом процессоре.
 - Предоставляет API высокого уровня для быстрого прототипирования и создания моделей, а также API низкого уровня для более тонкого контроля над вычислениями.
 - Есть много предобученных моделей для разных задач, например классификации изображений, распознавания объектов и обработки текста.
 - Умеет конвертировать предварительно обученные модели Python для запуска в браузере.
 
Вот пример модели линейной регрессии с использованием TensorFlow.js. Компилируем модель с указанием функции потерь и оптимизатором, генерируем случайные данные, обучаем модель и запускаем прогноз:
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});
const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);
const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);
model.fit(xs, ys, {epochs: 10}).then(() => {
  const result = model.predict(tf.tensor2d([5], [1, 1]));
  result.print();
});
OpenCV.js
OpenCV.js — самая большая библиотека ПО для компьютерного зрения, насчитывает более 2500 алгоритмов. Она позволяет обрабатывать и анализировать изображения и видео непосредственно в браузере. Не нужно устанавливать дополнительные серверные компоненты и плагины.
Для чего подойдёт:
- обработка изображений (фильтрация, трансформация, морфологические операции, преобразования Фурье и так далее);
 - распознавание объектов, лиц и других сложных структур на изображениях и видео;
 - обработка и анализ видео.
 
Библиотека поддерживает много методов машинного обучения, включая векторные машины, случайные леса и деревья решений. Может обрабатывать и анализировать изображения и видео в реальном времени.
Особенности OpenCV.js:
- Можно использовать предобученные модели для задач, связанных с компьютерным зрением.
 - Поддерживает функции и алгоритмы, которые охватывают большинство задач компьютерного зрения.
 - Можно перенести готовый код на Python или C++.
 - Можно использовать совместно с TensorFlow.js.
 - Производительность обработки зависит от мощности устройства пользователя и возможностей браузера.
 - Доступны не все функции полной библиотеки OpenCV.
 - Не все возможности поддерживаются браузерами одинаково хорошо.
 
Загружаем изображение, преобразуем его в оттенки серого и применяем к нему алгоритм обнаружения краёв Канни, чтобы определить края. Результат отображаем в HTML:
const imgElement = document.createElement('img');
imgElement.src = 'image.jpg';
imgElement.onload = () => {
  const mat = cv.imread(imgElement);
  const grayMat = new cv.Mat();
  cv.cvtColor(mat, grayMat, cv.COLOR_RGBA2GRAY);
  const edgesMat = new cv.Mat();
  cv.Canny(grayMat, edgesMat, 50, 150);
  cv.imshow('outputCanvas', edgesMat);
  mat.delete();
  grayMat.delete();
  edgesMat.delete();
};
NLP.js
NLP.js предназначена для задач обработки естественного языка. Поддерживает более 40 языков, включая русский. Включает инструменты для токенизации, лемматизации, стемминга, распознавания именованных сущностей и другие методы обработки текста. Работает в среде Node.js.
Для чего подойдёт:
- генерация текстов;
 - разработка чат-ботов;
 - анализ текстов и их классификация;
 - извлечение данных из текстовой информации;
 - обработка отзывов и комментариев;
 - создание персонализированных рекомендаций на основе анализа текстовых данных.
 
У библиотеки модульная архитектура, что позволяет использовать только необходимые компоненты для конкретных задач. NLP.js поддерживает плагины, так что её функциональность легко расширять и интегрировать с другими сервисами и библиотеками.
Особенности NLP.js:
- Есть предобученные модели и алгоритмы для обработки естественного языка — можно быстро приступить к разработке.
 - Можно использовать с Express.js и другими фреймворками для создания REST API для обработки запросов и предоставления ответов на основе модели NLP.
 
Подключаем библиотеку и создаём экземпляр менеджера. Указываем, что будем работать с русским языком. Добавляем документы с примерами текста и соответствующими намерениями для обучения модели. Обучаем модель, обрабатываем входящий запрос, выводим результат:
const { NlpManager } = require('node-nlp');
const manager = new NlpManager({ languages: ['ru'] });
manager.addDocument('ru', 'Я хочу купить билет на самолёт', 'flight.book');
manager.addDocument('ru', 'Купи мне билет на самолёт', 'flight.book');
manager.addDocument('ru', 'Мне нужен билет на самолёт', 'flight.book');
manager.addDocument('ru', 'Какая сейчас погода?', 'weather.check');
manager.addDocument('ru', 'Расскажи и погоде', 'weather.check');
(async () => {
    await manager.train();
    const response = await manager.process('ru', 'Я хочу купить билет на самолёт');
    console.log(response.intent);
})();
Keras.js
Keras.js — универсальная библиотека для машинного обучения. Она позволяет создавать, обучать и запускать модели непосредственно в браузере без необходимости обработки на стороне сервера. Подходит для приложений, которые должны работать без подключения к интернету.
Для чего подойдёт:
- изучение основ нейронных сетей;
 - разработка интерактивных игр и веб-приложений, например для классификации изображений или анализа текста;
 - создание инструментов для анализа и визуализации данных, в том числе в реальном времени;
 - разработка мобильных приложений, которые требуют, чтобы модели машинного обучения выполнялись на стороне клиента.
 
Библиотека поддерживает различные модели и архитектуры глубокого обучения, например двунаправленную краткосрочную память для классификации настроений в различных наборах данных.
Особенности Keras.js:
- Полезен в ситуациях, когда серверные вычисления ограничены или недоступны.
 - Есть предварительно обученные модели для распознавания изображений, обработки естественного языка и других задач.
 - Поддерживает модели, созданные с использованием Keras и Theano, а также TensorFlow.
 - Можно импортировать модели на Python (для этого их нужно конвертировать в JSON).
 - Использует графический процессор для ускорения вычислений.
 
Создадим простую нейронную сеть прямого распространения с одним входным слоем на 100 единиц, одним скрытым слоем на 64 единицы и активацией ReLU и одним выходным слоем на 10 единиц и активацией softmax. Компилируем модель, используя категориальную кроссэнтропию в качестве функции потерь, стохастический градиентный спуск в качестве оптимизатора и точность в качестве метрики. Генерируем некоторые фиктивные данные и метки, преобразуем метки в горячее кодирование и обучаем модель, используя метод подгонки:
from keras.models import Sequential
from keras.layers import Dense
model = Sequential()
model.add(Dense(units=64, activation='relu', input_dim=100))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(10, size=(1000, 1))
from keras.utils import to_categorical
one_hot_labels = to_categorical(labels, num_classes=10)
model.fit(data, one_hot_labels, epochs=10, batch_size=32)
Brain.js
Brain.js разработана для работы без необходимости хорошо знать математику и теорию машинного обучения, поэтому её часто выбирают новички. После установки можно обучить модель за несколько строк кода. Работать можно в браузере или на сервере с использованием Node.js.
Для чего подойдёт:
- изучение основ нейронных сетей;
 - создание простых моделей классификации, например для фильтрации спам-сообщений или распознавания рукописных цифр;
 - создание рекуррентных нейросетей для генерации текста, автозаполнения и других задач, связанных с последовательными данными;
 - разработка простых игр и интерактивных приложений, которые могут адаптироваться к поведению пользователя.
 
С помощью этой библиотеки можно создавать и обучать различные типы нейронок, включая обычные персептроны, нейронные сети прямого распространения и рекуррентные нейронные сети. Brain.js поддерживает контролируемое и неконтролируемое обучение.
Особенности Brain.js:
- Создана с упором на простоту и лёгкость интеграции в существующие приложения.
 - Не поддерживает обучение в браузере.
 - Позволяет сохранять обучающие данные и сериализовать их в JSON, так что можно добавить данные и переобучить модель.
 - Может использовать графический процессор для ускорения вычислений.
 - Имеет ограниченную функциональность по сравнению с более серьёзными библиотеками, например TensorFlow.js.
 
Импортируем библиотеку и создаём новую нейронную сеть. Определяем обучающие данные из входных и соответствующих выходных данных для вентиля XOR. Обучаем нейронку и выполняем прогноз:
const brain = require('brain.js');
const net = new brain.NeuralNetwork();
const trainingData = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];
net.train(trainingData);
const output = net.run([1, 0]);
console.log(output);
ml5.js
ml5.js построена на основе TensorFlow.js. У неё простые интерфейсы, благодаря чему эта библиотека подходит новичкам и разработчикам, которые плохо знакомы с машинным обучением. Работает в браузере.
Для чего подойдёт:
- изучение основ нейронных сетей;
 - разработка интерактивных веб-приложений и мобильных приложений для взаимодействия с моделями машинного обучения;
 - создание прототипов и MVP без погружения в технические детали.
 
У библиотеки активное сообщество и хорошая документация: примеры, инструкции и другие образовательные материалы, так что новичку легко найти нужное решение и получить поддержку.
Особенности ml5.js:
- Поддерживает выполнение моделей в реальном времени.
 - Есть много предобученных моделей, например для классификации изображений, генерации текста или звуков.
 - Проста в использовании, но не предоставляет таких возможностей для создания и обучения моделей с нуля, как TensorFlow.js.
 - Ориентирована на образовательные и творческие проекты.
 
Инициализируем классификатор изображений, используя модель MobileNet. Как только модель загружена и готова, мы передаём изображение классификатору для получения прогнозов. Функция gotResult отображает метку и оценку достоверности прогнозируемого класса изображений:
let classifier;
function setup() {
  createCanvas(400, 400);
  classifier = ml5.imageClassifier('MobileNet', modelReady);
}
function modelReady() {
  console.log('Модель готова!');
  classifier.predict(img, gotResult);
}
function gotResult(err, results) {
  if (err) {
    console.error(err);
    return;
  }
  console.log(results);
  createP('Label: ' + results[0].label);
  createP('Confidence: ' + nf(results[0].confidence, 0, 2));
}
WebDNN
WebDNN — библиотека для работы глубоких нейронных сетей в браузере. Она позволяет запускать нейронные сети и выполнять предсказания без необходимости серверной обработки и подходит для создания интерактивных веб-приложений, где требуется машинное обучение на стороне клиента. У библиотеки простой API для загрузки модели, выполнения предсказаний и обработки результатов, так что она хорошо подходит новичкам.
Для чего подойдёт:
- распознавание изображений и обнаружение объектов;
 - анализ и перевод текста;
 - преобразование речи в текст;
 - обработка видео в реальном времени;
 - анализ данных от сенсоров в реальном времени;
 - разработка интерактивных веб-приложений;
 - создание рекомендательных систем.
 
Библиотека включает различные оптимизации для повышения производительности предсказаний. Оптимизации включают использование компактных форматов для хранения весов модели и уменьшение количества вычислений, необходимых для выполнения предсказаний.
Особенности WebDNN:
- Оптимизирована для работы на различных устройствах, включая мобильные телефоны и планшеты.
 - Использует технологии аппаратного ускорения WebGL, WebGPU и WebAssembly.
 - Может работать с предварительно обученными моделями глубокого обучения из TensorFlow, Keras и PyTorch.
 
Импортируем WebDNN, загружаем модель и подготавливаем входные данные в виде изображения. Преобразуем его в формат, который подходит для модели. После этого выполняем предсказания и выводим результаты:
import WebDNN from 'webdnn';
async function runInference() {
  const model = await WebDNN.load('/path/to/model');
  
  const image = document.getElementById('inputImage'); 
  const imageData = await preprocessImage(image);
  const input = model.getInputViews()[0];
  input.set(imageData);
  await model.run();
  const output = model.getOutputViews()[0].get();
  console.log('Inference result:', output);
}
async function preprocessImage(imageElement) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = imageElement.width;
  canvas.height = imageElement.height;
  ctx.drawImage(imageElement, 0, 0, canvas.width, canvas.height);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;
  const processedData = new Float32Array(data.length / 4 * 3);
  for (let i = 0, j = 0; i < data.length; i += 4, j += 3) {
    processedData[j] = data[i] / 255;
    processedData[j + 1] = data[i + 1] / 255;
    processedData[j + 2] = data[i + 2] / 255; 
  }
  return processedData;
}
window.addEventListener('load', () => {
  runInference().catch(err => console.error('Error during inference:', err));
});
ConvNetJS
ConvNetJS — библиотека для обучения и запуска нейронных сетей непосредственно в браузере. Она построена на основе библиотеки WebGL, что позволяет эффективно выполнять параллельные вычисления на графическом процессоре. Поддерживает полносвязные, свёрточные и рекуррентные нейросети.
Для чего подойдёт:
- изучение основ нейронных сетей;
 - распознавание объектов, классификация и обработка изображений;
 - анализ текста;
 - быстрое прототипирование моделей.
 
У библиотеки простой API и есть возможность загрузки и предварительной обработки данных, благодаря чему ConvNetJS часто выбирают новички. Поддерживает контролируемое и неконтролируемое обучение, поэтому подходит для различных задач. Библиотека полностью основана на браузере и не зависит от графических процессоров или компиляторов.
Особенности ConvNetJS:
- Включает инструменты для визуализации процесса обучения и работы нейронок, так что можно отслеживать производительность модели и обнаруживать проблемы в процессе обучения.
 - Есть функции для тестирования обученных моделей и оценки их производительности на тестовых данных.
 - Поддерживает несколько алгоритмов оптимизации, включая стохастический градиентный спуск (SGD), что позволяет настраивать процесс обучения в зависимости от требований задачи.
 
⚠️ Активное развитие этой ConvNetJS прекратилось, так что для серьёзных проектов лучше использовать другие библиотеки.
Вот пример создания простой свёрточной нейросети для классификации изображений. Создаём модель, указываем слои: входной, свёрточный, пулинг, полносвязный и выходной. Создаём тренера и обучаем модель на случайных данных:
var layer_defs = [];
var trainer;
layer_defs.push({type: 'input', out_sx: 28, out_sy: 28, out_depth: 1});
layer_defs.push({type: 'conv', sx: 5, filters: 8, stride: 1, pad: 2, activation: 'relu'});
layer_defs.push({type: 'pool', sx: 2, stride: 2, pad: 0});
layer_defs.push({type: 'fc', num_neurons: 100, activation: 'relu'});
layer_defs.push({type: 'softmax', num_classes: 10});
var net = new convnetjs.Net();
net.makeLayers(layer_defs);
trainer = new convnetjs.SGDTrainer(net, {learning_rate: 0.01, l2_decay: 0.001});
var num_examples = 100;
var x = [];
var y = [];
for (var i = 0; i < num_examples; i++) {
  x.push(convnetjs.array_2d([28, 28], Math.random));
  y.push([Math.random() > 0.5 ? 1 : 0]);
}
for (var epoch = 0; epoch < 10; epoch++) {
  var loss = 0;
  for (var i = 0; i < num_examples; i++) {
    var x_data = x[i];
    var y_data = y[i];
    var stats = trainer.train(x_data, y_data);
    loss += stats.loss;
  }
  console.log('Epoch ' + epoch + ': Loss = ' + (loss / num_examples));
}
console.log('Обучение завершено');
Synaptic.js
Synaptic.js предназначена для того, чтобы легко создавать нейросети в браузере. Поддерживает различные архитектуры, включая многослойные персептроны, свёрточные и рекуррентные сети. Работает в браузере и среде Node.js. Эта библиотека подходит новичкам и разработчикам без глубоких знаний в области ML.
Для чего подойдёт:
- изучение основ нейронных сетей;
 - быстрое прототипирование и тестирование моделей;
 - классификация изображений, например распознавание рукописных цифр,
 - прогнозирование числовых значений,
 - создание небольших интерактивных приложений,
 - работа с небольшими данными.
 
Библиотека позволяет определять сетевые архитектуры и алгоритмы обучения, предоставляя полный контроль над поведением нейронной сети. Поддерживает контролируемое и неконтролируемое обучение.
Особенности Synaptic.js:
- Предназначен в первую очередь для образовательных целей и создания простых нейронных сетей.
 - Структурирована так, чтобы облегчить создание, комбинирование и повторное использование различных компонентов нейронной сети.
 - Не использует графических процессов и имеет меньшую производительность.
 
Вот пример создания и обучения многослойного персептрона на задаче XOR. Создаём нейросеть и определяем обучающие данные. Затем создаём тренера, обучаем нейронку и тестируем её:
var network = new synaptic.Architect.Perceptron(2, 3, 1);
var trainingSet = [
  { input: [0, 0], output: [0] },
  { input: [0, 1], output: [1] },
  { input: [1, 0], output: [1] },
  { input: [1, 1], output: [0] }
];
var trainer = new synaptic.Trainer(network);
// Обучение сети
trainer.train(trainingSet, {
  rate: 0.1,
  iterations: 20000,
  error: 0.005,
  shuffle: true,
  log: 1000,
  cost: synaptic.Trainer.cost.CROSS_ENTROPY
});
function testNetwork() {
  console.log('Test [0, 0]:', network.activate([0, 0]));
  console.log('Test [0, 1]:', network.activate([0, 1]));
  console.log('Test [1, 0]:', network.activate([1, 0]));
  console.log('Test [1, 1]:', network.activate([1, 1]));
}
testNetwork();
						


