【问题标题】:How can I convert the model I trained with Tensorflow (python) for use with TensorflowJS without involving IBM cloud (from the step I'm at now)?如何在不涉及 IBM 云的情况下将我用 Tensorflow (python) 训练的模型转换为与 TensorflowJS 一起使用(从我现在的步骤开始)?
【发布时间】:2021-07-12 16:01:28
【问题描述】:

我要做什么

我正在尝试学习 TensorFlow 对象识别,并且像往常一样学习新事物,我在网上搜索教程。我不想涉及任何第三方云服务或 Web 开发框架,我想学习只使用原生 JavaScript、Python 和 TensorFlow 库来完成它。

我目前拥有的东西

到目前为止,我已经关注 a TensorFlow object detection tutorial(伴随着 5+ hour video)到我在 Tensorflow (python) 中训练了一个模型并希望通过 TensorflowJS 将其转换为在浏览器中运行的地步。我也尝试过其他教程,但似乎没有找到解释如何在没有第三方云/工具和 React 的情况下做到这一点的教程。

我知道要将此模型与tensorflow.js 一起使用,我的目标是获取如下文件:

  • group1-shard1of2.bin
  • group1-shard2of2.bin
  • labels.json
  • model.json

我已经到了创建 TFRecord 文件并开始培训的地步:

py Tensorflow\models\research\object_detection\model_main_tf2.py --model_dir=Tensorflow\workspace\models\my_ssd_mobnet --pipeline_config_path=Tensorflow\workspace\models\my_ssd_mobnet\pipeline.config --num_train_steps=100

似乎在训练完模型后,我只剩下:

  • 文件名为checkpointckpt-1.data-00000-of-00001ckpt-1.indexpipeline.config
  • 预训练模型(我相信这不是训练期间更改的文件,对吧?)ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8

我确信从这一步得到我需要的文件并不难,但老实说,我浏览了很多文档和教程以及谷歌,并没有看到没有第三方云服务的例子。也许它在文档中,我遗漏了一些明显的东西。

项目目录结构如下:

我在哪里寻找答案

出于某种原因,令人沮丧的是,我发现的每一个使用预训练的 Tensorflow 模型通过 TensorFlowJS 进行对象检测的教程(包括上面链接的教程)都需要使用 IBM Cloud 和 ReactJS。也许他们都是从他们找到的一些教程中复制的,现在所有的教程都包含这个,我不知道。我所知道的是我正在构建一个Electron.js 桌面应用程序,并且假设计算发生在用户的设备上,对象检测不应该需要网络连接。澄清一下:我正在创建一个用户训练模型的应用程序,所以这不仅仅是一次转换的问题。我希望能够使用 Python Tensorflow 进行训练,并将模型转换为在 JavaScript Tensorflow 上运行而无需任何云 API。

所以我停止寻找教程并尝试直接查看https://github.com/tensorflow/tfjs 的文档。

当您到达section about importing pre-trained models 时,它会说:

导入预训练模型

我们支持从以下位置移植预训练模型:

TensorFlow SavedModel

Keras

所以我点击了 Tensorflow SavedModel 的链接,这将我们带到了一个名为 tfjs-converter 的项目。那个回购说:

此存储库已归档以支持 tensorflow/tfjs。

此回购将保留一段时间以保留历史记录,但所有 未来的 PR 应该发送到 tfjs-core 内的tensorflow/tfjs 文件夹。

所有历史记录和贡献都保存在 monorepo 中。

这听起来有点像对我的循环引用,考虑到它会将我引导到刚刚告诉我去这里的页面。因此,此时您想知道整个库是否已弃用,它会起作用还是什么?无论如何,我都会在这个 repo 中查看:https://github.com/tensorflow/tfjs-converter/tree/master/tfjs-converter

上面写着:

导入模型的两步过程:

  1. 一个 python pip 包,用于将 TensorFlow SavedModel 或 TensorFlow Hub 模块转换为网络友好格式。如果您已经拥有转换后的模型,或者正在使用已托管的模型(例如 MobileNet),请跳过此步骤。
  2. JavaScript API,用于加载和运行推理。

基本上说要创建一个venv并执行:

pip install tensorflowjs

tensorflowjs_converter \
    --input_format=tf_saved_model \
    --output_format=tfjs_graph_model \
    --signature_name=serving_default \
    --saved_model_tags=serve \
    /mobilenet/saved_model \
    /mobilenet/web_model

但是等等,我有一个“TensorFlow SavedModel”的检查点文件吗?这似乎不清楚,文档没有解释。所以我谷歌它,找到文档,它说:

您可以使用 SavedModel 格式保存和加载模型 以下 API:

低级 tf.saved_model API。本文档描述了如何使用这个 API 详细。保存:tf.saved_model.save(model, path_to_dir)

链接的语法有所推断:

tf.saved_model.save(
    obj, export_dir, signatures=None, options=None
)

举个例子:

class Adder(tf.Module):
  @tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
  def add(self, x):
    return x + x

model = Adder()
tf.saved_model.save(model, '/tmp/adder')

但到目前为止,这一点都不熟悉。我不明白如何将我的训练过程的结果(检查点)加载到变量 model 中,以便我可以将它传递给这个函数。

这段话似乎很重要:

必须通过将变量分配给 跟踪的对象或直接指向 obj 的属性。 TensorFlow 对象 (例如来自tf.keras.layers 的层,来自tf.train 的优化器) 他们的变量自动。这是相同的跟踪方案 tf.train.Checkpoint 使用,导出的 Checkpoint 对象可能是 通过指向恢复为训练检查点 tf.train.Checkpoint.restoreSavedModel 的“变量/” 子目录。

这可能是答案,但我不太清楚“恢复”意味着什么,或者我从那里去哪里,如果这甚至是正确的步骤。所有这些对于学习 TF 的人来说都是非常困惑的,这就是为什么我寻找一个教程来做它,但同样,如果没有第三方云服务/React,我似乎找不到一个。

请帮我把这些点联系起来。

【问题讨论】:

    标签: tensorflow tensorflow2.0 tensorflow.js


    【解决方案1】:

    您无需任何云服务即可将模型转换为 TensorFlowJS 格式。我已经列出了以下步骤。

    我确信从这一步得到我需要的文件并不难。

    您看到的检查点采用 tf.train.Checkpoint 格式 (relevant source code that creates these checkpoints in the object detection model code)。这与 SavedModel 和 Keras 格式不同。

    我们将执行以下步骤:

    Checkpoint (current) --> SavedModel --> TensorFlowJS
    

    tf.train.Checkpoint 转换为SavedModel

    请参阅the script models/research/object_detection/export_inference_graph.py 将检查点文件转换为 SavedModel。

    以下代码取自该脚本的文档。请调整您特定项目的路径。 --input_type 应保留为 image_tensor

    python export_inference_graph.py \
        --input_type image_tensor \
        --pipeline_config_path path/to/ssd_inception_v2.config \
        --trained_checkpoint_prefix path/to/model.ckpt \
        --output_directory path/to/exported_model_directory
    

    在输出目录中,您应该会看到一个已保存的模型目录。我们将在下一步中使用它。

    SavedModel 转换为 TensorFlowJS

    按照https://github.com/tensorflow/tfjs/tree/master/tfjs-converter 的说明进行操作,特别注意“TensorFlow SavedModel 示例”。示例转换代码复制如下。请为您的项目修改输入和输出路径。 --signature_name--saved_model_tags 可能必须更改,但希望不会。

    tensorflowjs_converter \
        --input_format=tf_saved_model \
        --output_format=tfjs_graph_model \
        --signature_name=serving_default \
        --saved_model_tags=serve \
        /mobilenet/saved_model \
        /mobilenet/web_model
    

    使用 TensorFlowJS 模型

    我知道为了将此模型与 tensorflow.js 一起使用,我的目标是获取如下文件:

    • group1-shard1of2.bin
    • group1-shard2of2.bin
    • labels.json
    • model.json

    上述步骤应该会为您创建这些文件,但我认为不会创建 labels.json。我不确定该文件应该包含什么。 TensorFlowJS 将使用model.json 构建推理图,并从.bin 文件中加载权重。

    因为我们将 TensorFlow SavedModel 转换为 TensorFlowJS 模型,所以我们需要使用 tf.loadGraphModel() 加载 JS 模型。见the tfjs converter page for more information

    请注意,对于 TensorFlowJS,TensorFlow SavedModel 和 Keras SavedModel 之间存在差异。在这里,我们处理的是 TensorFlow SavedModel。

    运行模型的 Javascript 代码可能超出了这个答案的范围,但我建议阅读 this TensorFlowJS tutorial。我在下面包含了一个有代表性的 javascript 部分。

    import * as tf from '@tensorflow/tfjs';
    import {loadGraphModel} from '@tensorflow/tfjs-converter';
    
    const MODEL_URL = 'model_directory/model.json';
    
    const model = await loadGraphModel(MODEL_URL);
    const cat = document.getElementById('cat');
    model.execute(tf.browser.fromPixels(cat));
    

    补充说明

    ...这听起来有点像循环引用我,

    TensorFlowJS 生态系统已整合到 tensorflow/tfjs GitHub 存储库中。 tfjs-converter documentation 现在住在那里。您可以向 https://github.com/tensorflow/tfjs 创建一个拉取请求,以修复 SavedModel 链接以指向 tensorflow/tfjs 存储库。

    【讨论】:

    • 运行python export_inference_graph.py ... snip ... 会产生与this question 相关的错误RuntimeError: tf.placeholder() is not compatible with eager execution.,涉及急切执行。如果它是相关的,我的版本是tensorflow 2.5.0, tensorflow-addons 0.13.0, tensorflow-datasets 4.3.0, tensorflow-estimator 2.5.0, tensorflow-gpu 2.5.0
    • 我有点不清楚应该在--trained_checkpoint_prefix path/to/model.ckpt 行中传递什么文件。也许我放错了。我尝试用不同的随机文件替换它,但错误没有改变。我没有任何带有.ckpt 扩展名的文件,只有Tensorflow\workspace\models\my_ssd_mobnet\ckpt-1.data-00000-of-00001(这是我通过的)和Tensorflow\workspace\models\my_ssd_mobnet\ckpt-1.index
    • 不用担心 cmets。随意删除不必要或过时的 cmets。这将使其他人更容易关注讨论。您是否一直在我的回答中发现错误?随意指出不起作用的地方。
    • 我不知道您的回答是否有错误,或者我做错了什么。经过更多测试,验证我的模型肯定来自tensorflow 2.x model zoo,我得到了这个命令并记录了输出。与上述相同的错误。 gist.github.com/jt0dd/2e9b037bc76d7efd6d382fb47238d5f6
    • tf.placeholder 不在 tf 2.x 中,所以看起来您仍在某处使用 tf 1.x。
    猜你喜欢
    • 2021-12-13
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2023-01-04
    • 2018-12-22
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多