При работе с Keras.js модели загружаются в браузер из JSON-файлов и бинарных весов. Этот процесс может занимать значительное время, особенно при больших нейронных сетях. Для улучшения пользовательского опыта важно применять асинхронную загрузку через промисы и события.
const model = new KerasJS.Model({
filepath: 'model/model.json',
gpu: true
});
model.ready()
.then(() => {
console.log('Модель загружена и готова к использованию');
})
.catch(err => {
console.error('Ошибка загрузки модели:', err);
});
Ключевой момент: model.ready() возвращает промис,
который сигнализирует о готовности модели. В этот момент можно скрывать
индикатор загрузки и показывать интерфейс для ввода данных.
Для больших моделей или при медленном соединении необходимо отображать индикатор загрузки. В Keras.js можно отследить прогресс загрузки весов с помощью событий XMLHttpRequest или пользовательских обработчиков.
Пример прогресса через fetch:
function loadWeightsWithProgress(url, onProgress) {
return fetch(url)
.then(response => {
const contentLength = response.headers.get('Content-Length');
const total = parseInt(contentLength, 10);
let loaded = 0;
return new Response(
new ReadableStream({
start(controller) {
const reader = response.body.getReader();
function read() {
reader.read().then(({ done, value }) => {
if (done) {
controller.close();
return;
}
loaded += value.length;
onProgress(loaded / total);
controller.enqueue(value);
read();
});
}
read();
}
})
);
})
.then(res => res.arrayBuffer());
}
loadWeightsWithProgress('model/weights.bin', progress => {
document.getElementById('progress-bar').style.width = `${progress * 100}%`;
});
Особенности реализации:
ReadableStream позволяет получать данные по
частям.onProgress вызывается с текущим прогрессом в диапазоне
[0,1].Даже после загрузки модели выполнение предсказаний может занимать время. Особенно это заметно на больших свёрточных сетях. Для улучшения UX применяются следующие подходы:
async/awaitasync function predict(inputData) {
document.getElementById('spinner').style.display = 'block';
const outputData = await model.predict({ input: inputData });
document.getElementById('spinner').style.display = 'none';
return outputData;
}
Использование Web Workers Выполнение модели в
отдельном потоке предотвращает зависание интерфейса. Для этого Keras.js
можно подключить внутри воркера и передавать данные через
postMessage.
Пошаговое обновление прогресса Если предсказание делится на батчи, можно обновлять индикатор по мере обработки каждого батча, чтобы пользователь видел динамику выполнения.
<div id="loading-container">
<div id="spinner"></div>
<div id="progress-bar-container">
<div id="progress-bar"></div>
</div>
<p id="status-text">Загрузка модели...</p>
</div>
Совет по UX: сочетание спиннера с текстовым прогрессом обеспечивает наиболее информативное представление процесса для пользователя.
model.ready().Эти методы обеспечивают не только функциональную корректность, но и положительное восприятие взаимодействия с приложением, что критически важно для веб-приложений с машинным обучением на клиентской стороне.