将Keras模型转换为TensorFlow protobuf

时间:2016-04-04 20:16:07

标签: c++ protocol-buffers tensorflow keras

我们目前正在使用Keras训练各种神经网络,这是理想的,因为它具有良好的界面并且相对易于使用,但我们希望能够在我们的生产环境中应用它们。

不幸的是,生产环境是C ++,所以我们的计划是:

  • 使用TensorFlow后端将模型保存到protobuf
  • 将我们的生产代码链接到TensorFlow,然后加载protobuf

不幸的是,我不知道如何从Keras访问TensorFlow保存实用程序,它通常保存为HDF5和JSON。如何保存到protobuf?

5 个答案:

答案 0 :(得分:6)

如果您不需要在正在部署的环境中使用GPU,您也可以使用我的库,名为frugally-deep。它可以在GitHub上获得,并在MIT许可证下发布:https://github.com/Dobiasd/frugally-deep

节俭深度允许直接在C ++中对已经训练过的Keras模型进行前进传递,而无需链接TensorFlow或任何其他后端。

答案 1 :(得分:4)

似乎可以在"Keras as a simplified interface to TensorFlow: tutorial"中回答,由Francois Chollet发布在 The Keras Blog 上。

特别是section II, "Using Keras models with TensorFlow"

答案 2 :(得分:3)

您可以通过以下方式访问TensorFlow后端:

import keras.backend.tensorflow_backend as K

然后您可以调用任何TensorFlow实用程序或函数,如:

K.tf.ConfigProto

答案 3 :(得分:2)

将您的keras模型保存为HDF5文件。

然后,您可以使用以下代码进行转换:

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'))

以下是处理多个输入和多个输出案例的示例代码: https://github.com/amir-abdi/keras_to_tensorflow

答案 4 :(得分:0)

请确保您更改了 keras后端的学习阶段,以存储适当的图层值(例如,辍学或批处理规范化)。这是一个discussion