- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Tensorflow c++ 实践及各种坑.doc
Tensorflow c++ 实践及各种坑
曾子骄?2017-10-13?1708标签:?TensorFlow?,?python?,?C++
Tensorflow当前官网仅包含python、C、Java、Go的发布包,并无C++ release包,并且tensorflow官网也注明了并不保证除python以外库的稳定性,在功能方面python也是最完善的。众所周知,python在开发效率、易用性上有着巨大的优势,但作为一个解释性语言,在性能方面还是存在比较大的缺陷,在各类AI服务化过程中,采用python作为模型快速构建工具,使用高级语言(如C++,java)作为服务化程序实现是大势所趋。本文重点介绍tensorflow C++服务化过程中实现方式及遇到的各种问题。
实现方案
对于tensorflow c++库的使用,有两种方法:
(1) 最佳方式当然是直接用C++构建graph,但是当前c++tensorflow库并不像python api那样full-featured。可参照builds a small graph in c++ here, C++ tensorflow api中还包含cpu和gpu的数字内核实现的类,可用以添加新的op。
(2) 常用的方式,c++调用python生成好的graph。本文主要介绍该方案。
实现步骤
(1) 编译tensorflow源码C++ so(2) 模型训练输出结果(3) 模型固化(4) 模型加载及运行(5) 运行问题
(1) 源码编译
环境要求: 公司tlinux2.2版本, GCC版本 = 4.8.5安装组件: protobuf 3.3.0 bazel 0.5.0 python 2.7 java8机器要求: 4GB内存
a. 安装java8
yum install java
b. 安装protobuf 3.3.0
./configure make make install
c. 安装bazel
download /bazelbuild/bazel/releases
sh bazel-0.5.0-installer-linux-x86_64.sh
d. 编译源码
bazel build //tensorflow:libtensorflow_cc.so
编译过程中可能遇到的问题:问题一: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
安装Eigen3.3或以上版本问题二: java.io.IOException: Cannot run program patch
yum install patch
问题三: 内存不够
(2) 模型训练与输出
模型训练输出可参照改用例去实践https://blog.metaflow.fr/tensorflow-saving-restoring-and-mixing-multiple-models-c4c94d5d7125,?google上也很多,模型训练保存好得到下面文件:
(3) 模型固化
模型固化方式有三种:
a. freeze_graph 工具
bazel build tensorflow/python/tools:freeze_graph bazel-bin/tensorflow/python/tools/freeze_graph
--input_graph=graph.pb
--input_checkpoint=checkpoint
--output_graph=./frozen_graph.pb
--output_node_names=output/output/scores
b. 利用freeze_graph.py工具
# We save out the graph to disk, and then call the const conversion
# routine.
checkpoint_state_name = checkpoint
input_graph_name = graph.pb
output_graph_name = frozen_graph.pb
input_graph_path = os.path.join(FLAGS.model_dir, input_graph_name)
input_saver_def_path =
input_binary = False
input_checkpoint_path = os.path.join(FLAGS.checkpoint_dir, saved_checkpoint)
文档评论(0)