我正在使用Keras(与Theano一起)训练我的CNN模型。有谁知道如何在我的C ++应用程序中使用它?有没有人尝试类似的东西?我有想法编写一些python代码,它将生成一个带有网络功能的c ++代码 - 有关于它的任何建议吗?
我发现了一个类似的问题here如何在C ++中使用Tensorflow Keras模型但没有答案。
答案 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的设计目标:
github链接上的示例代码,单元测试等。它并不完全完整,它只支持我正在使用的Keras函数的窄子集,但它应该可以通过一点点努力进行扩展。
答案 5 :(得分:2)
此处找到的解决方案非常好,但如果您的模型具有这些库不支持的某些不同类型的图层,我建议您执行以下操作:
如果你想使用比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
设计目标: