Main Content

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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 アプリ。

  • C++ コードを生成し、CNN のためのスタティック ライブラリを作成する cnncodegen コマンド。

必要条件

  • Windows® では、関数 codegen を使用した深層学習ネットワークのコード生成には Microsoft® Visual Studio® 2015 以降が必要です。

  • MATLAB Coder Interface for Deep Learning Libraries。このサポート パッケージをインストールするには、これを MATLAB の [アドオン] メニューから選択します。

  • Intel Math Kernel Library for Deep Neural Networks (MKL-DNN)。

  • Deep Learning Toolbox™。

  • コンパイラおよびライブラリの環境変数。詳細については、MATLAB Coder を使用した深層学習の前提条件を参照してください。

codegen を使用したコード生成

  1. MATLAB で、以下を行うエントリポイント関数を記述します。

    以下に例を示します。

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

  2. MEX 用またはスタティックまたはダイナミック リンク ライブラリ用のコード生成構成オブジェクトを作成します。MKL-DNN のコード生成パラメーターを指定するには、DeepLearningConfig プロパティを coder.DeepLearningConfig を使用して作成した coder.MklDNNConfig オブジェクトに設定します。

    cfg = coder.config('lib');
    cfg.TargetLang = 'C++';
    cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');
  3. 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 は、ネットワークの畳み込み層の重みパラメーターおよびバイアス パラメーターに対応します。

MATLAB Coder アプリを使用したコード生成

  1. 通常の手順に従い、エントリポイント関数の指定および入力型の指定を行います。MATLAB Coder アプリを使用した C コードの生成を参照してください。

  2. [コードの生成] ステップで、以下を実行します。

    • [言語][C++] に設定します。

    • [詳細設定] をクリックします。[深層学習] ペインで、[ターゲット ライブラリ][MKL-DNN] に設定します。

  3. コードを生成します。

cnncodegen を使用したコード生成

  1. 事前学習済みのネットワークを読み込みます。

    詳細については、コード生成のための事前学習済みネットワークの読み込みを参照してください。

  2. 'targetlib''mkldnn' として指定して cnncodegen を呼び出します。以下に例を示します。

    net = googlenet;
    cnncodegen(net,'targetlib','mkldnn');

生成コード

cnncodegen コマンドは、C++ コードおよび makefile cnnbuild_rtw.mk を生成します。生成されたファイルは codegen フォルダーにあります。

ネットワークは、層のクラスの配列を含む C++ クラスとして生成されます。このクラスの setup() メソッドは、ハンドルを設定し、ネットワーク オブジェクトの各層にメモリを割り当てます。predict() メソッドは、ネットワークの各層の予測を呼び出します。

バイナリ ファイルは、ネットワークの全結合層および畳み込み層などの層に対してエクスポートされます。たとえば、ファイル cnn_CnnMain_conv*_w および cnn_CnnMain_conv*_b は、ネットワークの畳み込み層の重みパラメーターおよびバイアス パラメーターに対応します。

参考

| | | |

関連するトピック