Как использовать функцию Model.save на моделях концентраторов TFJS?

Я не знаю 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 работает, а сохранение находится в tfjs: https://js.tensorflow.org/api/0.12.5/

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

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

1 ответ

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

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.

Пакет mobilenet - это просто оболочка для сохраненной модели mobilet. GitHub репо содержит адрес другой версии MobileNet, из которых savedModel может быть загружен. Модель можно загрузить локально с помощьюtf.loadGraphModel. Но эта локально загруженная модель будет иметь типtf.GraphModel и не будет содержать методов classify а также infer

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

Другие вопросы по тегам