我有一个冻结的张量流图(.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?
答案 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
。
确保您使用的是与Python和C相同的TensorFlow版本
Windows :对于Windows,构建当前(至少TensorFlow 1.8)不同,并且所有操作都静态编译到pip包中包含的单个本机库中,但不是C API发布二进制文件。因此,没有与您可以加载的这些contrib操作相对应的DLL。
希望有所帮助。