谷歌發佈了tensorflow2.0後帶來全新的使用體驗和深度學習實踐模式,這裏基於新版本進行編譯,並使用其C++接口編寫示例。
環境
本文只針對linux系統(windows下嘗試過多次後未成功,放棄)
- ubuntu14.04
- gcc4.8.5
- cmake3.10.2
編譯
目的是編譯出tensorflow的動態鏈接庫以及準備好tensorflow第三方依賴庫
安裝bazel
tensorflow是谷歌官方項目,用的是自家的bazel構建的
官網下載bazel安裝:https://bazel.build
推薦使用sh腳本一鍵安裝
編譯tensorflow動態庫
下載源碼,切換到r2.0分支,編譯
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout -b r2.0 remotes/origin/r2.0
./configure
configure步驟會有很多配置項
其中,python的路徑設置成python3的目錄,其他全部默認值即可
然後通過bazel編譯
如果不需要cuda版,則輸入
bazel build --config=opt //tensorflow:libtensorflow_cc.so
如果需要cuda版,則輸入
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
這個過程需要全程保持聯網(科學上網),會在編譯的過程中聯網下載很多依賴,時間較長,耐心等待
成功後,會在tensorflow根目錄的bazel-bin/tensorflow文件夾下會出現libtensorflow_cc.so以及libtensorflow_framework.so等文件(有些是軟鏈接),建議將其拷貝出來到根目錄的新建的lib目錄,比如
tensorflow/lib
├── libtensorflow_cc.so
├── libtensorflow_cc.so.1
├── libtensorflow_framework.so
└── libtensorflow_framework.so.1
確保這個四個文件一定要有
準備第三方依賴庫
tensorflow需要用到第三方庫文件比如Protobuf以及矩陣庫Eigen等,應該使用官方依賴的對應版本,可以避免tensorflow和第三方庫版本不對應而產生的問題,用tensorflow項目自帶的腳本下載和編譯這些依賴庫
cd tensorflow
cd tensorflow/contrib/makefile
./build_all_linux.sh
同樣的,這個過程需要全程保持聯網(科學上網)
執行成功後,在tensorflow/tensorflow/contrib/makefile會產生兩個文件夾
- downloads存放第三方依賴的一些頭文件和靜態庫,比如nsync、Eigen等
- gen存放tensorflow生成必要的pb頭文件
至此,tensorflow編譯完成,可以使用C++接口編寫程序了
使用
構建C++程序,調用tensorflow庫
工程結構
.
├── CMakeLists.txt
└── src
└── main.cpp
其中
CMakeLists.txt
project(tensorflow_cpp_test)
cmake_minimum_required(VERSION 3.0)
add_definitions(-std=c++11)
set(TENSORFLOW_ROOT_DIR /home/tashaxing/codetest/tensorflow)
# if other headers are needed, add to this include list
include_directories(
${TENSORFLOW_ROOT_DIR}
${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/gen/proto
${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/gen/protobuf/include
${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/downloads/eigen
${TENSORFLOW_ROOT_DIR}/tensorflow/contrib/makefile/downloads/absl
)
aux_source_directory(./src DIR_SRCS)
link_directories(/home/tashaxing/codetest/tensorflow/lib)
add_executable(tensorflow_cpp_test ${DIR_SRCS})
target_link_libraries(tensorflow_cpp_test
tensorflow_cc
tensorflow_framework
)
main.cpp
#include <iostream>
#include "tensorflow/core/public/session.h"
using namespace tensorflow;
int main()
{
Session* session;
Status status = NewSession(SessionOptions(), &session);
if (!status.ok())
{
std::cout << status.ToString() << "\n";
return 1;
}
std::cout << "Session successfully created.\n";
Tensor a(DT_FLOAT, TensorShape()); // input a
a.scalar<float>()() = 3.0;
Tensor b(DT_FLOAT, TensorShape()); // input b
b.scalar<float>()() = 2.0;
return 0;
}
實際上,tensorflow的後端都是C++寫的,那麼用C++的接口直接進行模型訓練和加載預測,在性能上是非常可觀的