初涉知乎江湖,知道大佬很多,请温柔以待!!!
七日凌晨,谷歌连夜发布了有关于Tensorflow最新成果和技术,这应该是贾扬清离开脸书后另一个深度学习界令人惊呼的事件了吧!(旁白:反正你说是就是呗)笔者对Tensorflow 2.0 Alpha 还是Beta不是很感冒,倒是对tensorflow lite 1.0的更新激动到高呼:卧槽,牛比!(破音)
点击可看大会回顾
自17年开发者大会,tflite作为tensorflow的移动轻量版随之发布以来,在支持的运算和网络上做了较多兼容的工作,可一直无法让人满意,如此多喜闻乐见的网络没有办法在移动端部署,开发者也只能望洋兴叹。终于!此次大会为开发者带来了福音。支持的op将进一步拓展,RNN/LSTM将完美支持,再辅以前期(not前妻)的移动端GPU加速,吾孰能知否移动端开发的此刻的躁动。
TensorFlow Lite 2019 年发展蓝图www.zhuanzhi.ai抱歉,下面才是文章的主旨内容部分!
目前移动端部署,多是采用pb文件和tfmobile,tflite是tfmobile的轻化(light)版,相比tfmobile通常有更小的二进制大小,更少的依赖和更好的性能,大会规划的蓝图似乎让lite真正作为接替者走上历史的舞台(说得自己都诚惶诚恐).早期看了很多转换tflite模型的技术博客,糟了不少坑,纸短情长,无以在此言表。以下是个人重构的tflite丝滑版流畅的转换情景。
step 1
安装bazel编译工具,bazel官方安装教程 ,推荐第二种Using Bazel custom APT repository安装模式(三步)
step 2
下载tensorflow源码,笔者没尝试在安装版的tf里做编译,用源码不影响平台运转,放心操作。源码地址:tensorflow/tensorflow,配置过tf源码的盆友都知道,接下来配置洪水般倾泻询问的让你进退维谷,推倒重来是常态。记住一条:关于cuDNN配置的全yes,cudn的部分通过,其他的根据需求拟定。
step 3
接下来进入编译bazel 对源码的编译,如果只编译支持cpu的,输入如下代码,参考自:https://www.cnblogs.com/shouhuxianjian/p/9416934.html
$ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
如果需要gpu支持的,敲如下代码:
$ bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
笔者言:此步骤适宜午休前操作,这样你可以感受不到它的漫长。
step 4
好开心,午休归来阿哩哩!编译successful!恭喜,环境基本搭建完成!如果没有安装版tf的可以参考余下的步骤完成。
$bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip install /tmp/tensorflow_pkg/tensorflow
好了,下面进入崭新阶段,依以下的步骤编译模型转换工具包(前方有坑预警)~
$ bazel build tensorflow/python/tools:freeze_graph(作模型固化的工具)
$ bazel build tensorflow/lite/toto:toto(其他经验分享,这部分路径有误,笔者已更正)
$ bazel build tensorflow/tools/graph_transforms:summarize_graph(查看模型结构的工具)
齐活!下面就可以按照通用方式进行tflite模型转换了,但是我们通常在模型训练完成后只有.ckpt文件,可以将.ckpt文件直接固化成pb文件,这里参考了tensorflow实现将ckpt转pb文件
这样生成的固化pb文件,可以直接进入toco命令转换了! 在toco命令中,需要有网络的输入,输出,shape等参数,可以通过这个命令(模型路径替换成自己的):
$ bazel-bin/tensorflow/tools/graph_transforms/summarize_graph --in_graph=../freeze_graph.pb 参考: Tensorflow 模型转 tflite ,在安卓端使用
通过网络结构就可找到对应输入/出参量了,进入toco模型转换,以mobilenet为例,命令如下形式(第一行的路径笔者有修正):
$ bazel-bin/tensorflow/lite/toco/toco --input_file=frozen_model.pb
--output_file=model.tflite --input_format=TENSORFLOW_GRAPHDEF
--output_format=TFLITE --inference_type=FlOAT
--input_shapes="1,224,224,3" --input_array=input
--output_array=MobilenetV1/Predictions/Reshape_1
操作无误后,就可以喜提tflite模型了!如果有对android部署熟知或有兴趣的呼友,也可以交流一下!
Delta first writen for Miniredzuzu~