2016-04-19 51 views
20

私はKerano(Theano)を使用してCNNモデルをトレーニングしています。誰も私のC++アプリケーションでどのように使用できるのか考えていますか?誰かが何か似たようなことを試みましたか私は、ネットワーク機能を持つC++コードを生成するいくつかのPythonコードを書く考えがあります。KerasモデルをC++に変換する

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

+0

@akarsakov詳細をお聞かせください。 –

+0

@ 1 ''申し訳ありませんが、私は賞金に間違った理由を選んだのです。私はC++コードでKerasモデルを使用するためのより生産的な方法の方がより簡単か、より適していると思っています。 – akarsakov

+0

@akarsakov HDF5 +システムコールソリューションに問題がありますか? –

答えて

16

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

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

+0

申し訳ありませんが、既に訓練されたモデルを導入したいとは思わなかったのです。その場合、これは良い解決策です。 –

5

最も簡単な方法は、おそらく予測をバイナリまたはHDF5ファイルに書き込むPythonスクリプトをシステムコールすることです。これはC++から読み込むことができます。 directly integrate Python into C++も可能です。

あなたはこれを簡単に展開して配布する必要がある場合は、あなたがAnacondaのような自己完結型のPythonインストールに見ることができますが、あなたの最善の策はKerasを避け、CaffeまたはTensorflowにC++インタフェースを使用することであってもよいです。 TensorflowはC++からの使用は標準ではないため、推奨しません。 this discussionを参照してください。 Caffeは間違いなくsecond most-popular deep learning libraryですので、本当に間違ってはいけません。

1

私は同様の必要性を持っていた - 私はC++アプリケーションでKerasモデルを埋め込むしたい - と、私自身のライブラリを書くことにしました:KerasifyのKerasify

設計目標:イメージと

  • 互換性を処理Theanoバックエンドを使用してKerasによって生成された順次ネットワーク。 (行列col /行の順序を変更すると、Tensorflowで動作する可能性があります)。
  • 外部依存関係、標準ライブラリ、C++ 11の機能はありません。
  • モデルは、ディスクにバイナリ形式で保存され、すぐに読み取ることができます。
  • モデルは、より良いキャッシュパフォーマンスのために連続ブロックでメモリに格納されます。
  • 例外をスローしません。エラーの場合はboolのみを返します。
  • githubのリンクでCPUのみ、無GPU

例コード、単体テスト、等。完全には完了していませんが、使用しているKeras関数の狭いサブセットのみをサポートしていますが、少しの努力で拡張可能でなければなりません。

1

あなたkerasモデルがtensorflowバックエンドを使用して訓練を受けている場合は、このコードに続くtensorflowモデルとしてkerasモデルを保存することができます

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

: ここhttps://github.com/amir-abdi/keras_to_tensorflow

は、コードの短いバージョンですここにあるソリューションは非常に優れていますが、モデルにこれらのライブラリでサポートされていないいくつかの異なるタイプのレイヤーがある場合は、以下を実行することをお勧めします:

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

あなたはbazelよりも(例えばG ++のように)別のコンパイラを使用したい場合は、この偉大なtuturial従うことができます:

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

4

私は似たような状況で自分自身を発見しただけでなく、ために必要がC++の逐次Kerasモデルの順方向パスをサポートしますが、functional APIを使用して構築したより複雑なモデルもサポートしています。

私はfrugally-deepという新しいライブラリを作成しました。 https://github.com/Dobiasd/frugally-deep

さらに、多くの一般的なレイヤータイプをサポートすることで、単一のCPUでTensorFlowのパフォーマンスに追いつくことができます。 repoには、いくつかの一般的なモデルの最新のベンチマーク結果が掲載されています。 C++でそれを使用するモデルの出力が正確にPythonでKerasで実行した場合と同じであることを自動テスト倹約-深い保証することで

関連する問題