我真的很渴望开始使用谷歌在c++中的新Tensorflow库。网站和文档在如何构建项目的c++ API方面真的不清楚,我不知道从哪里开始。
是否有更有经验的人可以通过发现和分享使用tensorflow的c++ API的指南来帮助您?
我真的很渴望开始使用谷歌在c++中的新Tensorflow库。网站和文档在如何构建项目的c++ API方面真的不清楚,我不知道从哪里开始。
是否有更有经验的人可以通过发现和分享使用tensorflow的c++ API的指南来帮助您?
当前回答
Tensorflow本身只提供了关于c++ api的非常基本的示例。 这是一个很好的资源,包括数据集的例子,rnn, lstm, cnn等 Tensorflow c++的例子
其他回答
如果你不想自己构建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项目的开发者。
我使用了一种hack/workaround来避免自己构建整个TF库(这节省了时间(3分钟即可完成设置)、磁盘空间、安装开发依赖项以及生成二进制文件的大小)。它是官方不支持的,但如果你只是想快速上手,效果很好。
Install TF through pip (pip install tensorflow or pip install tensorflow-gpu). Then find its library _pywrap_tensorflow.so (TF 0.* - 1.0) or _pywrap_tensorflow_internal.so (TF 1.1+). In my case (Ubuntu) it's located at /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so. Then create a symlink to this library called lib_pywrap_tensorflow.so somewhere where your build system finds it (e.g. /usr/lib/local). The prefix lib is important! You can also give it another lib*.so name - if you call it libtensorflow.so, you may get better compatibility with other programs written to work with 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,所以你可能会在奇怪的链接时间或运行时问题中运行。但是我能够加载存储的图形,恢复权重并运行推理,这是我在c++中最想要的功能。
上面的答案足以说明如何构建库,但是如何收集头文件仍然很棘手。在这里我分享我用来复制必要的头文件的小脚本。
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
我们现在在https://github.com/ika-rwth-aachen/libtensorflow_cc上提供了一个预构建的库和Docker镜像,方便TensorFlow c++ API的安装和使用
我们提供了预构建的libtensorflow_cc。因此,将附带的头文件作为一个命令安装deb-package。 我们提供了一个基于官方TensorFlow Docker镜像的预构建Docker镜像。我们的Docker镜像同时安装了TensorFlow Python和TensorFlow c++。
通过运行示例应用程序自己尝试一下:
git clone https://github.com/ika-rwth-aachen/libtensorflow_cc.git && \
cd libtensorflow_cc && \
docker run --rm \
--volume $(pwd)/example:/example \
--workdir /example \
rwthika/tensorflow-cc:latest \
./build-and-run.sh
虽然我们目前只支持运行Ubuntu的x86_64机器,但将来可以很容易地扩展到其他操作系统和平台。除了一些例外,TensorFlow从2.0.0到2.9.2的所有版本都可用,2.10.0即将推出。
如果你想使用TensorFlow c++ API在c++中加载、检查和运行保存的模型和冻结的图形,我们建议你也检查我们的帮助库tensorflow_cpp。
如果你希望避免使用Bazel构建项目和生成大型二进制文件,我已经组装了一个库,指导使用CMake TensorFlow c++库。你可以在这里找到它。总体思路如下:
克隆TensorFlow存储库。 在tensorflow/ build中添加一个构建规则(提供的规则不包括所有c++功能)。 构建TensorFlow共享库。 安装特定版本的Eigen和Protobuf,或将它们作为外部依赖项添加。 配置你的CMake项目来使用TensorFlow库。