Браузеры предоставляют два основных способа хранения данных на стороне клиента: LocalStorage и IndexedDB. Их использование в сочетании с Keras.js позволяет сохранять нейронные сети, весовые коэффициенты и промежуточные данные между сессиями без необходимости обращения к серверу.
LocalStorage представляет собой простое
ключ-значение хранилище, доступное через объект
window.localStorage. Основные характеристики:
string).Пример сохранения весов модели в LocalStorage:
// Предположим, есть объект весов модели
const weights = model.getWeights(); // Получение весов из Keras.js
const weightsJSON = JSON.stringify(weights); // Сериализация в JSON
// Сохранение в LocalStorage
localStorage.setItem('modelWeights', weightsJSON);
Загрузка весов обратно:
const storedWeights = localStorage.getItem('modelWeights');
if (storedWeights) {
const parsedWeights = JSON.parse(storedWeights);
model.setWeights(parsedWeights);
}
Особенности использования с Keras.js:
IndexedDB — более продвинутое хранилище, ориентированное на работу с большими объёмами структурированных данных. Отличительные особенности:
ArrayBuffer,
Blob) — критично для весов модели в Keras.js.Создание базы данных и объекта хранилища:
const request = indexedDB.open('kerasDB', 1);
request.onupgradenee ded = function(event) {
const db = event.target.result;
if (!db.objectStoreNames.contains('models')) {
db.createObjectStore('models', { keyPath: 'name' });
}
};
request.onsucc ess = function(event) {
const db = event.target.result;
console.log('IndexedDB готова к использованию');
};
Сохранение весов модели в IndexedDB:
function saveModelWeights(modelName, weights) {
const dbRequest = indexedDB.open('kerasDB', 1);
dbRequest.onsucc ess = function(event) {
const db = event.target.result;
const transaction = db.transaction(['models'], 'readwrite');
const store = transaction.objectStore('models');
const data = {
name: modelName,
weights: weights
};
const putRequest = store.put(data);
putRequest.onsucc ess = () => console.log('Весовые коэффициенты сохранены');
putRequest.oner ror = (e) => console.error('Ошибка при сохранении:', e);
};
}
Загрузка весов из IndexedDB:
function loadModelWeights(modelName, callback) {
const dbRequest = indexedDB.open('kerasDB', 1);
dbRequest.onsucc ess = function(event) {
const db = event.target.result;
const transaction = db.transaction(['models'], 'readonly');
const store = transaction.objectStore('models');
const getRequest = store.get(modelName);
getRequest.onsucc ess = () => {
const result = getRequest.result;
if (result) callback(result.weights);
};
getRequest.oner ror = (e) => console.error('Ошибка при загрузке:', e);
};
}
Особенности использования с Keras.js:
ArrayBuffer или TypedArray уменьшает объём
сериализованных данных по сравнению с JSON.| Характеристика | LocalStorage | IndexedDB |
|---|---|---|
| Объём | ~5–10 МБ | Практически неограничен |
| Тип данных | Только строки | Строки, бинарные данные |
| Синхронность | Синхронное API | Асинхронное API |
| Подходит для | Малых моделей, метаданных | Больших моделей, весов, данных |
| Сложность использования | Очень простое API | Более сложное, требует транзакций |
Blob или ArrayBuffer в
IndexedDB позволяет минимизировать накладные расходы на
сериализацию.pako (gzip), чтобы уменьшить объём и ускорить
загрузку.Promise или async/await для удобной интеграции
с Keras.js:async function saveWeightsAsync(modelName, weights) {
return new Promise((resolve, reject) => {
const request = indexedDB.open('kerasDB', 1);
request.onsucc ess = function(event) {
const db = event.target.result;
const transaction = db.transaction(['models'], 'readwrite');
const store = transaction.objectStore('models');
const putReq = store.put({ name: modelName, weights: weights });
putReq.onsucc ess = () => resolve();
putReq.oner ror = (e) => reject(e);
};
});
}
TypedArray формата Float32Array, что
соответствует формату весов внутри библиотеки, минимизируя
преобразования.