如何构build和使用Google TensorFlow C ++ api

我真的很想开始在C ++中使用Google的新Tensorflow库。 网站和文档只是不清楚如何build立项目的C + + API,我不知道从哪里开始。

有更多经验的人可以通过发现和共享使用tensorflow的C ++ API的指导来帮助吗?

要开始,你应该从Github下载源代码, 按照这里的指示 (你需要Bazel和最新版本的GCC)。

C ++ API(和系统的后端)在tensorflow/core 。 目前,只支持C ++ Session接口和C API 。 您可以使用其中任何一个来执行使用Python API构build的TensorFlowgraphics,并将其序列化为GraphDef协议缓冲区。 C ++中还有一个用于构buildgraphics的实验性function,但是目前这种function不如Python API那么全function(例如,目前不支持自动分化)。 你可以在这里看到一个用C ++build立一个小图的例子程序。

C ++ API的第二部分是用于添加新的OpKernel的API,该OpKernel是包含用于CPU和GPU的数字内核的实现的类。 有很多关于如何在tensorflow/core/kernels构build这些tensorflow/core/kernels例子,以及在C ++中添加一个新操作的教程 。

要添加到@ mrry的文章,我将编写一个教程,介绍如何使用C ++ API加载TensorFlow图表。 这是非常小的,应该帮助你理解所有的部分如何组合在一起。 这是它的肉:

要求:

  • Bazel安装
  • 克隆TensorFlow回购

文件夹结构:

  • tensorflow/tensorflow/|project name|/
  • tensorflow/tensorflow/|project name|/|project name|.cc (eg https://gist.github.com/jimfleming/4202e529042c401b17b7)
  • tensorflow/tensorflow/|project name|/BUILD

build立:

 cc_binary( name = "<project name>", srcs = ["<project name>.cc"], deps = [ "//tensorflow/core:tensorflow", ] ) 

两个警告可能是解决方法:

  • 现在, TensorFlow回购中需要进行构build。
  • 编译后的二进制文件很大(103MB)。

https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f

如果您希望避免使用Bazel构build项目并生成大的二进制文件,我已经组装了一个存储库,指示使用CMake的TensorFlow C ++库。 你可以在这里find它。 总体思路如下:

  • 克隆TensorFlow存储库。
  • 将构build规则添加到tensorflow/BUILD (所提供的不包括所有C ++function)。
  • build立TensorFlow共享库。
  • 安装Eigen和Protobuf的特定版本,或将它们添加为外部依赖项。
  • configuration您的CMake项目使用TensorFlow库。

你可以使用这个ShellScript来安装(大部分)它的依赖关系,克隆,构build,编译和获取所有必要的文件到../src/includes文件夹中:

https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh

首先,在安装protobufeigen ,你想build立Tensorflow:

 ./configure bazel build //tensorflow:libtensorflow_cc.so 

然后将以下包含头文件和dynamic共享库复制到/usr/local/lib/usr/local/include

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

最后,用一个例子来编译:

 g++ -std=c++11 -o tf_example \ -I/usr/local/include/tf \ -I/usr/local/include/eigen3 \ -g -Wall -D_DEBUG -Wshadow -Wno-sign-compare -w \ -L/usr/local/lib/libtensorflow_cc \ `pkg-config --cflags --libs protobuf` -ltensorflow_cc tf_example.cpp 

我使用黑客/解决方法来避免自己构build整个TF库(同时节省时间(3分钟内设置),磁盘空间,安装dev依赖项和生成的二进制文件的大小)。 它的官方不受支持,但如果你只是想快速跳入,

通过pip安装TF( pip install tensorflowpip install tensorflow-gpu )。 然后find它的库_pywrap_tensorflow.so (TF 0. * – 1.0)或_pywrap_tensorflow_internal.so (TF 1.1+)。 在我的情况下(Ubuntu)它位于/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so 。 然后创build一个符号链接到这个名为lib_pywrap_tensorflow.so库中,在这个库中你的lib_pywrap_tensorflow.so系统find它(例如/usr/lib/local )。 前缀lib很重要! 你也可以给它另外一个lib*.so名字 – 如果你把它libtensorflow.so ,你可能会得到与其他编写与TF一起工作的程序的更好的兼容性。

然后像你习惯的那样创build一个C ++项目(CMake,Make,Bazel,无论你喜欢什么)。

然后你就可以直接链接到这个库,使TF可用于你的项目(你也必须链接到python2.7库)! 在CMake中,例如,只需添加target_link_libraries(target _pywrap_tensorflow python2.7)

C ++头文件位于这个库的周围,例如在/usr/local/lib/python2.7/dist-packages/tensorflow/include/

再一次:这种方式是官方不受支持,你可能会遇到各种问题。 图书馆似乎是静态链接,例如protobuf,所以你可能会运行奇怪的链接时间或运行时问题。 但是我能够加载存储的graphics,恢复权重并运行推理,这是C ++中最需要的function。

如果你不介意使用CMake,还有tensorflow_cc项目,为你build立和安装TF C ++ API,以及你可以链接的方便的CMake目标。 该项目的自述文件包含一个示例和Dockerfiles,你可以轻松地遵循。