Shep
Shep

Reputation: 8380

Convert Keras model to TensorFlow protobuf

We're currently training various neural networks using Keras, which is ideal because it has a nice interface and is relatively easy to use, but we'd like to be able to apply them in our production environment.

Unfortunately the production environment is C++, so our plan is to:

Unfortunately I don't know how to access the TensorFlow saving utilities from Keras, which normally saves to HDF5 and JSON. How do I save to protobuf?

Upvotes: 22

Views: 11585

Answers (5)

Hazarapet Tunanyan
Hazarapet Tunanyan

Reputation: 2865

Make sure you change the learning phase of keras backend to store proper values of the layers (like dropout or batch normalization). Here is a discussion about it.

Upvotes: 1

Tobias Hermann
Tobias Hermann

Reputation: 10956

In case you don't need to utilize a GPU in the environment you are deploying to, you could also use my library, called frugally-deep. It is available on GitHub and published under the MIT License: https://github.com/Dobiasd/frugally-deep

frugally-deep allows running forward passes on already-trained Keras models directly in C++ without the need to link against TensorFlow or any other backend.

Upvotes: 7

Louis M
Louis M

Reputation: 4324

This seems to be answered in "Keras as a simplified interface to TensorFlow: tutorial", posted on The Keras Blog by Francois Chollet.

In particular, section II, "Using Keras models with TensorFlow".

Upvotes: 4

Amir
Amir

Reputation: 2425

Save your keras model as an HDF5 file.

You can then do the conversion with the following code:

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

Here is my sample code which handles multiple input and multiple output cases: https://github.com/amir-abdi/keras_to_tensorflow

Upvotes: 2

Ahmed
Ahmed

Reputation: 69

You can access TensorFlow backend by:

import keras.backend.tensorflow_backend as K

Then you can call any TensorFlow utility or function like:

K.tf.ConfigProto

Upvotes: 4

Related Questions