Я действительно хочу начать использовать новую библиотеку Google Tensorflow на C ++. Веб-сайт и документы просто неясны с точки зрения того, как создать C ++ API проекта, и я не знаю, с чего начать.
Может ли кто-то с большим опытом помочь найти и поделиться руководством по использованию C ++ API tenorflow?
Чтобы начать, вы должны скачать исходный код с Github, следуя инструкциям здесь (тебе понадобиться Базэл и недавняя версия GCC).
C ++ API (и серверная часть системы) находится в tensorflow/core
, Прямо сейчас только Сеансовый интерфейс C ++, и C API поддерживаются. Вы можете использовать любой из них для выполнения графиков TensorFlow, которые были построены с использованием API-интерфейса Python и сериализованы в GraphDef
буфер протокола. Существует также экспериментальная функция для построения графиков в C ++, но в настоящее время она не настолько полнофункциональна, как Python API (например, в настоящее время нет поддержки автоматического дифференцирования). Вы можете увидеть пример программы, которая строит небольшой граф на C ++ здесь.
Вторая часть API C ++ — это API для добавления нового OpKernel
, который является классом, содержащим реализации числовых ядер для CPU и GPU. Есть множество примеров того, как их построить в tensorflow/core/kernels
, также как и учебник для добавления нового оп в C ++.
Чтобы добавить к сообщению @ mrry, я собрал учебник, в котором объясняется, как загрузить граф TensorFlow с помощью API C ++. Это очень минимально и должно помочь вам понять, как все части сочетаются друг с другом. Вот мясо этого:
Требования:
Структура папки:
tensorflow/tensorflow/|project name|/
tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
tensorflow/tensorflow/|project name|/BUILD
BUILD:
cc_binary(
name = "<project name>",
srcs = ["<project name>.cc"],
deps = [
"//tensorflow/core:tensorflow",
]
)
Два предостережения, для которых есть, вероятно, обходные пути:
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
Если вы хотите избежать как создания своих проектов с помощью Bazel, так и генерации большого двоичного файла, я собрал репозиторий, инструктирующий об использовании библиотеки TensorFlow C ++ с CMake. Вы можете найти это Вот. Общие идеи заключаются в следующем:
tensorflow/BUILD
(предоставленные не включают в себя все функциональные возможности C ++).Сначала после установки protobuf
а также eigen
Вы хотели бы построить 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
Вы можете использовать этот ShellScript для установки (большей части) его зависимостей, клонирования, сборки, компиляции и получения всех необходимых файлов в ../src/includes
папка:
https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
Если вы планируете использовать Tensorflow c ++ api в автономном пакете, вам, вероятно, понадобится tenorflow_cc.so (есть также версия c api tenorflow.so) для сборки версии c ++, которую вы можете использовать:
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.
Дополнительное примечание: Пути относительно версии тензорного потока 1.5 (возможно, вам потребуется проверить, изменилось ли что-нибудь в вашей версии).
Также эта ссылка очень помогла мне найти всю эту информацию: ссылка на сайт
Если вы не хотите собирать Tensorflow самостоятельно, а ваша операционная система — Debian или Ubuntu, вы можете загрузить готовые пакеты с библиотеками Tensorflow C / C ++. Этот дистрибутив можно использовать для вывода C / C ++ с процессором, поддержка GPU не включена:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
Есть инструкции, как заморозить контрольную точку в Tensorflow (TFLearn) и загрузить эту модель для вывода с помощью API C / C ++:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
Осторожно: я разработчик этого проекта на Github.
Я использую хак / обходной путь, чтобы избежать необходимости создавать всю библиотеку TF самостоятельно (что экономит время (настраивается за 3 минуты), дисковое пространство, установку зависимостей dev и размер получаемого двоичного файла). Это официально не поддерживается, но работает хорошо, если вы просто хотите быстро подключиться.
Установить TF через пипс (pip install tensorflow
или же pip 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 ++.