Google の新しい Tensorflow ライブラリを C++ で使い始めたいと思っています。Web サイトとドキュメントは、プロジェクトの C++ API を構築する方法に関して非常に不明確であり、どこから始めればよいかわかりません。
tensorflow の C++ API を使用するためのガイドを見つけて共有することで、より経験のある人が助けてくれますか?
Google の新しい Tensorflow ライブラリを C++ で使い始めたいと思っています。Web サイトとドキュメントは、プロジェクトの C++ API を構築する方法に関して非常に不明確であり、どこから始めればよいかわかりません。
tensorflow の C++ API を使用するためのガイドを見つけて共有することで、より経験のある人が助けてくれますか?
スタンドアロン パッケージで Tensorflow c++ api を使用することを検討している場合は、使用できる c++ バージョンをビルドするために、おそらく tensorflow_cc.so (ac api バージョン tensorflow.so もあります) が必要になります。
bazel build -c opt //tensorflow:libtensorflow_cc.so
注 1: 組み込みサポートを追加する場合は、このフラグを次のように追加できます。--copt=-msse4.2 --copt=-mavx
注 2: プロジェクトで OpenCV を使用することも検討している場合は、両方のライブラリを一緒に使用すると問題が発生し (テンソルフローの問題)、使用する必要があります--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/BUILD
ます (提供されているルールには、すべての C++ 機能が含まれているわけではありません)。私が見つけた Tensorflow C++ API を使用する別の方法の 1 つは、cppflowを使用することです。
Tensorflow C APIの軽量な C++ ラッパーです。非常に小さな実行可能ファイルを取得し、libtensorflow.so
既にコンパイルされたファイルにリンクします。使用例もあり、Bazel の代わりに CMAKE を使用しています。
CMake の使用を気にしない場合は、 TF C++ API をビルドしてインストールするtensorflow_ccプロジェクトと、リンクできる便利な CMake ターゲットもあります。プロジェクトの README には、簡単に理解できる例と Dockerfile が含まれています。
この ShellScript を使用して、依存関係の (ほとんどの) インストール、クローン作成、ビルド、コンパイル、必要なすべてのファイルの../src/includes
フォルダーへの取得を行うことができます。
https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
上記の回答は、ライブラリを構築する方法を示すには十分ですが、ヘッダーを収集する方法は依然として注意が必要です。ここでは、必要なヘッダーをコピーするために使用する小さなスクリプトを共有します。
SOURCE
テンソルフローのソース(ビルド)ディレクトリである最初のパラメータです。収集されたヘッダーを保持する
DST
2 番目のパラメーターです。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