0

我已经调试这个问题一段时间了。我开发了一个 LSTM 编码器解码器模型,我计划在 C++ 中部署它。

以.pb文件格式保存模型后,我可以导入模型和数据并将其部署在 python 中。但是,当我尝试使用 C++ API 导入图形时,该函数TF_GraphImportGraphDef()返回错误代码TF_NOT_FOUND。我怀疑,这是因为我使用的是光束搜索方法,并且 op 的符号GatherTree不包含在tensorflow.dll/lib我在 windows 上使用 Bazel 生成的符号中。

我想知道是否有人以前遇到过此问题或对此问题有任何解决方案。

链接到_beam_search_ops.dll是一个可能的解决方案吗?我也尝试过TF_LoadLibrary()使用c_api.h. 但是,我无法加载库。

任何输入将不胜感激。另外,我正在使用 tensorflow 1.14 版。

4

1 回答 1

0

因此,我深入挖掘并设法找到了以下问题的解决方案,这使我能够使用 C++ api 成功加载 LSTM 编码器解码器保存的模型:

TF_NOT_FOUND 错误:错误消息如下:消息:操作类型未在 LAPTOP-5R9P6BHL 上运行的二进制文件中注册“GatherTree”。确保在此进程中运行的二进制文件中注册了 Op 和 Kernel。请注意,如果您正在加载使用来自 tf.contrib 的操作的已保存图,tf.contrib.resampler则应在导入图之前完成访问(例如),因为首次访问模块时会延迟注册 contrib 操作。在这个阶段,我只将 tensorflow.dll 和 tensorflow.lib 链接到我的 C++ 项目。一个可能的解决方案是链接包含Gather Tree op定义的库,即_beam_search_ops.dll

_beam_search_ops.dll 未找到错误:尝试使用c_api.h 中的TF_LoadLibrary()加载库时出现此错误。在查看了一些关于堆栈溢出的帖子后,似乎该库依赖于python37.dll_pywrap_tensorflow_internal.pyd库。在链接这两个库之后,我成功地加载了_beam_search_ops.dll。

TF_INVALID_ARGUMENT 错误:即使在加载_beam_search_ops.dll库后,图形导入也因无效参数错误而失败。在阅读错误消息时,我意识到这是由于_beam_search_ops.dll_pywrap_tensorflow_internal.pyd是使用 tensorflow V1.13 生成的,而 tensorflow.dll/lib 和.pb文件是使用 tensorflow V1.14 生成的。当我从 tensorflow V1.14 版本链接_beam_search_ops.dll_pywrap_tensorflow_internal.pyd时,图表的加载成功并且我能够读取图表的内容。

如果有人对此问题有更好的解决方案,请在此处发布。谢谢你。

于 2019-11-02T09:36:51.523 回答