Ubuntu16.04下C++编译Tensorflow以及API使用

参考文章:
https://blog.csdn.net/qq_29462849/article/details/84986592
https://blog.csdn.net/qq_25109263/article/details/81285952
https://blog.csdn.net/zwx1995zwx/article/details/79064064

文章简介:

我们一般使用python来训练模型,但是由于项目系统是基于C++的,这个时候就要进行转换了。

虽然Tensorfflow提供了C++的API接口,但还是需要编译。

这篇文章是基于python2.7的Ubuntu16.04系统,编译了不带GPU的tensorflow的C++ API接口。

如果你需要更多内容,请点击参考文献或者自行搜索文档进行编译。

注意情况:

使用内存比较大的Ubuntu系统,建议4G以上。

编译时严格考虑各种安装包的版本,建议参考本文描述。

文件运行失败时考虑文件权限,建议如果失败则给全部权限。

全部流程就算不出错也需要四个小时,请耐心。

编译流程:

编译 Protobuf 3.5.0

编译 Eigen 3.3.4

扫描二维码关注公众号,回复: 11545328 查看本文章

安装 Bazel 0.10.1

编译 Tensorflow

编译 downloads、gen

拷贝 文件夹及动态链接库

测试 Tensorflow的C++工程

编译 Protobuf 3.5.0

它的版本与tensorflow的版本密切相关,它的版本错了就无法work。
我用的3.5.0版本,下载protobuf-cpp-3.5.0.tar.gz的网址为:

wget https://github.com/google/protobuf/releases

解压protobuf-cpp-3.5.0.tar.gz文件:

tar -zxvf protobuf-cpp-3.5.0.tar.gz

如果没有安装cmake,则:

sudo apt-get install cmake

编译安装,可能需要半个小时:

cd prtobuf-3.5.0
sudo ./configure
sudo make -j8
sudo make check -j8
sudo make install
sudo ldconfig

编译 Eigen 3.3.4

这是一个C++端的矩阵运算库,这个库只要下载压缩包,解压到某个路径下即可。
我下载的版本是下载3.3.4,eigen压缩包下载网址为:

wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2

解压eigen-eigen-2355b229ea4c.tar.gz文件:

tar -zxvf eigen-eigen-2355b229ea4c.tar.gz

重新命名为eigen3,放到某个路径下,安装就好:

cd eigen3
sudo mkdir build  
cd build  
sudo cmake ..  
sudo make  
sudo make install

安装 Bazel 0.10.1

bazel版本不能过高,否则会报错,我的是bazel 0.10.1。
我下载的是bazel-0.10.1-installer-linux-x86_64.sh,网址为:

wget https://github.com/bazelbuild/bazel/releases

然后执行安装:

sudo ./bazel-0.10.1-installer-linux-x86_64.sh

编译 Tensorflow

先下载tensorflow源码:

git clone https://github.com/tensorflow/tensorflow.git

进入tensorflow文件夹:

cd tensorflow

切换到1.7版本:

sudo git checkout r1.7

执行configure:

sudo ./configure

安装命令建议如下:

python位置选用默认路径(回车即可),jemalloc输入y并回车,其余选择n并回车。

用bazel去编译:

sudo bazel build --config=opt  --config=monolithic //tensorflow:libtensorflow_cc.so

大约两个小时后,显示如下类似信息即为成功:

INFO: Elapsed time: 4992.883s, Critical Path: 474.02s
INFO: Build completed successfully, 3257 total actions

编译 downloads、gen

由于网络的原因,可能有两个文件夹没有下载,文件夹如下:

downloads 、 gen

在生成downloads文件夹时或许会报这个错:

curl: 未找到命令 gzip: stdin: unexpected end of file

建议先安装一下curl包:

sudo apt-get install curl

下载编译downloads,执行完毕后会出现downloads文件夹:

sudo ./tensorflow/contrib/makefile/download_dependencies.sh

在生成gen文件夹时或许会报这个错:

./tensorflow/core/lib/io/zlib_outputbuffer.h:19:18: fatal error: zlib.h: 没有那个文件或目录

