概述
参考文章:
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
安装 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)
最后总结
编译完成,鼓掌庆贺!
最后
以上就是美好水蜜桃为你收集整理的Ubuntu16.04下C++编译Tensorflow以及API使用的全部内容,希望文章能够帮你解决Ubuntu16.04下C++编译Tensorflow以及API使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复