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

是否有更有经验的人可以通过发现和分享使用tensorflow的c++ API的指南来帮助您?


当前回答

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

SOURCE是第一个参数,它是tensorflow SOURCE (build) direcoty; DST是第二个参数,包含目录保存收集的头文件。(如。在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

其他回答

你可以使用这个ShellScript来安装(大多数)它的依赖,克隆,构建,编译和得到所有必要的文件到../ src /包括文件夹:

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

我发现使用Tensorflow c++ API的一个替代方案是使用cppflow。

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

如果你想在一个独立的包上使用Tensorflow c++ api,你可能需要tensorflow_cc。还有一个c api版本的tensorflow。所以)构建c++版本,你可以使用:

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

注1:如果你想添加intrinsic支持,你可以添加这样的标志:——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的路径(您可能需要检查您的版本中是否有任何更改)。

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

首先,在安装了protobuf和eigen之后,你想要构建Tensorflow:

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

然后复制以下include头文件和动态共享库到/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

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