Прогрессивная загрузка весов представляет собой
методику, позволяющую загружать параметры нейронной сети поэтапно, а не
сразу полностью. Это критически важно для работы с большими моделями в
браузере, где ограничения по памяти и скорости сети могут стать узким
местом. В Keras.js данная возможность реализована через работу с
JSON-файлами весов и асинхронную загрузку через fetch или
аналогичные API.
Весовые параметры модели хранятся в формате JSON, в котором каждый слой представлен объектом с его параметрами:
{
"layer_name": "dense_1",
"weights": {
"kernel": [...],
"bias": [...]
}
}
Ключевые моменты:
layer_name — уникальный идентификатор слоя.weights — объект, содержащий массивы значений для всех
параметров слоя.kernel).Загрузка весов производится по частям, что позволяет не блокировать
основной поток выполнения. Для этого используется стандартный
JavaScript-подход с Promise:
async function loadWeightsChunk(url) {
const response = await fetch(url);
if (!response.ok) throw new Error('Ошибка при загрузке весов');
const weightsChunk = await response.json();
return weightsChunk;
}
Особенности:
После получения JSON с весами их необходимо передать объекту модели Keras.js:
const model = new KerasJS.Model({ filepath: 'model.json', gpu: true });
async function applyWeights() {
const chunk = await loadWeightsChunk('weights_part1.json');
await model.setWeights(chunk);
}
Особенности применения:
setWeights позволяет подставить значения весов в
конкретные слои.Для крупных моделей можно применять следующие стратегии:
Приоритет слоев по вычислительной значимости: Сначала загружаются слои, которые отвечают за ранние этапы обработки данных (например, свертки и пулинги в CNN).
Декомпозиция весов: Весовые матрицы большого размера можно разбить на меньшие блоки. Это уменьшает задержку при скачивании и снижает пиковое потребление памяти.
Кэширование: Использование IndexedDB или локального хранилища позволяет сохранять уже загруженные части весов и повторно их использовать при перезагрузке страницы.
Параллельная загрузка: Если сеть поддерживает одновременные асинхронные запросы, несколько частей весов можно загружать одновременно, минимизируя время ожидания.
const weightFiles = ['weights_part1.json', 'weights_part2.json', 'weights_part3.json'];
async function progressiveLoad(model, files) {
for (const file of files) {
const chunk = await loadWeightsChunk(file);
await model.setWeights(chunk);
}
}
const model = new KerasJS.Model({ filepath: 'model.json', gpu: true });
progressiveLoad(model, weightFiles).then(() => {
console.log('Все веса загружены и применены');
});
Ключевые аспекты примера:
Для моделей, размер которых превышает несколько сотен мегабайт, применяются дополнительные методы:
.bin) для ускорения
загрузки и снижения объема трафика.Прогрессивная загрузка весов превращает работу с крупными моделями в Keras.js из ресурсоёмкой операции в управляемый, предсказуемый процесс, позволяя интегрировать нейросети в веб-приложения с минимальными задержками и максимальной отзывчивостью интерфейса.