Main Content

MATLAB Function ブロックを使用した深層学習ネットワークのコードの生成

さまざまな学習済み深層学習ネットワークを含む Simulink® モデルの最適化されたコードを生成できます。Simulink に深層学習機能を実装するには、MATLAB Function ブロックを使用するか、Deep Neural Networks ライブラリのブロックを使用します。MATLAB® Function ブロックを使用して深層学習機能を実装する場合は、関数 coder.loadDeepLearningNetwork を使用して学習済み深層学習ネットワークを読み込み、ネットワーク オブジェクトのオブジェクト関数を使用して目的の応答を得ます。Intel® Math Kernel Library for Deep Neural Networks (MKL-DNN) を利用するようにコード ジェネレーターを構成できます。サードパーティ ライブラリに依存しない汎用の C または C++ コードの生成もできます。生成コードは、ネットワーク オブジェクトで指定したアーキテクチャ、層、およびパラメーターを使用して、深層畳み込みニューラル ネットワーク (CNN) を実装します。

GoogLeNet を使用したイメージの分類

GoogLeNet は、深さが 22 層の畳み込みニューラル ネットワークです。このネットワークは百万を超えるイメージで学習済みであり、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、動物など) に分類できます。このネットワークは入力としてイメージを受け取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率とともに出力します。この例では、事前学習済みの GoogLeNet 深層畳み込みニューラル ネットワーク用にシミュレーションを実行して C++ コードを生成し、イメージを分類する方法について説明します。

  1. 事前学習済みの GoogLeNet ネットワークを読み込みます。イメージ分類用に別の事前学習済みのネットワークを読み込むこともできます。この関数を使用するには、Deep Learning Toolbox™ Model for GoogLeNet Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合は、この関数でダウンロード リンクが示されます。

    net = googlenet;

  2. オブジェクト net には DAGNetwork オブジェクトが含まれます。この関数を使用してネットワーク アーキテクチャの対話式の可視化を表示し、ネットワーク内のエラーや問題を検出し、ネットワーク層に関する詳細情報を表示します。層情報には、層の活性化および学習可能なパラメーターのサイズ、学習可能なパラメーターの合計数、および再帰層の状態パラメーターのサイズが含まれています。

    analyzeNetwork(net);

    Interactive visualization of the GoogLeNet network architecture

  3. 分類するイメージのサイズはネットワークの入力サイズと同じでなければなりません。GoogLeNet では、imageInputLayer のサイズは 224×224×3 です。出力 classificationLayerClasses プロパティには、ネットワークで学習したクラスの名前が含まれます。合計 1000 個のクラス名からランダムに 10 個のクラス名を表示します。

    classNames = net.Layers(end).Classes;
    numClasses = numel(classNames);
    disp(classNames(randperm(numClasses,10)))
    speedboat 
    window screen 
    isopod 
    wooden spoon 
    lipstick 
    drake 
    hyena 
    dumbbell 
    strawberry 
    custard apple 

