web-dev-qa-db-ja.com

KerasモデルをC ++に変換する

Keras(Theanoを使用)を使用してCNNモデルをトレーニングしています。誰かが私のC++アプリケーションでそれをどのように使用できるかを知っていますか?誰かが似たようなことを試しましたか?ネットワーク関数を使用してC++コードを生成するpythonコード-提案はありますか?

同様の質問を見つけました こちら C++でTensorflow Kerasモデルを使用する方法ですが、答えはありません。

37
pplonski

私自身の質問に答えて解決策を得るために、 keras2cpp (githubで利用可能なコード)と呼ばれる単純なc ++ソリューションを書きました。

このソリューションでは、ネットワークアーキテクチャ(json)と重み(hdf5)を保存します。次に、提供されたスクリプトを使用して、ネットワークをプレーンテキストファイルにダンプできます。取得したテキストファイルは、ネットワークで純粋なC++コードで使用できます。 pythonライブラリまたはhdf5には依存関係はありません。theanoおよびtensorflowバックエンドで動作するはずです。

42
pplonski

私は同様の状況にいることに気づきましたが、C++の順次Kerasモデルのフォワードパスをサポートするだけでなく、 functional API で構築されたより複雑なモデルもサポートする必要がありました。

そこで、frugally-deepという新しいライブラリを作成しました。 GitHubで見つけることができ、MIT License: https://github.com/Dobiasd/frugally-deep で公開されています

さらに、多くの一般的なレイヤータイプをサポートするだけでなく、単一のCPUでのTensorFlowのパフォーマンスに追いつくことができます(場合によってはそれを上回ることもあります)。 repo で、一般的なモデルの最新のベンチマーク結果を見つけることができます。

自動テストにより、C++で使用されるモデルの出力が、PythonでKerasを使用して実行された場合とまったく同じであることを、深みのある深さで保証します。

12
Tobias Hermann

あなたのkerasモデルがtensorflowバックエンドを使用して訓練されている場合、次のコードに従ってtensorflowモデルとして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'))
5
AHA

ここで見つかったソリューションは非常に優れていますが、モデルにこれらのライブラリでサポートされていない異なるタイプのレイヤーがある場合は、次のことをお勧めします。

  • Kerasモデルをテンソルフローモデルに変換します。
  • モデルをフリーズし、tensorflowが提供するTranformグラフツールを使用します(bazelを使用してソースから構築する必要があります)
  • C++ APIテンソルフローライブラリをコンパイルして、プロジェクトで使用します。
  • C++ APIテンソルフローライブラリを使用して、ライブラリをプロジェクトにリンクします。

バゼルとは異なるコンパイラー(たとえばg ++など)を使用したい場合は、次のすばらしいチュートリアルに従うことができます。

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

3
TFreitas

最も簡単な方法は、おそらくPython予測をバイナリまたは HDF5 に書き込むスクリプトへのシステムコールを行うことです。 C++から読み込むことができるファイル。 PythonをC++ に直接統合することもできます。

これを簡単にデプロイして配布する必要がある場合は、自己完結型のPython Anaconda などのインストールを調べることができますが、あなたの最善の策は、Kerasを避け、 Caffe またはTensorflowへのC++インターフェースを使用することです。標準; この説明を参照してください 。Caffeはおそらく 2番目に人気のあるディープラーニングライブラリです それで、あなたは本当に間違って行くことができません。

3
1''

同様のニーズがありました-KerasモデルをC++アプリケーションに埋め込みたかったので、自分のライブラリを書くことにしました: Kerasify

Kerasifyの設計目標:

  • Theanoバックエンドを使用してKerasによって生成された画像処理シーケンシャルネットワークとの互換性。 (行列の列/行の順序を切り替えると、Tensorflowで動作します)。
  • 外部依存関係なし、標準ライブラリ、C++ 11機能は問題ありません。
  • すばやく読み取ることができるバイナリ形式でディスクに保存されたモデル。
  • キャッシュパフォーマンスを向上させるために、連続ブロックのメモリに格納されたモデル。
  • 例外をスローせず、エラー時にブール値のみを返します。
  • CPUのみ、GPUなし

Githubリンクのサンプルコード、単体テストなど。完全ではなく、使用しているKeras関数の狭いサブセットのみをサポートしていますが、少しの労力で拡張可能です。

2
moof2k

これを試すことができます https://github.com/gosha20777/keras2cpp

Keras2cppは、C++アプリケーションから依存関係なしに訓練されたKerasモデルを実行するための小さなライブラリです。

サポートされているKerasレイヤー:-高密度-Convolution1D-Convolution2D-Convolution3D-Flatten-ELU-Activation-MaxPooling2D-Embedding-LocallyConnected1D-LocallyConnected2D-LSTM-GRU-CNN-BatchNormalization

サポートされているアクティベーション:-線形-relu-softplus-tanh-sigmoid-hard_sigmoid-elu-softsign-softmax

設計目標:

  • TensorFlowバックエンドを使用してKerasによって生成されたネットワークとの互換性。
  • CPUのみ。
  • 外部依存関係なし、標準ライブラリ、C++ 17。
  • メモリに保存されたモデル。