使用c_api.h执行使用tensorflow.contrib.resampler的冻结张量流图

时间:2018-05-22 19:39:50

标签: c tensorflow

我有一个冻结的张量流图(.pb格式),其中包含对tensorflow.contrib.resampler的调用,必须使用c_api.h在C应用程序中加载和执行。

如果我调用:

,我可以成功地从python加载并执行此图形
import tensorflow as tf
tf.contrib.resampler

我加载图表之前。

但是,我无法使用C api找到如何做同样的事情,导致以下消息失败:

Failed to process frame with No OpKernel was registered to support Op 'Resampler'
with these attrs.  Registered devices: [CPU,GPU], Registered kernels:
<no registered kernels>

如何使用C api指示此op存在的tensorflow?

1 个答案:

答案 0 :(得分:0)

(这与this other StackOverflow thread非常类似,谈论同样的事情,但对于Java)

当您在tf.contrib模块中使用操作时,它们不被视为实验性操作,因此不属于stable TensorFlow API,并且不包含在其他语言版本中。

但是,您可以使用TF_LoadLibrary在C中显式加载共享库。

要做到这一点,首先需要找到共享库的位置,其中包含您感兴趣的tf.contrib操作的实现。在这种情况下,它似乎是tf.contrib.resampler,所以你会做这样的事情:

python -c "import tensorflow; print(tensorflow.contrib.resampler.__path__)"

会打印出类似的内容:

['/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/resampler']

然后,您将使用以下内容找到该路径中的所有共享库:

find /usr/local/lib/python2.7/dist-packages/tensorflow/contrib/resampler -name "*.so"

这将是:

/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/resampler/python/ops/_resampler_ops.so

好了,现在你有了这个库,你可以使用以下方法在C中加载它:

TF_Status* status = TF_NewStatus();
TF_LoadLibrary("/usr/local/lib/python2.7/dist-packages/tensorflow/contrib/resampler/python/ops/_resampler_ops.so", status);
if (TF_GetCode(status) != TF_OK) {
  // Log/fail, details in TF_Message(status)
}
TF_DeleteStatus(status);

注意事项:

  • 如果您想在其他计算机上运行,​​则需要将上面的.so文件与程序打包在一起,并将调用调整为TF_LoadLibrary

    < / LI>
  • 确保您使用的是与Python和C相同的TensorFlow版本

  • Windows :对于Windows,构建当前(至少TensorFlow 1.8)不同,并且所有操作都静态编译到pip包中包含的单个本机库中,但不是C API发布二进制文件。因此,没有与您可以加载的这些contrib操作相对应的DLL。

希望有所帮助。