Estoy realmente ansioso por comenzar a usar la nueva biblioteca de Tensorflow de Google en C ++. El sitio web y los documentos no son claros en términos de cómo construir la API C ++ del proyecto y no sé por dónde empezar.
¿Puede alguien con más experiencia ayudar descubriendo y compartiendo una guía para usar la API C ++ de tensorflow?
c++
tensorflow
theideasmith
fuente
fuente
Respuestas:
Una alternativa al uso de Tensorflow C ++ API que encontré es usar cppflow .
Es un contenedor ligero de C ++ alrededor de Tensorflow C API . Obtiene ejecutables muy pequeños y se vincula con el
libtensorflow.so
archivo ya compilado. También hay ejemplos de uso y usa CMAKE en lugar de Bazel.fuente
Para comenzar, debe descargar el código fuente de Github, siguiendo las instrucciones aquí (necesitará Bazel y una versión reciente de GCC).
La API de C ++ (y el back-end del sistema) está en
tensorflow/core
. En este momento, solo se admite la interfaz de sesión de C ++ y la API de C ++ . Puede usar cualquiera de estos para ejecutar gráficos de TensorFlow que se han creado utilizando la API de Python y serializados en unGraphDef
búfer de protocolo. También hay una característica experimental para construir gráficos en C ++, pero actualmente no tiene todas las funciones como la API de Python (por ejemplo, no hay soporte para la diferenciación automática en este momento). Puede ver un programa de ejemplo que crea un pequeño gráfico en C ++ aquí .La segunda parte de la API de C ++ es la API para agregar una nueva
OpKernel
, que es la clase que contiene implementaciones de núcleos numéricos para CPU y GPU. Existen numerosos ejemplos de cómo construirlostensorflow/core/kernels
, así como un tutorial para agregar una nueva operación en C ++ .fuente
Para agregar a la publicación de @ mrry, preparé un tutorial que explica cómo cargar un gráfico TensorFlow con la API de C ++. Es muy mínimo y debería ayudarlo a comprender cómo encajan todas las piezas. Aquí está la carne:
Requisitos:
Estructura de carpetas:
tensorflow/tensorflow/|project name|/
tensorflow/tensorflow/|project name|/|project name|.cc (e.g. https://gist.github.com/jimfleming/4202e529042c401b17b7)
tensorflow/tensorflow/|project name|/BUILD
CONSTRUIR:
Dos advertencias para las cuales probablemente hay soluciones:
https://medium.com/@jimfleming/loading-a-tensorflow-graph-with-the-c-api-4caaff88463f
fuente
./loader
consigo un error:Not found: models/train.pb
.Si desea evitar construir sus proyectos con Bazel y generar un binario grande, he reunido un repositorio que indica el uso de la biblioteca TensorFlow C ++ con CMake. Lo puedes encontrar aquí . Las ideas generales son las siguientes:
tensorflow/BUILD
(las proporcionadas no incluyen toda la funcionalidad de C ++).fuente
Primero, después de instalar
protobuf
yeigen
, te gustaría construir Tensorflow:Luego, copie los siguientes encabezados y biblioteca compartida dinámica en
/usr/local/lib
y/usr/local/include
:Por último, compile usando un ejemplo:
fuente
Si está pensando en usar la API de Tensorflow c ++ en un paquete independiente, probablemente necesitará tensorflow_cc.so (También hay una versión de la API ac tensorflow.so) para construir la versión de c ++ que puede usar:
Nota 1: Si desea agregar soporte intrínseco, puede agregar estos indicadores como:
--copt=-msse4.2 --copt=-mavx
Nota 2: Si también está pensando en usar OpenCV en su proyecto, hay un problema al usar ambas libs juntas ( problema de tensorflow ) y debería usarlo
--config=monolithic
.Después de construir la biblioteca, debe agregarla a su proyecto. Para hacerlo, puede incluir estos caminos:
Y vincule la biblioteca a su proyecto:
Y cuando esté construyendo su proyecto, también debe especificar a su compilador que va a utilizar los estándares de c ++ 11.
Nota al margen: rutas relativas a la versión 1.5 de tensorflow (es posible que deba verificar si en su versión algo cambió).
También este enlace me ayudó mucho a encontrar toda esta información: enlace
fuente
tensorflow/bazel-tensorflow/external/com_google_absl
Puede usar este ShellScript para instalar (la mayoría) de sus dependencias, clonar, compilar, compilar y obtener todos los archivos necesarios en la
../src/includes
carpeta:https://github.com/node-tensorflow/node-tensorflow/blob/master/tools/install.sh
fuente
Si no le importa usar CMake, también hay un proyecto tensorflow_cc que construye e instala la API TF C ++ para usted, junto con objetivos convenientes de CMake con los que puede vincularse. El proyecto README contiene un ejemplo y archivos Docker que puede seguir fácilmente.
fuente
Si no desea construir Tensorflow usted mismo y su sistema operativo es Debian o Ubuntu, puede descargar paquetes preconstruidos con las bibliotecas Tensorflow C / C ++. Esta distribución se puede usar para la inferencia C / C ++ con CPU, el soporte de GPU no está incluido:
https://github.com/kecsap/tensorflow_cpp_packaging/releases
Hay instrucciones escritas sobre cómo congelar un punto de control en Tensorflow (TFLearn) y cargar este modelo para inferencia con la API C / C ++:
https://github.com/kecsap/tensorflow_cpp_packaging/blob/master/README.md
Cuidado: soy el desarrollador de este proyecto Github.
fuente
Utilizo un truco / solución alternativa para evitar tener que construir toda la biblioteca TF (lo que ahorra tiempo (se configura en 3 minutos), espacio en disco, instalación de dependencias de desarrollo y tamaño del binario resultante). Oficialmente no es compatible, pero funciona bien si solo quieres saltar rápidamente.
Instale TF a través de pip (
pip install tensorflow
opip install tensorflow-gpu
). Luego encuentre su biblioteca_pywrap_tensorflow.so
(TF 0. * - 1.0) o_pywrap_tensorflow_internal.so
(TF 1.1+). En mi caso (Ubuntu) está ubicado en/usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so
. Luego, cree un enlace simbólico a esta biblioteca llamada enlib_pywrap_tensorflow.so
algún lugar donde su sistema de compilación lo encuentre (por ejemplo/usr/lib/local
). ¡El prefijolib
es importante! También puede darle otrolib*.so
nombre: si lo llamalibtensorflow.so
, puede obtener una mejor compatibilidad con otros programas escritos para trabajar con TF.Luego crea un proyecto C ++ como estás acostumbrado (CMake, Make, Bazel, lo que quieras).
¡Y luego está listo para vincular contra esta biblioteca para tener TF disponible para sus proyectos (y también debe vincular contra
python2.7
bibliotecas)! En CMake, por ejemplo, solo agregatarget_link_libraries(target _pywrap_tensorflow python2.7)
.Los archivos de encabezado de C ++ se encuentran alrededor de esta biblioteca, por ejemplo, en
/usr/local/lib/python2.7/dist-packages/tensorflow/include/
.Una vez más: de esta manera no se admite oficialmente y puede ejecutar varios problemas. La biblioteca parece estar estáticamente vinculada, por ejemplo, a protobuf, por lo que puede ejecutar problemas de tiempo de enlace o de tiempo de ejecución impares. Pero puedo cargar un gráfico almacenado, restaurar los pesos y ejecutar la inferencia, que es IMO la funcionalidad más deseada en C ++.
fuente
undefined reference to 'PyType_IsSubtype'
python2.7
biblioteca ... Editaré la publicación en consecuencia.Tensorflow solo proporciona ejemplos muy básicos sobre las API de C ++.
Aquí hay un buen recurso que incluye ejemplos de conjuntos de datos, rnn, lstm, cnn y más
ejemplos de tensorflow c ++
fuente
las respuestas anteriores son lo suficientemente buenas como para mostrar cómo construir la biblioteca, pero cómo recopilar los encabezados aún es complicado. aquí comparto el pequeño script que uso para copiar los encabezados necesarios.
SOURCE
es el primer parámetro, que es el origen de la fuente de tensorflow (compilación);DST
es el segundo parámetro, queinclude directory
contiene los encabezados recopilados. (por ejemplo, en cmake,include_directories(./collected_headers_here)
).fuente
mkdir -p $DST/tensorflow$target_dir
antescp $line $DST/tensorflow/$target_dir