将 Keras 模型转换为 C++ [关闭]
Posted
技术标签:
【中文标题】将 Keras 模型转换为 C++ [关闭]【英文标题】:Convert Keras model to C++ [closed] 【发布时间】:2016-08-11 18:09:08 【问题描述】:我正在使用 Keras(与 Theano)来训练我的 CNN 模型。有谁知道如何在我的 C++ 应用程序中使用它?有没有人尝试过类似的东西?我有想法编写一些 python 代码来生成带有网络函数的 c++ 代码 - 有什么建议吗?
我发现了一个类似的问题herehow to use Tensorflow Keras model in C++ 但没有答案。
【问题讨论】:
@akarsakov 你想要什么细节? @1'' 抱歉,我选择了错误的赏金理由。我想找到更直接或更适合在 C++ 代码中使用 Keras 模型的生产方式。 @akarsakov HDF5 + 系统调用解决方案有什么问题吗? @1'' 很难分发这样的解决方案。我们需要用 Keras 等部署所有的 python 环境。 @akarsakov 查看我编辑的答案。 【参考方案1】:为了回答我自己的问题并找到解决方案 - 我编写了一个名为 keras2cpp 的普通 C++ 解决方案(其代码可在 github 上找到)。
在此解决方案中,您存储网络架构(以 json 格式)和权重(以 hdf5 格式)。然后,您可以使用提供的脚本将网络转储到纯文本文件。您可以在纯 C++ 代码中将获得的文本文件与网络一起使用。不依赖于 python 库或 hdf5。它应该适用于 theano 和 tensorflow 后端。
【讨论】:
抱歉,没有意识到您想要部署一个已经训练好的模型。在这种情况下,这是一个很好的解决方案。【参考方案2】:我发现自己处于类似情况,但不仅需要支持 C++ 中顺序 Keras 模型的前向传递,还需要支持使用 functional API 构建的更复杂模型。
所以我编写了一个名为 frugally-deep 的新库。你可以在 GitHub 上找到它,它是在 MIT 许可证下发布的:https://github.com/Dobiasd/frugally-deep
除了支持许多常见的层类型外,它还可以跟上(有时甚至超过)TensorFlow 在单个 CPU 上的性能。您可以在repo 中找到一些常见模型的最新基准测试结果。
通过节俭的自动测试,深度保证了在 C++ 中使用它的模型的输出与在 Python 中使用 Keras 运行时的输出完全相同。
【讨论】:
您的库是否支持使用tensorflow.keras
训练的模型的推理?
@off99555 是的。 :)【参考方案3】:
如果您的 keras 模型是使用 tensorflow 后端训练的,您可以按照以下代码将 keras 模型保存为 tensorflow 模型: https://github.com/amir-abdi/keras_to_tensorflow
这里是一个较短的代码版本:
from keras import backend as K
from tensorflow.python.framework import graph_util
from tensorflow.python.framework import graph_io
weight_file_path = 'path to your keras model'
net_model = load_model(weight_file_path)
sess = K.get_session()
constant_graph = graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), 'name of the output tensor')
graph_io.write_graph(constant_graph, 'output_folder_path', 'output.pb', as_text=False)
print('saved the constant graph (ready for inference) at: ', osp.join('output_folder_path', 'output.pb'))
【讨论】:
【参考方案4】:你可以试试这个 https://github.com/gosha20777/keras2cpp
Keras2cpp 是一个小型库,用于从 C++ 应用程序运行经过训练的 Keras 模型,无需任何依赖。
支持的 Keras 层: - 密集 - 卷积1D - 卷积二维 - 卷积3D - 展平 - ELU - 激活 - MaxPooling2D - 嵌入 - LocallyConnected1D - LocallyConnected2D - LSTM - 格鲁乌 - 美国有线电视新闻网 - 批量标准化
支持的激活: - 线性 -relu - 软加 - 谭 - 乙状结肠 - hard_sigmoid - 埃卢 - 软签 - 软最大
设计目标:
与 Keras 使用 TensorFlow 后端生成的网络兼容。 仅 CPU。 没有外部依赖,标准库,C++17。 模型存储在内存中。【讨论】:
欢迎来到 Stack Overflow!虽然我们感谢您提供答案的意图,但请首先确保该网站的问题是 on-topic。这是对场外资源的请求,因此不应回复See: Should one advise on off topic questions? 嗨,欢迎来到 Stack Overflow。看起来您正在链接到您自己的 GitHub 库。您需要正确披露这一事实,因为如果您不这样做,您的答案可能会被删除。请花点时间阅读SO's guidance on self-promotion【参考方案5】:最简单的方法可能是对 Python 脚本进行系统调用,该脚本将预测写入二进制文件或HDF5 文件,该文件可以从 C++ 中读取。你也可以directly integrate Python into C++。
如果您需要轻松部署和分发它,您可以研究独立的 Python 安装,例如 Anaconda,但最好的选择可能是避免使用 Keras,并使用 C++ 接口到 Caffe 或 Tensorflow。我不推荐 Tensorflow,因为在 C++ 中使用它不是标准的;见this discussion。 Caffe 可以说是 second most-popular deep learning library,所以你不会真的出错。
【讨论】:
【参考方案6】:这里找到的解决方案非常好,但是如果您的模型有一些这些库不支持的不同类型的层,我建议您执行以下操作:
将 Keras 模型转换为 TensorFlow 模型。 冻结模型并使用 tensorflow 提供的 Tranform 图形工具(您必须使用 bazel 从源代码构建它) 编译 C++ API tensorflow 库以在您的项目中使用它。 使用 C++ API tensorflow 库并将这些库链接到您的项目。如果您想使用与 bazel 不同的编译器(例如 g++),您可以遵循这个很棒的教程:
http://tuatini.me/building-tensorflow-as-a-standalone-project/
【讨论】:
小补充:Bazel不是编译器,是构建工具(可以使用g++之类的编译器,但不能替代) 很好,编辑了答案。【参考方案7】:我也有类似的需求——我想将 Keras 模型嵌入到 C++ 应用程序中——并决定编写自己的库:Kerasify
Kerasify 的设计目标:
与 Keras 使用 Theano 后端生成的图像处理序列网络的兼容性。 (如果您切换矩阵列/行顺序,可以使用 Tensorflow)。 无外部依赖,标准库,C++11 功能正常。 模型以二进制格式存储在磁盘上,可以快速读取。 模型以连续块的形式存储在内存中,以获得更好的缓存性能。 不抛出异常,仅在出错时返回 bool。 只有 CPU,没有 GPUgithub链接上的示例代码、单元测试等。它并不完全完整,它只支持我正在使用的一小部分 Keras 函数,但它应该可以通过一些努力进行扩展。
【讨论】:
以上是关于将 Keras 模型转换为 C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何将训练有素的 Tensorflow 模型转换为 Keras?
将 UIImage 转换为 Keras 模型的 MLMultiArray