【发布时间】: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.bingroup1-shard2of2.binlabels.jsonmodel.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
似乎在训练完模型后,我只剩下:
- 文件名为
checkpoint、ckpt-1.data-00000-of-00001、ckpt-1.index、pipeline.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 的链接,这将我们带到了一个名为 tfjs-converter 的项目。那个回购说:
此存储库已归档以支持 tensorflow/tfjs。
此回购将保留一段时间以保留历史记录,但所有 未来的 PR 应该发送到 tfjs-core 内的tensorflow/tfjs 文件夹。
所有历史记录和贡献都保存在 monorepo 中。
这听起来有点像对我的循环引用,考虑到它会将我引导到刚刚告诉我去这里的页面。因此,此时您想知道整个库是否已弃用,它会起作用还是什么?无论如何,我都会在这个 repo 中查看:https://github.com/tensorflow/tfjs-converter/tree/master/tfjs-converter
上面写着:
导入模型的两步过程:
- 一个 python pip 包,用于将 TensorFlow SavedModel 或 TensorFlow Hub 模块转换为网络友好格式。如果您已经拥有转换后的模型,或者正在使用已托管的模型(例如 MobileNet),请跳过此步骤。
- 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.restore到SavedModel的“变量/” 子目录。
这可能是答案,但我不太清楚“恢复”意味着什么,或者我从那里去哪里,如果这甚至是正确的步骤。所有这些对于学习 TF 的人来说都是非常困惑的,这就是为什么我寻找一个教程来做它,但同样,如果没有第三方云服务/React,我似乎找不到一个。
请帮我把这些点联系起来。
【问题讨论】:
标签: tensorflow tensorflow2.0 tensorflow.js