# Python 与 JavaScript 模型互转

# 什么是 Python 模型

通过 Python 版 TensorFlow/Keras 生成模型 , Keras 也是一个深度学习的框架。TensorFlow 也是支持 Keras 的 API 和语法的。

# Python 模型具体包含哪些模式

包括 TensorFlow Saved Model、keras HDF5 model 等

# Python 模型获取方式

开源网站下载/算法同事提供

# 什么是 Javascript 模型

可以在 TensorFlowJs 中(node 和浏览器)运行的模型

# Javascript 模型具体包含哪些模式

tfjs_layers_model 、 tfjs_graph_model 等

# Javascript 模型获取方式

开源网站下载/通过 TensorFlowjs 生成/由 Python 模型转化而来

# 为何要进行互转?

Python 模型 -- Javascript 模型 Javascript 模型可以在浏览器中运行

Javascript 模型 -- Python 模型 少见,为了在更多平台运行

Javascript 模型 -- Javascript 模型 分片/量化/加速

# 如何进行互转?

  • 安装 TensorFlow.js Converter

  • 在命令行指定输入输出路径和模型格式即可

# 安装 TensorFlow.js Converter

  • 安装 Conda 因为 TensorFlow.js Converter(依赖 Python3.6.8 的版本)以来 Python 环境,为了不影响可能存在的 Python 环境我们需要给每一个应用单独创建一个 Python 环境。Conda 就是帮助我们创建 Python 的虚拟环境的。

  • 使用 Conda 安装 Python 虚拟环境

  • 使用 Python 虚拟环境安装 TensorFlow.js Converter

# 具体流程

# 方式一:

在清华大学软件源中下载 miniconda 安装到电脑

然后使用命令行安装 python 的虚拟环境

conda create -n tfjs python=3.6.8

使用 python --version 先查看当前版本,然后执行命令

conda activate tfjs

此时再执行查看 python 版本发现变到 3.6.8 了

然后安装 tensorflowjs Converter 的包(这里 tensorflowjs 就是 tensorflowjs Converter)

pip install tensorflowjs

tensorflowjs_converter -h // 验证安装是否成功
  • conda 的一些命令
conda create -n tfjs python=3.6.8 // 创建python=3.6.8虚拟环境

conda remove -n tfjs --all // 删除所有conda环境

conda info --envs // 查看当前所有虚拟环境信息

conda activate tfjs // 激活tfjs这个虚拟python版本

conda deactivate // 退出激活的版本

# 方式二:

brew update

brew install pyenv

pyenv install 3.6.8

pyenv local 3.6.8

pip install tensorflowjs

# Python 模型 -- Javascript 模型

  • 进入 python 虚拟环境 3.6.8,执行
tensorflowjs_converter // 验证环境是否正确

tensorflowjs_converter --input_format=keras --output_format=tfjs_layers_model data/mobilenet/keras.h5 data/mobilenet/layers_model
tensorflowjs_converter --input_format=keras --output_format=tfjs_graph_model data/mobilenet/keras.h5 data/mobilenet/graph_model
tensorflowjs_converter 输入格式 输出格式 输入路径(鼠标右键拷贝相对位置) 输出路径
  • 并不是所有输入输出格式都能转换,必须相互对应,参照tfjs-converter

PS:生成的 graphModel 要修改 api 加载 graphModel 模型方可使用

# Javascript 模型 -- Python 模型

tensorflowjs_converter --input_format=tfjs_layers_model --output_format=keras data/mobilenet/layers_model/model.json data/mobilenet/keras2.h5

# Javascript 模型 -- Javascript 模型 分片/量化/加速

  • 分片 把一个模型分成很多片,每一片体积都很小了,再利用浏览器的并发加载能力,提升性能
tensorflowjs_converter --input_format=tfjs_layers_model --output_format=tfjs_layers_model --weight_shard_size_bytes=100000 data/mobilenet/web_model/model.json data/mobilenet/sharded_model/model.json

转换完成之后可以看到权重文件被分成了多份,浏览器同时加载多个

  • 量化 牺牲一部分精度来压缩模型的大小,也可以起到更快加载的效果
tensorflowjs_converter --input_format=tfjs_layers_model --output_format=tfjs_layers_model --quantization_bytes=2 data/mobilenet/web_model/model.json data/mobilenet/quantized_model/model.json

量化后的模型体积减少

  • 加速 通过将模型文件转换为 tfjs_graph_model 来加速模型 (tfjs_graph_model 内部使用了图优化来进行加速)
tensorflowjs_converter --input_format=tfjs_layers_model --output_format=tfjs_graph_model data/mobilenet/web_model/model.json data/mobilenet/graph_model/model.json

PS:可以使用 Chrome 的控制台 Performance 去测试 predict 方法的执行时间去判断快慢

# 参考文献/文档

tfjs tfjs-converter 清华大学软件源 miniconda 下载