模型转换

TensorFlow.js 附带各种预训练模型,这些模型已准备好用于浏览器 - 它们可以在我们的 模型仓库 中找到。但是,您可能在其他地方找到了或编写了 TensorFlow 模型,并且希望在您的 Web 应用程序中使用它。TensorFlow.js 为此目的提供了一个模型 转换器。TensorFlow.js 转换器有两个组件

  1. 一个命令行实用程序,用于将 Keras 和 TensorFlow 模型转换为 TensorFlow.js 中使用。
  2. 一个 API,用于使用 TensorFlow.js 在浏览器中加载和执行模型。

转换您的模型

TensorFlow.js 转换器支持多种模型格式

SavedModel:这是 TensorFlow 模型保存的默认格式。SavedModel 格式的文档 在这里

Keras 模型:Keras 模型通常保存为 HDF5 文件。有关保存 Keras 模型的更多信息,请参见 这里

TensorFlow Hub 模块:这些是在 TensorFlow Hub 上打包以供分发的模型,TensorFlow Hub 是一个用于共享和发现模型的平台。模型库可以在这里找到 这里

根据您尝试转换的模型类型,您需要向转换器传递不同的参数。例如,假设您已将名为 model.h5 的 Keras 模型保存到您的 tmp/ 目录中。要使用 TensorFlow.js 转换器转换您的模型,您可以运行以下命令

$ tensorflowjs_converter --input_format=keras /tmp/model.h5 /tmp/tfjs_model

这将转换 /tmp/model.h5 中的模型,并将 model.json 文件以及二进制权重文件输出到您的 tmp/tfjs_model/ 目录中。

有关与不同模型格式相对应的命令行参数的更多详细信息,请参见 TensorFlow.js 转换器 自述文件

在转换过程中,我们将遍历模型图并检查每个操作是否受 TensorFlow.js 支持。如果是,我们将图写入浏览器可以使用的格式。我们尝试通过将权重分割成 4MB 文件来优化模型以在 Web 上提供服务 - 这样浏览器可以缓存它们。我们还尝试使用开源 Grappler 项目来简化模型图本身。图简化包括将相邻操作折叠在一起、消除常见子图等。这些更改不会影响模型的输出。为了进一步优化,用户可以传入一个参数,指示转换器将模型量化为特定字节大小。量化是一种通过使用更少的位来表示权重来减小模型大小的技术。用户必须注意确保他们的模型在量化后保持可接受的精度水平。

如果我们在转换过程中遇到不支持的操作,则该过程将失败,并且我们会为用户打印出该操作的名称。请随时在我们的 GitHub 上提交问题以告知我们 - 我们会尝试根据用户需求实施新操作。

最佳实践

虽然我们尽一切努力在转换过程中优化您的模型,但通常确保您的模型性能良好的最佳方法是在构建时考虑到资源受限的环境。这意味着尽可能避免过于复杂的架构并尽量减少参数(权重)的数量。

运行您的模型

成功转换模型后,您将获得一组权重文件和一个模型拓扑文件。TensorFlow.js 提供模型加载 API,您可以使用这些 API 来获取这些模型资产并在浏览器中运行推理。

以下是转换后的 TensorFlow SavedModel 或 TensorFlow Hub 模块的 API 样子

const model = await tf.loadGraphModel(‘path/to/model.json’);

以下是转换后的 Keras 模型的样子

const model = await tf.loadLayersModel(‘path/to/model.json’);

tf.loadGraphModel API 返回一个 tf.FrozenModel,这意味着参数是固定的,您将无法使用新数据微调您的模型。该 tf.loadLayersModel API 返回一个 tf.Model,它可以进行训练。有关如何训练 tf.Model 的信息,请参阅 训练模型指南

转换后,最好运行几次推理并对模型的速度进行基准测试。我们有一个独立的基准测试页面可用于此目的:https://tensorflow.github.io/tfjs/e2e/benchmarks/local-benchmark/index.html 您可能会注意到我们丢弃了初始预热运行的测量值 - 这是因为(通常)您的模型的第一次推理将比后续推理慢几倍,这是由于创建纹理和编译着色器的开销。