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