Как обернуть Tensorflow Cython и разрешить C ++ называть его?

Иногда я хотел бы создать приложение Tensorflow как динамическую связанную библиотеку, чтобы его могли вызывать другие приложения на C ++. Хотя я могу использовать Tensorflow C ++ API для построения графика потока данных, я бы предпочел использовать его Python API, потому что многие общие модели написаны этим.

Ниже приведен один из моих подходов, которые используют Cython для упаковки приложения Tensorflow. Тем не менее, это закончилось ошибкой «tensorflow.pxd not found».

подробность

Во-первых, вот код python:

#File Name: HelloTensorflow.pyx cimport numpy as np cimport tensorflow as tf cdef public float ExecuteTensorFlow(): x = tf.placeholder(tf.float32, [1, 2]) w = tf.constant([0.2, 0.3], tf.float32) b = tf.constant( -0.1, tf.float32) linearModel = tf.matmul(x, tf.reshape(w, shape=[2, 1])) + b session = tf.Session() result = session.run(linearModel, feed_dict={x: np.reshape([-0.1, -0.4], [1, 2])} ) return np.reshape(result, []) 

и исходный код C ++, который будет называть его:

 // File Name: CppCallPython.cpp #include <Python.h> #include "HelloTensorflow.h" #include <iostream> void Run(void) { Py_Initialize(); initHelloTensorflow(); std::cout<<"\t Execute Tensorflow:\n"; float result = ExecuteTensorFlow(); std::cout<<"\t Result = " <<result<<std::endl; Py_Finalize(); } int main(void) { ::Run(); } 

и построить код python для динамической библиотеки:

 # File Name: createPythonLib.py from distutils.core import setup from Cython.Build import cythonize setup( ext_modules = cythonize("HelloTensorflow.pyx") ) 

Наконец, используйте Makefile для выполнения сборки:

 # File Name: Makefile Target = CppCallPython # Compiler CC = LC_MESSAGES=C g++ CXXFLAGS = -Wall -Wextra -g LIB_PYTHON2 = $(shell python2-config --cflags --ldflags) MODULE_NAME = HelloTensorflow LIB_MODULE = -L./ $(MODULE_NAME).so .PHONY: all all: pythonLib cppExecutable echo Build Finished. pythonLib: python createPythonLib.py build_ext --inplace cppExecutable: $(MODULE_NAME).h $(CC) $(CXXFLAGS) $(Target).cpp $(LIB_MODULE) $(LIB_PYTHON2) -o $(Target) 

Как упоминалось выше, в результате получилась ошибка «tensorflow.pxd not found»:

 missing cimport in module 'tensorflow': HelloTensorflow.pyx Compiling HelloTensorflow.pyx because it changed. [1/1] Cythonizing HelloTensorflow.pyx Error compiling Cython file: ------------------------------------------------------------ ... cimport numpy as np cimport tensorflow as tf ^ ------------------------------------------------------------ HelloTensorflow.pyx:2:8: 'tensorflow.pxd' not found Traceback (most recent call last): File "createPythonLib.py", line 4, in <module> setup( ext_modules = cythonize("HelloTensorflow.pyx") ) File "/usr/lib/python2.7/dist-packages/Cython/Build/Dependencies.py", line 877, in cythonize cythonize_one(*args) File "/usr/lib/python2.7/dist-packages/Cython/Build/Dependencies.py", line 997, in cythonize_one raise CompileError(None, pyx_file) Cython.Compiler.Errors.CompileError: HelloTensorflow.pyx makefile:18: recipe for target 'pythonLib' failed make: *** [pythonLib] Error 1 

Означает ли это, что я не могу обернуть приложение Tensorflow с помощью Cython, потому что «* .pxd» не предоставляется Tensorflow? Есть ли другой путь?

система

Ubuntu 16.04 LTS
Tensorflow 1.2.0 GPU
gcc версия 5.4.0
Python: Python 2.7.12
Cython версия 0.23.4

  • Выбор из другой функции стоимости и функции активации нейронной сети
  • Загрузка обученной модели Keras и продолжение обучения
  • TensorFlow: как регистрировать использование GPU-памяти (VRAM)?
  • Инструкции CPU не скомпилированы с помощью TensorFlow
  • Получение хорошего смешивания со многими входными файлами данных в тензорном потоке
  • Одновременное выполнение нескольких сеансов тензорного потока
  • Как получить текущие доступные графические процессоры в тензорном потоке?
  • Расчет матричных вычислений на графическом процессоре медленнее, чем на CPU
  • One Solution collect form web for “Как обернуть Tensorflow Cython и разрешить C ++ называть его?”

    cimport – это механизм, специфичный для Cython для импорта статически определенной информации о типе из файла pxd. Это не похоже на то, что shadoworflow предоставляет такой файл (следовательно, сообщение об ошибке). Похоже, вы просто используете tensorflow в качестве модуля Python, и в этом случае вы должны его import (это, вероятно, также относится и к numpy: он определяет файл .pxd, но для доступа к нормальным функциям numpy вам также следует import Это).

    Дайте, чтобы весь ваш код был в основном нетипизированным кодом Python, вы не должны ожидать больших улучшений скорости от использования Cython.

    Python - лучший язык программирования в мире.