Как использовать функцию Model.save на моделях концентраторов TF JS? - PullRequest
1 голос
/ 07 января 2020

Я не знаю javascript, поэтому я хотел перевести модель HUB, которая доступна только в JS, в формат SavedModel.

Я скопировал этот скрипт из учебника и попытался добавить функцию model.save, но она не работает.

Вот скрипт:


    <html><head>
    <!-- Load the latest version of TensorFlow.js -->
    <script src="https://unpkg.com/@tensorflow/tfjs"></script>
    <script src="https://unpkg.com/@tensorflow-models/mobilenet"></script>

    </head>
    <body>
      <div id="console"></div>
      <!-- Add an image that we will use to test -->
      <img id="img" src="https://i.imgur.com/JlUvsxa.jpg" width="227" height="227">

      <script>
         let net;

         async function app() {
         console.log('Loading mobilenet..');

         // Load the model.
         net = await mobilenet.load();
         console.log('Successfully loaded model');

         // Make a prediction through the model on our image.
         const imgEl = document.getElementById('img');
         const result = await net.classify(imgEl);
         console.log(result);

         console.log('Saving mobilenet...');
         const saveResults = await net.save('downloads://my-model-1');
         console.log('Mobilenet saved');
       }
       app();

     </script>
    </body></html>

А вот Я получаю ошибку:

Uncaught (in promise) TypeError: net.save is not a function
at app (TFjsmodelSaver.html:27)
app @ TFjsmodelSaver.html:27
async function (async)
app @ TFjsmodelSaver.html:19
(anonymous) @ TFjsmodelSaver.html:30

Ошибка ясно говорит о том, что net .save не является функцией в приложении, но в то же время net .classify работает, и сохранение в TF js: https://js.tensorflow.org/api/0.12.5/#tf .Model.save

Что мне не хватает?

Кстати, если есть способ получить модели HUB в SavedModel, не проходя через это Пожалуйста, укажите мне на это. Я предположил бы, что модели были сначала созданы в TF и ​​затем портированы в TF JS, поэтому они могут быть доступны где-то ...

1 Ответ

0 голосов
/ 17 января 2020

mobilenet.load() возвращает обещание типа Mobil eNet. Вот определение интерфейса:

export interface MobileNet {
  load(): Promise<void>;
  infer(
      img: tf.Tensor|ImageData|HTMLImageElement|HTMLCanvasElement|
      HTMLVideoElement,
      embedding?: boolean): tf.Tensor;
  classify(
      img: tf.Tensor3D|ImageData|HTMLImageElement|HTMLCanvasElement|
      HTMLVideoElement,
      topk?: number): Promise<Array<{className: string, probability: number}>>;
}

Загруженная модель не содержит метод save, что вызывает ошибку.

сохранение не является функцией

Стоит ли сохранять модель? Загруженная модель не используется для обучения. Таким образом, каждый раз, когда это необходимо, его можно загрузить с помощью mobilenet.load.

Пакет mobil enet - это просто оболочка для mobilet saveModel. Репо gitbub содержит URL другой версии mobil enet, из которой можно загрузить сохраненную модель. Модель можно загрузить локально, используя tf.loadGraphModel. Но эта локально загруженная модель будет иметь тип tf.GraphModel и не будет содержать методы classify и infer

A , следующий выпуск обеспечит возможность сохранения tf.GraphModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...