Tensorflow.js невозможность найти модель в локальном хранилище в асинхронной функции

#javascript #async-await #local-storage #tensorflow.js

#javascript #асинхронный-ожидание #local-storage #tensorflow.js

Вопрос:

Итак, в настоящее время я пытаюсь использовать асинхронную функцию, поэтому извлекаю файл из каталога проекта и устанавливаю его в локальное хранилище. У tensorflow.js функция loadLayersModel() извлекает файл из локального хранилища и загружает его в переменную с именем «model».

 async function tensorFlow() {

                let response = await fetch("./AI-Model/model.json")

                console.log(response);

                var data = await response.json();

                console.log("DATA: "   JSON.stringify(data));
                await localStorage.setItem('saved_model', JSON.stringify(data));


                const model = await tf.loadLayersModel('localstorage://saved_model');
        }

 

Я могу просмотреть через инструменты разработчика в Chrome, что данные правильно присваиваются localstorage, однако при вызове loadLayersModel() я получаю следующую ошибку.

 local_storage.js:208 Uncaught (in promise) Error: In local storage, there is no model with name 'saved_model'
 

Я подозреваю, что localStorage.setItem вызывается после loadLayersModel() . Но даже после того, как программа назначает saved_model локальному хранилищу, она по-прежнему не распознает, что saved_model находится в локальном хранилище. Я не могу понять, почему это происходит, и я ищу способ загрузить мою модель слоев через мой каталог проекта, чтобы мне не нужно было настраивать веб-сервер.

Ответ №1:

Ваша проблема связана с тем, как вы извлекаете данные, а также обратите внимание, что все localStorage вызовы являются синхронными.

 localStorage.setItem('saved_model', JSON.stringify(data));
const modelFromLocalStorage = localStorage.getItem('saved_model');
const JSONSavedModel = JSON.parse(modelFromLocalStorage)
const model = await tf.loadLayersModel(JSONSavedModel);
 

Комментарии:

1. Теперь я получаю эту ошибку @yudhiesh Uncaught (in promise) Error: Cannot proceed with model loading because the IOHandler provided does not have the load method implemented.

Ответ №2:

loadLayersModel может сам загружать модель через http (ы). Это удобно, поскольку может потребоваться также загружать файлы веса.

Аналогично, использование model.save не только сохраняет модель, но и веса.

Позже модель может быть сохранена (соответственно извлечена) в (соответственно из) localstorage.

 await model = tf.loadLayersModel('url/of/model') // here url is './AI-Model/model.json'

// save the model to localstorage

await model.save('localstorage://name-of-model');

// later retrieved the model

await tf.loadLayersModel('localstorage://name-of-model');