Tensorflow1.4 C++ 编译 | 您所在的位置:网站首页 › TensorFlow编译选择protobuf版本 › Tensorflow1.4 C++ 编译 |
摘要: 最近在研究如何使用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 实验室设备网 版权所有 |