199

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

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

4

12 回答 12

55

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

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

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

于 2015-11-10T03:41:23.363 回答
30

为了添加到 @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

建造:

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

于 2015-11-20T18:20:09.600 回答
19

如果您正在考虑在独立包上使用 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 版的路径(您可能需要检查您的版本中是否有任何更改)。

这个链接也帮助我找到了所有这些信息:链接

于 2018-04-11T01:02:14.067 回答
17

首先,在安装protobufand之后eigen,你想构建 Tensorflow:

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

然后将以下包含头文件和动态共享库复制到/usr/local/liband /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
于 2017-05-11T15:55:48.127 回答
14

如果您希望避免使用 Bazel 构建项目并生成大型二进制文件,我已经组装了一个存储库,用于指导使用 TensorFlow C++ 库和 CMake。你可以在这里找到它。大致思路如下:

  • 克隆 TensorFlow 存储库。
  • 添加构建规则tensorflow/BUILD(提供的规则不包括所有 C++ 功能)。
  • 构建 TensorFlow 共享库。
  • 安装特定版本的 Eigen 和 Protobuf,或将它们添加为外部依赖项。
  • 配置您的 CMake 项目以使用 TensorFlow 库。
于 2016-08-04T16:15:16.637 回答
11

我发现使用 Tensorflow C++ API 的一种替代方法是使用cppflow

它是围绕Tensorflow C API的轻量级 C++ 包装器。你得到非常小的可执行文件,它链接到libtensorflow.so已经编译的文件。还有一些使用示例,您使用 CMAKE 而不是 Bazel。

于 2020-06-07T12:36:42.607 回答
10

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

于 2017-06-19T08:53:21.027 回答
8

您可以使用此 ShellScript 安装(大部分)它的依赖项、克隆、构建、编译并将所有必要的文件放入../src/includes文件夹:

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

于 2015-11-26T05:31:20.413 回答
7

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

于 2018-05-05T21:56:54.510 回答
5

我使用 hack/workaround 来避免自己构建整个 TF 库(这样可以节省时间(在 3 分钟内设置完毕)、磁盘空间、安装开发依赖项以及生成的二进制文件的大小)。它不受官方支持,但如果您只想快速加入,效果很好。

通过 pip (pip install tensorflowpip install tensorflow-gpu) 安装 TF。然后找到它的库_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++ 功能。

于 2017-04-26T09:05:35.240 回答
3

上面的答案足以说明如何构建库,但如何收集标题仍然很棘手。在这里,我分享我用来复制必要标题的小脚本。

SOURCE是第一个参数,它是 tensorflow 源(构建)直接;
DST是第二个参数,它是include directory保存收集的标题。(例如,在 cmake 中,include_directories(./collected_headers_here))。

#!/bin/bash

SOURCE=$1
DST=$2
echo "-- target dir is $DST"
echo "-- source dir is $SOURCE"

if [[ -e $DST ]];then
    echo "clean $DST"
    rm -rf $DST
    mkdir $DST
fi


# 1. copy the source code c++ api needs
mkdir -p $DST/tensorflow
cp -r $SOURCE/tensorflow/core $DST/tensorflow
cp -r $SOURCE/tensorflow/cc $DST/tensorflow
cp -r $SOURCE/tensorflow/c $DST/tensorflow

# 2. copy the generated code, put them back to
# the right directories along side the source code
if [[ -e $SOURCE/bazel-genfiles/tensorflow ]];then
    prefix="$SOURCE/bazel-genfiles/tensorflow"
    from=$(expr $(echo -n $prefix | wc -m) + 1)

    # eg. compiled protobuf files
    find $SOURCE/bazel-genfiles/tensorflow -type f | while read line;do
        #echo "procese file --> $line"
        line_len=$(echo -n $line | wc -m)
        filename=$(echo $line | rev | cut -d'/' -f1 | rev )
        filename_len=$(echo -n $filename | wc -m)
        to=$(expr $line_len - $filename_len)

        target_dir=$(echo $line | cut -c$from-$to)
        #echo "[$filename] copy $line $DST/tensorflow/$target_dir"
        cp $line $DST/tensorflow/$target_dir
    done
fi


# 3. copy third party files. Why?
# In the tf source code, you can see #include "third_party/...", so you need it
cp -r $SOURCE/third_party $DST

# 4. these headers are enough for me now.
# if your compiler complains missing headers, maybe you can find it in bazel-tensorflow/external
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/Eigen $DST
cp -RLf $SOURCE/bazel-tensorflow/external/eigen_archive/unsupported $DST
cp -RLf $SOURCE/bazel-tensorflow/external/protobuf_archive/src/google $DST
cp -RLf $SOURCE/bazel-tensorflow/external/com_google_absl/absl $DST
于 2019-04-10T12:37:59.993 回答
2

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

于 2019-02-14T07:57:51.513 回答