C++ 中的 Tensorflow:成功读取 LSTM 编码器解码器模型的协议缓冲区

Tensorflow in C++: Successfully reading the protocol buffer for LSTM encoder decoder model

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

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

我想知道是否有人以前遇到过这个问题或者有解决这个问题的方法。

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

如有任何意见,我们将不胜感激。另外,我正在使用 tensorflow 1.14 版。

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

TF_NOT_FOUND error: 错误信息如下: message: Op type not registered 'GatherTree' in binary 运行 在 LAPTOP-5R9P6BHL 上。确保在此过程中 Op 和 Kernel 已注册到二进制 运行 中。请注意,如果您正在加载使用来自 tf.contrib 的操作的已保存图表,则应在导入图表之前访问(例如)tf.contrib.resampler,因为在首次访问模块时会延迟注册 contrib 操作。 在这个阶段,我只 link 将 tensorflow.dll 和 tensorflow.lib 编辑到我的 C++ 项目中。一个可能的解决方案是 link 包含 Gather Tree op 定义的库,即 _beam_search_ops.dll

_beam_search_ops.dll 未找到错误:尝试使用 TF_LoadLibrary()[=37 加载库时出现此错误=] 来自 c_api.h。在查看了一些关于堆栈溢出的 post 之后,似乎该库依赖于 python37.dll_pywrap_tensorflow_internal.pyd 个图书馆。在 linking 这两个库之后,我成功地加载了 _beam_search_ops.dll.

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

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