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

使用c_api.h执行使用tensorflow.contrib.resampler的冻结tensorflow图,c,tensorflow,C,Tensorflow,我有一个冻结的tensorflow图(.pb格式),其中包含对tensorflow.contrib.resampler的调用,必须使用C\u api.h在C应用程序中加载并执行该调用 如果调用以下命令,我能够从python成功加载并执行此图: import tensorflow as tf tf.contrib.resampler 在我加载图表之前 但是,我找不到如何使用C api执行同样的操作,这导致以下消息失败: Failed to process frame with No OpKern

我有一个冻结的tensorflow图(.pb格式),其中包含对tensorflow.contrib.resampler的调用,必须使用
C\u 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>
无法处理未注册支持Op“重采样器”的操作内核的帧
用这些属性。注册设备:[CPU,GPU],注册内核:
如何使用C api指示tensorflow存在此op?

(这与谈论同样的事情非常相似,但适用于Java)

当您在
tf.contrib
模块中使用操作时,它们不被视为实验性的,因此不属于,也不包含在其他语言发行版中

但是,您可以使用显式加载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
然后,您可以使用以下方法找到该路径中的所有共享库:

['/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
这大概是:

['/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
    的调用

  • 确保对Python和C使用相同的TensorFlow版本

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


希望对您有所帮助。

查看代码,该操作似乎位于一个位置。毫无疑问,它找不到它——您需要先加载这个库。令人惊讶的是,我的安装中不存在这个二进制文件(通过windows上的pip安装的tensorflow gpu 1.8.0),但python版本能够加载并运行该图。这意味着op存在并且可以被加载,如果我能在C中找到方法的话。