【问题标题】:Tensorflow in C++: Successfully reading the protocol buffer for LSTM encoder decoder modelC++ 中的 TensorFlow:成功读取 LSTM 编码器解码器模型的协议缓冲区
【发布时间】:2020-02-27 16:50:48
【问题描述】:

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

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

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

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

我们将不胜感激。另外,我正在使用 tensorflow 1.14 版。

【问题讨论】:

  • 您检查过TF_Status 结构中的消息吗? (您可以通过TF_Message() 获得)。关于加载额外的 DLL,TF_LoadLibrary 应该可以工作,为什么它不适合你?
  • 嗨,我刚刚找到了一个解决方案,其中出于某种原因我还必须链接“_pywrap_tensorflow_internal.pyd”库。 (来源:stackoverflow.com/questions/50115117/…)。现在可以成功加载dll。但是,当我尝试导入图形时,它仍然失败,但这次出现了不同的错误代码,即 TF_INVALID_ARGUMENT。这些错误代码表示什么?有没有关于这些的文档?
  • @NarayanNarvekar 在此处查看有关这些错误的文档:tensorflow.org/api_docs/python/tf/errors/InvalidArgumentError This may occur, for example, if an operation is receives an input tensor that has an invalid value or shape. For example, the tf.matmul op will raise this error if it receives an input that is not a matrix, and the tf.reshape op will raise this error if the new shape does not match the number of elements in the input tensor. 您会在图形导入时看到它,这感觉很奇怪——通常我希望在推理过程中会发生这种错误。
  • @HanClinto 我也遇到了这个问题,并意识到这个问题没有多大意义。这是真的。这些错误实际上与“error_codes.proto”中的错误值相同。通过 TF_Message() 方法读取错误消息后,我意识到这是加载的 dll 之间的版本不匹配问题。接下来我将发布对我有用的解决方案。

标签: tensorflow machine-learning lstm sequence-to-sequence tensorflow-c++


【解决方案1】:

所以我深入挖掘并设法找到了以下问题的解决方案,这使我能够使用 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 库后,图形导入也失败并出现无效参数错误。在阅读错误消息时,我意识到这是由于使用 tensorflow V1.13 和 tensorflow.dll/lib 生成的 _beam_search_ops.dll_pywrap_tensorflow_internal.pyd .pb 文件使用 tensorflow V1.14 生成。当我从 tensorflow V1.14 版本链接 _beam_search_ops.dll_pywrap_tensorflow_internal.pyd 时,图表的加载成功并且我能够读取图表。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多