C API(以及系统的后端)位于 tensorflow/core 中 . 现在,只支持C++ Session interface和C API . 您可以使用其中任何一个来执行使用Python API构建并序列化为 GraphDef 协议缓冲区的TensorFlow图 . 还有一个用于在C中构建图形的实验性功能,但这目前还不像Python API那样功能齐全(例如目前不支持自动差异化) . 您可以看到builds a small graph in C++ here的示例程序 .
tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so (unused if you build with --config=monolithic)
tensorflow/bazel-bin/tensorflow/libtensorflow_cc.so
9 回答
首先,您应该从following the instructions here下载Github的源代码(您需要Bazel和最新版本的GCC) .
C API(以及系统的后端)位于
tensorflow/core
中 . 现在,只支持C++ Session interface和C API . 您可以使用其中任何一个来执行使用Python API构建并序列化为GraphDef
协议缓冲区的TensorFlow图 . 还有一个用于在C中构建图形的实验性功能,但这目前还不像Python API那样功能齐全(例如目前不支持自动差异化) . 您可以看到builds a small graph in C++ here的示例程序 .C API的第二部分是用于添加新
OpKernel
的API,它是包含CPU和GPU的数值内核实现的类 . 有许多如何在tensorflow/core/kernels
中构建这些的示例,以及tutorial for adding a new op in C++ .要添加到@ mrry的帖子,我整理了一个教程,解释了如何使用C API加载TensorFlow图 . 它非常小,应该可以帮助您了解所有部件是如何组合在一起的 . 这是它的核心:
要求:
Bazel已安装
克隆TensorFlow回购
文件夹结构:
tensorflow/tensorflow/|project name|/
tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
tensorflow/tensorflow/|project name|/BUILD
Build :
两个警告可能有解决方法:
现在,需要在TensorFlow仓库中进行构建 .
编译的二进制文件很大(103MB) .
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
如果您希望避免使用Bazel构建项目并生成大型二进制文件,我已经组装了一个存储库,指示使用TakeorFlow C库和CMake . 你可以找到here . 一般的想法如下:
克隆TensorFlow存储库 .
将构建规则添加到
tensorflow/BUILD
(提供的规则不包括所有C功能) .构建TensorFlow共享库 .
安装特定版本的Eigen和Protobuf,或将它们添加为外部依赖项 .
配置CMake项目以使用TensorFlow库 .
首先,在安装
protobuf
和eigen
之后,你想构建Tensorflow:然后将以下包含标头和动态共享库复制到
/usr/local/lib
和/usr/local/include
:最后,使用示例编译:
您可以使用此ShellScript安装(大多数)它的依赖项,克隆,构建,编译并将所有必需的文件存入
../src/includes
文件夹:https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
如果您考虑在独立包上使用Tensorflow c api,您可能需要tensorflow_cc.so(还有一个c api版本tensorflow.so)来构建您可以使用的c版本:
注意1:如果要添加内在支持,可以将此标志添加为:
--copt=-msse4.2 --copt=-mavx
注意2:如果您正考虑在项目中使用OpenCV,则在同时使用两个库时会出现问题(tensorflow issue),您应该使用
--config=monolithic
.构建库后,您需要将其添加到项目中 . 为此,您可以包含以下路径:
并将库链接到您的项目:
在构建项目时,您还应该向编译器指定您将使用c 11标准 .
侧注:相对于tensorflow版本1.5的路径(您可能需要检查您的版本中是否有任何更改) .
此链接也帮助我找到了所有这些信息:link
如果您不想自己构建Tensorflow并且您的操作系统是Debian或Ubuntu,则可以使用Tensorflow C / C库下载预构建的软件包 . 此分发可用于CPU的C / C推理,不包括GPU支持:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
有关于如何在Tensorflow(TFLearn)中冻结检查点并加载此模型以便使用C / C API进行推断的说明:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
注意:我是这个Github项目的开发者 .
我使用黑客/解决方法来避免必须自己构建整个TF库(这节省了时间(它在3分钟内设置),磁盘空间,安装dev依赖项,以及生成的二进制文件的大小) . 它是官方不受支持的,但如果您只想快速进入,效果会很好 .
通过pip安装TF(
pip install tensorflow
或pip install tensorflow-gpu
) . 然后找到它的库_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
. 然后在您的构建系统找到它的地方创建一个名为lib_pywrap_tensorflow.so
的库的符号链接(例如/usr/lib/local
) . 前缀lib
很重要!您也可以给它另一个lib*.so
名称 - 如果您将其命名为libtensorflow.so
,您可以更好地兼容其他与TF一起编写的程序 .然后像你习惯的那样创建一个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,因此您可能会遇到奇怪的链接时间或运行时问题 . 但我能够加载存储的图形,恢复权重和运行推理,这是IMO中C最需要的功能 .
如果您不介意使用CMake,还有tensorflow_cc项目可以为您构建和安装TF C API,以及您可以链接的方便的CMake目标 . 项目自述文件包含一个示例和您可以轻松遵循的Dockerfiles .