Написание пользовательского колбэка

Keras.js представляет собой библиотеку для запуска предварительно обученных моделей Keras непосредственно в браузере на JavaScript. Основной задачей при работе с Keras.js является загрузка модели, передача данных и получение результатов. Однако для сложных сценариев требуется использование пользовательских колбэков, позволяющих контролировать процесс инференса, логировать промежуточные результаты или управлять потоками данных.

Концепция колбэков

Колбэк в Keras.js — это объект с определёнными методами, которые вызываются на различных этапах работы модели. Основная цель колбэка — предоставление возможности выполнять дополнительный код в момент:

  • загрузки модели,
  • выполнения инференса,
  • завершения предсказания,
  • обработки ошибок.

Классический пример структуры колбэка:

const customCallback = {
    onLoad: function(model) {
        console.log('Модель успешно загружена:', model);
    },
    onPredictStart: function(inputData) {
        console.log('Начало предсказания для данных:', inputData);
    },
    onPredictEnd: function(outputData) {
        console.log('Результаты предсказания:', outputData);
    },
    onError: function(error) {
        console.error('Произошла ошибка:', error);
    }
};

Каждый метод колбэка имеет свою семантику:

  • onLoad(model) — вызывается сразу после загрузки модели. Позволяет получить объект модели и при необходимости модифицировать его свойства перед инференсом.
  • onPredictStart(inputData) — вызывается перед началом инференса. inputData содержит тензоры или массивы входных данных. Используется для проверки или трансформации данных.
  • onPredictEnd(outputData) — вызывается после завершения предсказания. outputData — массив или объект с результатами. Здесь можно логировать результаты, визуализировать их или передавать дальше по цепочке обработки.
  • onError(error) — вызывается при возникновении ошибки. Позволяет обработать исключение и, например, уведомить пользователя или отправить отчет об ошибке на сервер.

Подключение пользовательского колбэка к модели

При создании экземпляра модели Keras.js колбэк передаётся через опции:

const model = new KerasJS.Model({
    filepath: 'model.json',
    gpu: true,
    callback: customCallback
});

Флаг gpu указывает, что вычисления будут выполняться с использованием WebGL для ускорения инференса. Передача колбэка через опцию callback обеспечивает автоматический вызов методов на соответствующих этапах работы модели.

Использование колбэков для промежуточного анализа

Иногда требуется контролировать промежуточные слои модели. Keras.js позволяет получить доступ к внутренним слоям через объект модели. В колбэках можно извлекать промежуточные активации:

const monitorCallback = {
    onPredictEnd: function(outputData) {
        const intermediateLayer = model.getLayer('dense_1');
        const activation = intermediateLayer.output;
        console.log('Активация промежуточного слоя:', activation);
    }
};

Метод getLayer(layerName) возвращает слой по имени, а свойство output содержит тензор активаций для последней инференции. Такой подход используется для визуализации скрытых слоёв или отладки.

Асинхронная обработка данных

Колбэки Keras.js поддерживают асинхронные операции, что важно при работе с сетевыми запросами или динамическими источниками данных:

const asyncCallback = {
    onPredictEnd: async function(outputData) {
        const response = await fetch('/log_predictions', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(outputData)
        });
        console.log('Результаты отправлены на сервер, статус:', response.status);
    }
};

Асинхронные функции внутри колбэка позволяют безопасно выполнять HTTP-запросы, сохранять данные в IndexedDB или обновлять интерфейс без блокировки основного потока браузера.

Рекомендации по организации колбэков

  1. Разделение логики — каждый колбэк должен выполнять ограниченный набор функций (например, логирование или обработка ошибок).
  2. Минимизация вычислений — не следует выполнять тяжёлые операции внутри onPredictStart или onPredictEnd, чтобы не замедлять инференс.
  3. Управление состоянием — если колбэк использует состояние между вызовами, его рекомендуется хранить в замыкании или отдельном объекте.
  4. Обработка ошибок — метод onError должен быть всегда реализован, особенно при работе с динамическими данными.

Пример комплексного колбэка

const fullCallback = {
    onLoad: function(model) {
        console.log('Модель загружена');
        this.startTime = performance.now();
    },
    onPredictStart: function(inputData) {
        console.log('Начало предсказания');
    },
    onPredictEnd: function(outputData) {
        const duration = performance.now() - this.startTime;
        console.log('Предсказание завершено за', duration.toFixed(2), 'мс');
    },
    onError: function(error) {
        console.error('Ошибка во время инференса:', error.message);
    }
};

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


Пользовательские колбэки в Keras.js предоставляют гибкий инструмент для мониторинга, логирования и расширения функционала модели на клиентской стороне. Правильная организация колбэков позволяет интегрировать инференс в сложные веб-приложения без потери производительности и удобства разработки.