如何构建和使用Google TensorFlow C ++ API
c++
tensorflow
4
0

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

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

参考资料:
Stack Overflow
收藏
评论
共 10 个回答
高赞 时间 活跃

如果您不介意使用CMake,也可以使用tensorflow_cc项目为您构建和安装TF C ++ API,以及可以链接的便捷CMake目标。项目README包含一个示例和您可以轻松遵循的Dockerfile。

收藏
评论

Tensorflow本身仅提供有关C ++ API的非常基本的示例。
这是一个很好的资源,其中包括rnn,lstm,cnn等数据集的示例
tensorflow C ++示例

收藏
评论

您可以使用此ShellScript来安装(大多数)依赖项,克隆,构建,编译并将所有必需的文件下载到../src/includes文件夹中:

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

收藏
评论

如果您不想自己构建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项目的开发人员。

收藏
评论

要添加到@mrry的帖子中,我整理了一个教程,该教程说明了如何使用C ++ API加载TensorFlow图。它很小,应该可以帮助您了解所有部分如何组合在一起。这是它的实质:

要求:

  • 安装挡板
  • 克隆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

建立:

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

有两个警告,可能有解决方法:

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

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

收藏
评论

如果您想在独立软件包上使用Tensorflow c ++ api,则可能需要tensorflow_cc.so(也有ac api版本tensorflow.so)来构建可以使用的c ++版本:

bazel build -c opt //tensorflow:libtensorflow_cc.so

注意1:如果要添加内部支持,则可以将此标志添加为:-- --copt=-msse4.2 --copt=-mavx

注意2:如果您也考虑在项目上使用OpenCV,则同时使用两个库时会出现问题( tensorflow问题 ),应使用--config=monolithic

构建库后,您需要将其添加到您的项目中。为此,您可以包括以下路径:

tensorflow
tensorflow/bazel-tensorflow/external/eigen_archive
tensorflow/bazel-tensorflow/external/protobuf_archive/src
tensorflow/bazel-genfiles

并将库链接到您的项目:

tensorflow/bazel-bin/tensorflow/libtensorflow_framework.so (unused if you build with --config=monolithic)
tensorflow/bazel-bin/tensorflow/libtensorflow_cc.so

并且在构建项目时,还应向编译器指定要使用c ++ 11标准。

旁注:相对于tensorflow 1.5版的路径(您可能需要检查版本中是否有任何更改)。

此外,此链接还帮助我找到了所有这些信息: 链接

收藏
评论

如果您既希望避免使用Bazel构建项目,又不想生成大型二进制文件,那么我已组装了一个存储库,用于指示CMake使用TensorFlow C ++库。你可以在这里找到它。总体思路如下:

  • 克隆TensorFlow存储库。
  • tensorflow/BUILD添加构建规则(提供的构建规则不包括所有C ++功能)。
  • 构建TensorFlow共享库。
  • 安装Eigen和Protobuf的特定版本,或将它们添加为外部依赖项。
  • 配置您的CMake项目以使用TensorFlow库。
收藏
评论

首先,在安装protobufeigen ,您想构建Tensorflow:

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

然后将以下包含头文件和动态共享库复制到/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
收藏
评论

我使用一种技巧/解决方法来避免自己构建整个TF库(这节省了时间(在3分钟内完成设置),磁盘空间,安装开发依赖项以及生成的二进制文件的大小)。官方不支持此功能,但是如果您只想快速加入,效果很好。

通过pip安装TF( pip install tensorflowpip 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 ++中最需要的功能。

收藏
评论

首先,请按照此处的说明从Github下载源代码(您需要Bazel和最新版本的GCC)。

C ++ API(和系统后端)位于tensorflow/core 。目前,仅支持C ++ Session接口C API 。您可以使用其中任何一个来执行使用Python API构建并序列化到GraphDef协议缓冲区的TensorFlow图。还有一个用于在C ++中构建图形的实验性功能,但是目前它的功能还不如Python API完整(例如,目前不支持自动区分)。您可以在此处看到一个示例程序,该程序在C ++构建一个小图

C ++ API的第二部分是用于添加新OpKernel的API,该类包含用于CPU和GPU的数字内核的实现。关于如何在tensorflow/core/kernels构建它们的例子有很多,还有在C ++中添加新op教程

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号