Как загрузить модель с tf.loadModel из хранилища Firebase? - PullRequest
0 голосов
/ 12 января 2019

Я разрабатываю приложение в среде ionic3 для распознавания нарисованных символов, и у меня возникают проблемы с импортом модели. Я импортировал модель из Keras (преобразованную с tensorflowjs_converter) в мое приложение ionic3 двумя различными способами:

  1. Файлы model.json и weight (осколки) помещаются в папку /assets/models.
  2. Файлы model.json и weight (осколки) хранятся в хранилище Firebase.

При запуске приложения в браузере с помощью first method модель и веса загружаются правильно, и я могу прогнозировать классы. Но при запуске приложения тем же способом на моем устройстве Android с ionic cordova run android --device модель, похоже, не получает данные из файлов весов, поскольку выдает следующую ошибку:

Based on the provided shape, [3, 3, 32, 64], the tensor should have 18432 values but has 917.

Теперь я попытался разместить файлы в хранилище Firebase, чтобы попытаться исправить эту проблему. Я извлекаю model.json из хранилища и все равно получаю ту же ошибку, что и выше в браузере и на устройстве .

Из опыта локального хранения в приложении осколков и модели я пришел к выводу, что осколки не распознаются в устройстве в обоих направлениях.

Кроме того, при использовании метода хранения Firebase в устройстве , при попытке извлечь модель из URL, я улавливаю следующую ошибку: Failed to fetch.

Вот код получения осколков и модель:

const modelURL: string = await this.db.getModel();
const shards: string[] = await this.db.getShards();

modelURL и shards содержит URL-адреса загрузки из хранилища Firebase. Модель и осколки находятся на одном уровне:

/* Firebase Storage hierarchy */

https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard2of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard3of4?alt=media&token=******
https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard4of4?alt=media&token=******

Итак, я передаю URL загрузки модели в tf.loadModel:

import * as tf from '@tensorflow/tfjs';    

await tf.loadModel(modelURL).then(model => {
    const output: any = model.predict(img);
});

Итак, есть ли способ передать осколки в tf.loadModel(), извлеченные из хранилища базы данных, чтобы в моем устройстве и браузере я мог получить все данные, необходимые для прогнозирования по модели?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 15 января 2019

Загрузчик http для вызова tf.loadModel () предполагает, что model.json и соответствующие файлы весов (group1-shard1of1, ...) имеют одинаковый префикс пути URL. Например: данный файл модели находится по адресу: https://foo.bar/path/model.json загрузчик с попыткой получить весовые файлы по адресу: https://foo.bar/path/group1-shard1of1, ...

В вашем случае const modelURL: string = await this.db.getModel (); const shards: string [] = await this.db.getShards ();

Если modelUrl и shards не используют один и тот же путь, вам может потребоваться создать собственный BrowserHttp IOHandler для загрузки: const model = await tf.loadModel (новый MyOwnHttpIOLoader (modelUrl, shards));

Если они это сделают, вы сможете выровнять их, отредактировав файл model.json вручную. В файле model.json есть массив путей к файлам веса.

С хранилищем Firebase проблема в том, что URL файла модели: https://firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fmodel.json который имеет путь firebasestorage.googleapis.com/v0/b/project-foo.com/o Загрузчик будет использовать путь и попытаться загрузить файл веса в firebasestorage.googleapis.com/v0/b/project-foo.com/o/group1-shard1of4. Но он не соответствует вашему весу url firebasestorage.googleapis.com/v0/b/project-foo.com/o/model%2Fgroup1-shard1of4, в нем отсутствует префикс model%2F.

Чтобы заставить загрузчик работать, вы можете вручную обновить файл model.json, добавив префикс. Найдите в файле «weightsManifest», отредактируйте массив «paths», чтобы он выглядел следующим образом [«model% 2Fgroup1-shard1of4», ...]

...