MKL-DNN を使用した、深層学習ネットワークのためのコード生成
MATLAB® Coder™ を使用して、Intel® プロセッサを使用する組み込みプラットフォームをターゲットとする、既に学習済みの畳み込みニューラル ネットワーク (CNN) からの予測のためのコードを生成できます。コード ジェネレーターは Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) を利用します。生成されたコードは、入力 SeriesNetwork
(Deep Learning Toolbox) または DAGNetwork
(Deep Learning Toolbox) ネットワーク オブジェクトで指定されるアーキテクチャ、レイヤーおよびパラメーターを使用して CNN を実装します。
次のいずれかの方法を使用してコードを生成します。
MATLAB コードからの C/C++ コード生成のための標準
codegen
コマンド。MATLAB Coder アプリ。
必要条件
Windows® では、関数
codegen
を使用した深層学習ネットワークのコード生成には Microsoft® Visual Studio® 2015 以降が必要です。MATLAB Coder Interface for Deep Learning。このサポート パッケージをインストールするには、これを MATLAB の [アドオン] メニューから選択します。
Intel Math Kernel Library for Deep Neural Networks (MKL-DNN)。
Deep Learning Toolbox™.
コンパイラおよびライブラリの環境変数。詳細については、深層学習に MATLAB Coder を使用するための前提条件を参照してください。
codegen
を使用したコード生成
MATLAB で、以下を行うエントリポイント関数を記述します。
関数
coder.loadDeepLearningNetwork
を使用して CNN ネットワーク オブジェクトを構築し設定する。詳細については、コード生成のための事前学習済みネットワークの読み込みを参照してください。エントリポイント関数の入力におけるネットワークの
predict
(Deep Learning Toolbox) メソッドを呼び出す。predict
メソッドでMiniBatchSize
を指定して、複数の入力イメージ、または観測値の予測のメモリ使用を管理する。
以下に例を示します。
function out = googlenet_predict(in) %#codegen % A persistent object mynet is used to load the series network object. % At the first call to this function, the persistent object is constructed and % setup. When the function is called subsequent times, the same object is reused % to call predict on inputs, thus avoiding reconstructing and reloading the % network object. persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('googlenet'); end % pass in input out = predict(mynet,in,'MiniBatchSize',2);
MEX 用またはスタティックまたはダイナミック リンク ライブラリ用のコード生成構成オブジェクトを作成します。MKL-DNN のコード生成パラメーターを指定するには、
DeepLearningConfig
プロパティをcoder.DeepLearningConfig
を使用して作成したcoder.MklDNNConfig
オブジェクトに設定します。cfg = coder.config('lib'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
codegen
コマンドを実行します。-config
オプションを使用して、構成オブジェクトを指定します。-args
オプションを使用して、入力型を指定します。入力サイズは16
の異なるイメージまたは観測値をもつ GoogLeNet ネットワークの入力層サイズに対応します。codegen -config cfg googlenet_predict -args {ones(224,224,3,16)} -report
メモ
コード生成では半精度入力を指定できます。ただし、コード ジェネレーターによって入力が単精度に型キャストされます。Deep Learning Toolbox は、MATLAB でのすべての計算に単精度浮動小数点演算を使用します。
生成コード
ネットワークは、層のクラスの配列を含む C++ クラスとして生成されます。このクラスの setup()
メソッドは、ハンドルを設定し、ネットワーク オブジェクトの各層にメモリを割り当てます。predict()
メソッドは、ネットワークの各層の予測を呼び出します。コード ジェネレーターは関数 googlenet_predict()
を MATLAB エントリポイント関数に対応する googlenet_predict.cpp
に作成します。この関数はネットワーク用に静的オブジェクトを構築し、setup メソッドおよび predict メソッドを起動します。
バイナリ ファイルは、ネットワークの全結合層および畳み込み層などのパラメーターをもつ層に対してエクスポートされます。たとえば、ファイル cnn_googlenet_conv*_w
および cnn_googlenet_conv*_b
は、ネットワークの畳み込み層の重みパラメーターおよびバイアス パラメーターに対応します。
既定では、生成されるアプリケーションは、codegen
フォルダーで重みファイルを探します。生成されたアプリケーションと重みファイルを組み込みボードなどの別の場所に再配置する場合は、再配置される重みファイルの場所を値とする CODER_DATA_PATH
という名前の環境変数を作成します。生成されるアプリケーションは、この場所で重みファイルを探します。
MATLAB Coder アプリを使用したコード生成
通常の手順に従い、エントリポイント関数の指定および入力型の指定を行います。MATLAB Coder アプリを使用した C コードの生成を参照してください。
[コードの生成] ステップで、以下を実行します。
[言語] を [C++] に設定します。
[詳細設定] をクリックします。[深層学習] ペインで、[ターゲット ライブラリ] を
[MKL-DNN]
に設定します。
コードを生成します。
参考
codegen
| coder.DeepLearningConfig
| coder.MklDNNConfig
| coder.loadDeepLearningNetwork