Keras.js представляет собой библиотеку для выполнения моделей Keras непосредственно в браузере на базе JavaScript. Она позволяет загружать заранее обученные модели и выполнять инференс без необходимости использования серверной инфраструктуры на Python. Для работы требуется подключение библиотеки через npm или прямое подключение скрипта:
// Через npm
npm install keras-js
// Через подключение скрипта
После подключения создаётся объект модели, который управляет загрузкой весов и вычислением предсказаний.
const model = new KerasJS.Model({
filepaths: {
model: 'model.json',
weights: 'model_weights.buf',
metadata: 'model_metadata.json'
},
gpu: true
});
Ключевые моменты:
filepaths.model — путь к JSON-файлу модели,
экспортированной из Keras.filepaths.weights — бинарные веса модели.filepaths.metadata — метаданные, включающие информацию
о слоях и формате входных данных.gpu: true — использование WebGL для ускорения
вычислений на GPU браузера.После создания экземпляра модели необходимо загрузить все файлы модели в память:
model.ready()
.then(() => console.log('Модель готова к инференсу'))
.catch(err => console.error('Ошибка загрузки модели:', err));
Для работы с Keras.js входные данные должны быть в формате
Float32Array. Если модель ожидает тензор размерности
(batch, height, width, channels), необходимо
правильно сформировать массив входных значений.
const inputData = new Float32Array([/* данные изображения или другого источника */]);
const input = {
input_1: inputData
};
Инференс выполняется через метод predict. Результатом
является объект, где ключи соответствуют выходным слоям модели.
model.predict(input)
.then(outputData => {
console.log('Результат предсказания:', outputData);
})
.catch(err => console.error('Ошибка инференса:', err));
Особенности работы:
При инференсе моделей для изображений часто требуется масштабирование и нормализация входных данных:
function preprocessImage(imageData, width, height) {
const input = new Float32Array(width * height * 3);
for (let i = 0; i < width * height * 3; i++) {
input[i] = imageData[i] / 255.0; // нормализация пикселей от 0 до 1
}
return input;
}
Подготовленный массив затем передаётся в метод predict
для получения результатов.
Для создания сервера инференса на Node.js используется библиотека
express. Сервер принимает данные от клиента, выполняет
инференс и возвращает результат:
const express = require('express');
const app = express();
app.use(express.json());
app.post('/predict', async (req, res) => {
try {
const inputData = req.body.data; // ожидается массив чисел
const input = { input_1: new Float32Array(inputData) };
const output = await model.predict(input);
res.json({ result: output });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.listen(3000, () => console.log('Сервер запущен на порту 3000'));
Важные аспекты:
express.json().Float32Array перед
инференсом.predict с использованием
await для корректного завершения вычислений.Для отладки инференса можно использовать:
console.log(model.layers);
console.log(model.inputs);
console.log(model.outputs);
Это позволяет убедиться, что структура модели соответствует ожидаемой и что данные подаются в правильном формате.