Лучшие JavaScript-библиотеки для машинного обучения
hard

Лучшие JavaScript-библиотеки для машинного обучения

Если не хочется расчехлять Python

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();

Редактор:

Инна Долога

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
hard