将Keras模型转换为C ++
c++
conv-neural-network
keras
tensorflow
7
0

我正在使用Keras(与Theano)来训练CNN模型。有谁知道如何在C ++应用程序中使用它?有人尝试过类似的东西吗?我有想法写一些python代码,它将生成具有网络功能的c ++代码-对此有何建议?

我在这里找到了类似的问题如何在C ++中使用Tensorflow Keras模型但没有答案。

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

为了回答我自己的问题并找到解决方案,我编写了一个简单的c ++解决方案keras2cpp (其代码可在github上找到)。

在此解决方案中,您将存储网络体系结构(在json中)和权重(在hdf5中)。然后,您可以使用提供的脚本将网络转储到纯文本文件。您可以使用纯c ++代码在网络中使用获得的文本文件。 python库或hdf5没有依赖关系。它应该适用于theano和tensorflow后端。

收藏
评论

我发现自己处于类似情况,但不仅需要支持C ++中顺序Keras模型的前向传递,而且还需要支持使用功能性API构建的更复杂模型的传递。

所以我写了一个叫做节俭型的新库。您可以在GitHub上找到它,并以MIT许可证发布: https : //github.com/Dobiasd/frugally-deep

除了支持许多常见的图层类型外,它还可以保持(有时甚至超过)TensorFlow在单个CPU上的性能。您可以在repo中找到某些常见模型的最新基准测试结果。

通过自动测试,节俭地保证了在C ++中与之一起使用的模型的输出与在Python中与Keras一起运行时的输出完全相同。

收藏
评论

如果您的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'))
收藏
评论

我有类似的需求-我想将Keras模型嵌入C ++应用程序中-并决定编写自己的库: Kerasify

Kerasify的设计目标:

  • 与图像处理的兼容性Keras使用Theano后端生成的顺序网络。 (如果切换矩阵列/行顺序,则可以与Tensorflow一起使用)。
  • 没有外部依赖性,标准库,C ++ 11功能还可以。
  • 模型以二进制格式存储在磁盘上,可以快速读取。
  • 模型以连续块的形式存储在内存中,以提高缓存性能。
  • 不抛出异常,仅在出错时返回布尔值。
  • 仅CPU,无GPU

github链接上的示例代码,单元测试等。它并不完全完整,仅支持我正在使用的Keras函数的狭窄子集,但应该可以轻松扩展。

收藏
评论

您可以尝试这个https://github.com/gosha20777/keras2cpp

Keras2cpp是一个小型库,用于从C ++应用程序运行经过训练的Keras模型,而没有任何依赖性。

支持的Keras层:-密集-卷积1D-卷积2D-卷积3D-展平-ELU-激活-MaxPooling2D-嵌入-LocallyConnected1D-LocallyConnected2D-LSTM-GRU-CNN-BatchNormalization

支持的激活:-线性-relu-softplus-tanh-Sigmoid-hard_Sigmoid-elu-softsign-softmax

设计目标:

  • 与Keras使用TensorFlow后端生成的网络的兼容性。
  • 仅CPU。
  • 没有外部依赖关系,标准库,C ++ 17。
  • 模型存储在内存中。
收藏
评论

此处找到的解决方案非常好,但是如果您的模型具有这些库不支持的某些不同类型的图层,则建议您执行以下操作:

  • 将Keras模型转换为张量流模型。
  • 冻结模型并使用由tensorflow提供的Tranform图形工具(您必须使用bazel从源代码构建模型)
  • 编译C ++ API tensorflow库以在项目中使用它。
  • 使用C ++ API tensorflow库并将这些库链接到您的项目。

如果要使用与bazel不同的编译器(例如g ++),则可以遵循以下教程:

http://tuatini.me/building-tensorflow-as-a-standalone-project/

收藏
评论

最简单的方法可能是对Python脚本进行系统调用,该脚本将预测写入二进制或HDF5文件中,可以从C ++中读取该文件。您还可以将Python直接集成到C ++中

如果您需要轻松地部署和分发它,可以考虑使用Anaconda之类的独立Python安装程序,但是最好的选择是避免Keras并使用Caffe或Tensorflow的C ++接口。我不推荐Tensorflow,因为从C ++使用它不是标准的;看到这个讨论 。 Caffe可以说是第二受欢迎的深度学习库,因此您不会错。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题