web-dev-qa-db-ja.com

KerasモデルをTensorFlow protobufに変換

現在、Kerasを使用してさまざまなニューラルネットワークをトレーニングしています。これは、Niceインターフェースがあり、比較的使いやすいので理想的ですが、本番環境に適用できるようにしたいと考えています。

残念ながら、本番環境はC++であるため、私たちの計画は次のとおりです。

  • TensorFlowバックエンドを使用してモデルをprotobufに保存する
  • プロダクションコードをTensorFlowにリンクし、protobufにロードします

残念ながら、KerasからTensorFlow保存ユーティリティにアクセスする方法がわかりません。Kerasは通常、HDF5とJSONに保存します。どうすればprotobufに保存できますか?

21
Shep

デプロイ先の環境でGPUを使用する必要がない場合は、frugally-deepと呼ばれる私のライブラリを使用することもできます。 GitHubで入手でき、MIT License: https://github.com/Dobiasd/frugally-deep の下で公開されています

質素なディープにより、TensorFlowや他のバックエンドとリンクする必要なく、C++で直接トレーニング済みのKerasモデルでフォワードパスを実行できます。

6
Tobias Hermann
4
Louis M

TensorFlowバックエンドには次の方法でアクセスできます。

import keras.backend.tensorflow_backend as K

次に、次のようなTensorFlowユーティリティまたは関数を呼び出すことができます。

K.tf.ConfigProto
3
Ahmed

ケラスモデルを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

2
AHA

kerasバックエンドの学習フェーズを変更して、レイヤーの適切な値(ドロップアウトやバッチ正規化など)を保存するようにしてください。これについては ディスカッション です。

1