Tensorflow1.4 C++ 编译 您所在的位置:网站首页 TensorFlow编译选择protobuf版本 Tensorflow1.4 C++ 编译

Tensorflow1.4 C++ 编译

2023-08-09 14:39| 来源: 网络整理| 查看: 265

摘要: 最近在研究如何使用tensorflow c++ API调用tensorflow python环境下训练得到的网络模型文件。参考了很多博客,文档,一路上踩了很多坑,现将自己的方法步骤记录下来,希望能够帮到有需要的人!(本文默认读者对python环境下tensorflow的使用已经比较熟悉了)

方法简要梳理如下:

安装bazel,然后使用bazel编译tensorflow源码,产生我们需要的库文件。在python环境下,使用tensorflow训练一个深度神经网络,本文以mnist为例。将训练好的模型和参数冻结在一个pb文件中。在C++环境下,调用pb文件,对图片进行预测。最终结果如下图所示,程序成功识别到图片中的数字为1,且概率为0.95。

具体程序参考项目:

https://github.com/zhangcliff/tensorflow-c-mnist.git

1.安装bazel

[plain]  view plain  copy echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list   [plain]  view plain  copy curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -   [plain]  view plain  copy sudo apt-get update   [plain]  view plain  copy sudo apt-get install bazel  

2.tensorflow的下载。

本博文使用的tensorflow版本为1.4,其他版本的c++编译可能会有一些不一样。

[plain]  view plain  copy git clone https://github.com/tensorflow/tensorflow.git  

3.tensorflow的c++编译。

3.1 进入tensorflow文件夹中,首先进行项目配置。

[plain]  view plain  copy ./configure   下面我贴出在我的机器上各选项的选择:值得注意的是,如果我们要使用cuda和cudnn的话,一定要搞清楚自己机器上使用的cuda和cudnn的版本(尤其是cudnn),例如我使用的是cuda8.0和cudnn6.0.21。

3.2 使用bazel命令进行编译。编译的时间比较长,我在i3-4150cpu上编译了一个小时左右的时间。

[plain]  view plain  copy bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so   如果没有显卡则使用如下命令进行编译

[plain]  view plain  copy bazel build --config=opt //tensorflow:libtensorflow_cc.so  

编译完成后,在bazel-bin/tensorflow中会生成两个我们需要的库文件:libtensorflow_cc.so 和 libtensorflow_framework.so。

在后面我们用C++调用tensorflow时需要链接这两个库文件。

4. 使用tensorflow C++ api调用图模型(.pb文件)。

tensorflow 编译好之后,我们使用tensorflow c++ api调用一个已经冻结的图模型(.pb文件)

具体程序参考项目:

https://github.com/zhangcliff/tensorflow-c-mnist.git

4.1 在python环境下生成一个图模型(.pb文件)

对于tensorflow,在Python环境下的使用是最方便的,tensorflow的python api也是最多最全面的。因此我们在python环境下,训练了一个深度神经网络模型,并将模型和参数都冻结在一个pb文件中。为后面使用C++ API调用这个pb文件做好准备。我们以经典的mnist为例。

数据处理与模型的训练,这里就不多说了(默认读者对python环境下tensorflow的使用已经比较熟悉)。这里要说的是pb文件的生成,使用一下代码:

[python]  view plain  copy from tensorflow.python.framework.graph_util import convert_variables_to_constants  graph = convert_variables_to_constants(sess, sess.graph_def, ["softmax"])  tf.train.write_graph(graph,'models','model.pb',as_text=False)   其中,convert_variables_to_constants()函数将参数变量冻结在图模型中,其中第三个参数为网络输出tensor的名字(name)。因为我的网络输出是这样定义的:y_conv = tf.nn.softmax(logits,name='softmax'),所以我的第三个参数设置为['softmax']。

write_graph()函数生成.pb文件,第二个参数为生成pb文件的文件夹,第三个参数为pb文件的名字。

将上面三行代码加入到你的模型训练的python脚步中,最后便可以得到我们需要的pb文件。

4.2 c++环境下调用pb文件。

第一步,加载模型

[cpp]  view plain  copy Session* session;  Status status = NewSession(SessionOptions(), &session);//创建新会话Session      string model_path="model.pb";  GraphDef graphdef; //Graph Definition for current model      Status status_load = ReadBinaryProto(Env::Default(), model_path, &graphdef); //从pb文件中读取图模型;  if (!status_load.ok()) {      std::cout 


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有