将Keras模型转换为C ++

时间:2016-04-19 13:52:43

标签: c++ tensorflow theano conv-neural-network keras

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

我发现了一个类似的问题here如何在C ++中使用Tensorflow Keras模型但没有答案。

7 个答案:

答案 0 :(得分:38)

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

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

答案 1 :(得分:10)

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

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

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

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

答案 2 :(得分:4)

如果使用张量流后端训练keras模型,则可以按照以下代码将keras模型保存为张量流模型: 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'))

答案 3 :(得分:3)

最简单的方法可能是对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,所以你真的不会出错。

答案 4 :(得分:2)

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

Kerasify的设计目标:

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

github链接上的示例代码,单元测试等。它并不完全完整,它只支持我正在使用的Keras函数的窄子集,但它应该可以通过一点点努力进行扩展。

答案 5 :(得分:2)

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

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

如果你想使用比bazel更不同的编译器(例如g ++),你可以遵循这个伟大的tuturial:

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

答案 6 :(得分:0)

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

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

受支持的Keras层: -密集 -卷积1D -卷积2D -卷积3D -展平 -ELU -激活 -MaxPooling2D -嵌入 -本地连接一维 -LocaledConnected2D -LSTM -GRU -CNN -BatchNormalization

支持的激活: -线性 -露露 -softplus -谭 -乙状结肠 -hard_sigmoid -elu -软签 -softmax

设计目标:

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