建议先安装一下zlib包:

sudo apt-get install zlib1g.dev

进入tensorflow/contrib/makefile,下载编译gen,执行完毕后会出现gen文件夹:

cd tensorflow/contrib/makefile
sudo ./build_all_linux.sh

拷贝 文件夹及动态链接库

注意,拷贝要在tensorflow文件夹下,记得执行完上一步要返回:

cd ..
cd ..

再把必要.h头文件以及编译出来.so的动态链接库文件复制到指定的一些路径下:

sudo mkdir /usr/local/include/tf
sudo cp -r bazel-genfiles/ /usr/local/include/tf/
sudo cp -r tensorflow /usr/local/include/tf/
sudo cp -r third_party /usr/local/include/tf/
sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
sudo cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib

测试 Tensorflow的C++工程

具体程序参考项目:

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

注意删去tf.cpp最后一行的:

# tensorflow-c-mnist

将刚才编译tensorflow 时产生的两个库文件放入lib中:

库文件:libtensorflow_cc.so、libtensorflow_framework.so
路径为:home/zhangru/tensorflow/bazel-bin/

确认一下Cmakelist.txt文件:

cmake_minimum_required (VERSION 2.8.8)
project (tf_example)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")

link_directories(./lib)
include_directories(
   /home/zhangru/tensorflow
   /home/zhangru/tensorflow/bazel-genfiles
   /home/zhangru/tensorflow/tensorflow/contrib/makefile/downloads/nsync/public
   /home/zhangru/tensorflow/bazel-bin/tensorflow
   /home/zhangru/tensorflow/tensorflow/contrib/makefile/gen/protobuf/include
   /usr/local/include/eigen3
   ) 
add_executable(tf_test  tf.cpp) 
target_link_libraries(tf_test tensorflow_cc tensorflow_framework)

进入build文件夹开始编译:

cd build
sudo cmake ..
sudo make

在build文件夹中测试一下:

sudo ./tf_test digit.jpg

如果出现类似以下信息即为正确:

Class 0 prob:o.000222603,
Class 1 prob:0.951202 ,
Class 2 prob:0.00674965,
Class 3 prob:0.00721129 ,
Class 4prob:0.0029518,
Class 5 prob:0.0100965 ,
Class 6 prob:0.0119467 ,
Class 7 prob:0.00218654,
Class 8prob:o.00189468 ,
Class 9 prob:0.00553808 ,
Final class id: 1
Final class prob: 0.951202

程序移植

经测试,需要将已经编译完成的以下文件夹拷贝到对应目录即可:

home/zhangru/tesorflow ..
usr/local/include/eigen3 ..
usr/local/include/google..

这里给出几个解压命令:

unzip archive_name.zip                     zip解压到当前目录
tar -xvf archive_name.tar                  tar解压到当前目录
tar -zxvf archive_name.tar.gz              tar.gz解压到当前目录

还需注意,直接粘贴到usr/local/include可能不被允许,可以现在home/zhangru下解压完毕再进行拷贝。
打开usr/local/include文件夹权限的命令行代码为:

sudo nautilus

值得一提的是,如果你使用上述“测试”中的代码,请别忘记改写cmakelist.txt和tf.cpp,此外还需要安装cmake:

sudo apt-get install cmake

当然,如果你这样修改cmakelist.txt文件,则可以将需要的文件夹直接放在当前工作目录下:

cmake_minimum_required (VERSION 2.8.8)
project (tf_example) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
link_directories(./lib)

include_directories(
   .
   ./eigen3
   ./tensorflow
   ./tensorflow/bazel-genfiles
   ./tensorflow/bazel-bin/tensorflow
   ./tensorflow/tensorflow/contrib/makefile/downloads/nsync/public
   ./tensorflow/tensorflow/contrib/makefile/gen/protobuf/include
   ) 
add_executable(tf_test  tf.cpp) 
target_link_libraries(tf_test tensorflow_cc tensorflow_framework)

最后总结

编译完成,鼓掌庆贺!

猜你喜欢

转载自blog.csdn.net/qq_30534935/article/details/96023523