GoogLeNet モデルの作成

  1. Simulink モデルを作成し、User-Defined Functions ライブラリの MATLAB Function ブロックを挿入します。

  2. Computer Vision Toolbox™ ライブラリの Image From File ブロックを追加し、File name パラメーターを peppers.png に設定します。

  3. Computer Vision Toolbox ライブラリの Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを [出力行と出力列の数] に設定し、[出力行と出力列の数] の値として「[224 224]」と入力します。このブロックは、入力イメージのサイズをネットワークの入力層のサイズに変更します。

    Simulink model containing blocks for classifying images using GoogLeNet.

  4. MATLAB Function ブロックをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターで表示されます。

  5. 予測エントリポイント関数を実装する googlenet_predict という名前の関数を定義します。関数ヘッダーは関数 googlenet_predict への引数として in を宣言し、戻り値として scores および indxTop を指定します。

    function [scores,indxTop] = googlenet_predict(in) %#codegen
    
    persistent mynet;
    
    if isempty(mynet)
        mynet = coder.loadDeepLearningNetwork('googlenet');
    end
    
    % pass in input   
    predict_scores = predict(mynet,in);
    [scores,indx] = sort(predict_scores, 'descend');
    indxTop = indx(1:5);
    

    永続オブジェクト mynetDAGNetwork オブジェクトを読み込みます。エントリポイント関数の最初の呼び出しで、永続オブジェクトが作成および設定されます。関数の後続の呼び出しでは、同じオブジェクトを再利用して入力に対して predict を呼び出すことで、ネットワーク オブジェクトの再作成と再読み込みを回避します。

    特定の層のネットワーク活性化に activations (Deep Learning Toolbox) メソッドを使用できます。たとえば、次のコードの行は、layerIdx で指定された層のネットワーク活性化を返します。

    out = activations(mynet,in,layerIdx,'OutputAs','Channels');
    

    classify (Deep Learning Toolbox) メソッドを使用して、学習済みネットワーク mynetin のイメージ データのクラス ラベルを予測できます。

    [out,scores] = classify(mynet,in);
    

    LSTM ネットワークに対しては、predictAndUpdateState (Deep Learning Toolbox) メソッドと resetState (Deep Learning Toolbox) メソッドを使用できます。

  6. MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化][再利用可能な関数] を選択します。

  7. これらのブロックを、ブロック線図に示すように接続します。モデルを googlenetModel として保存します。

    Simulink model showing connection between the blocks.

モデルのシミュレーション

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを選択します。[タイプ] パラメーターを Fixed-step に設定します。この設定により、コード生成に必要な一定の (固定) ステップ サイズが維持されます。

  2. [シミュレーション ターゲット] ペインを選択します。[言語][C++] に設定します。

  3. [シミュレーション ターゲット] ペインの [深層学習] グループで [ターゲット ライブラリ] パラメーターを [MKL-DNN] に設定します。

  4. [OK] をクリックして保存し、[コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  5. モデルをビルドしてシミュレートするには、以下のコマンドを使用します。

    out = sim('googlenetModel');

  6. 上位 5 つの予測ラベルとそれらに対応する確率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクト カテゴリに分類しますが、多くのカテゴリは似ているため、ネットワークを評価するときは、通常、上位 5 つの精度を考慮します。このネットワークは高い確率でこのイメージをピーマンとして分類します。

    im = imread('peppers.png');
    classNamesTop = classNames(out.yout{2}.Values.Data(:,:,1))
    
    h = figure;
    h.Position(3) = 2*h.Position(3);
    ax1 = subplot(1,2,1);
    ax2 = subplot(1,2,2);
    
    image(ax1,im);
    barh(ax2,out.yout{1}.Values.Data(1,5:-1:1,1))
    xlabel(ax2,'Probability')
    yticklabels(ax2,classNamesTop(5:-1:1))
    ax2.YAxisLocation = 'right';
    sgtitle('Top 5 predictions using GoogLeNet')
    

    Simulink model showing connection between the blocks.

コードの生成

  1. Simulink Coder アプリまたは Embedded Coder アプリを開きます。[C コード] タブが開きます。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスで、Simulink Coder™ のライセンスがある場合は、[システム ターゲット ファイル][grt.tlc] に設定します。Embedded Coder® がある場合は、[システム ターゲット ファイル] パラメーターを [ert.tlc] に設定します。

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

  4. [コード生成のみ] を選択します。

  5. [コード生成][インターフェイス] ペインの [深層学習] グループで [ターゲット ライブラリ][MKL-DNN] に設定します。

  6. [MAT ファイルのログ] パラメーターの選択を解除します。

  7. [OK] をクリックして保存し、[コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。

  8. [C++ コード] アプリで、[コード生成] をクリックします。

参考

(Deep Learning Toolbox) | (Computer Vision Toolbox) |

関連するトピック