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

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

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

  • Свернуть несколько подмодулей на одно расширение Cython
  • Какой метод я могу использовать вместо __file__ в python?
  • Что такое pyximport и как его использовать?
  • Cython не будет компилироваться на Windows 7 x64
  • Класс расширения Cython: как мне разоблачить методы в автоматически сгенерированной структуре C?
  • Использование Cython для связывания Python с общей библиотекой
  • подробность

    Во-первых, вот код 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

  • Создание таймера обратного отсчета с Python и Tkinter?
  • Понимание Python super () с помощью методов __init __ ()
  • Cython prange медленнее для 4 нитей, затем с диапазоном
  • Что такое memoization и как я могу использовать его в Python?
  • Метод pandas.DataFrame corrwith ()
  • Травление cv2.KeyPoint вызывает PicklingError
  • One Solution collect form web for “Как обернуть Tensorflow Cython и разрешить C ++ называть его?”

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

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

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