Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

MATLAB Function ブロックを使用した Simulink の深層学習

Simulink® のモデルでは、さまざまな学習済み深層学習ネットワークの予測および検出のために最適化されたコードを生成できます。MATLAB Function (Simulink) ブロックには、関数 coder.loadDeepLearningNetwork を使用して、深層学習モデルの読み込みおよび CNN クラスの作成と設定をするコードが含まれています。またこのコードには、応答を予測または検出する関数である predictdetect の呼び出しが含まれています。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、および入力オブジェクト (SeriesNetwork (Deep Learning Toolbox) または DAGNetwork (Deep Learning Toolbox)) で指定したパラメーターが実装されます。

NVIDIA® GPU 向けの NVIDIA CUDA® Deep Neural Network library (cuDNN) および TensorRT™ の高性能な推論ライブラリを利用するようにコード ジェネレーターを構成できます。

Intel® プロセッサをターゲットとするときに Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) を利用するか、ARM® プロセッサをターゲットとするときにコンピューター ビジョンおよび機械学習用の ARM Compute Library を利用するようにコード ジェネレーターを構成できます。

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

GoogLeNet は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、動物など) に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。この例では、シミュレーションを実行して事前学習済みの googlenet 深層畳み込みニューラル ネットワークの CUDA コードを生成し、イメージを分類する方法を示します。事前学習済みモデルは、Deep Learning Toolbox™ のサポート パッケージとして利用可能です。

  1. 事前学習済みの GoogLeNet ネットワークを読み込みます。イメージ分類用の異なる事前学習済みネットワークの読み込みを選択できます。必要なサポート パッケージがインストールされていない場合は、示される手順に従ってソフトウェアをインストールしてください。

    net = googlenet;
    

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

    analyzeNetwork(net);
    

    Analyze network app showing network analysis of GoogLeNet.

  3. 分類するイメージのサイズは、ネットワークの入力サイズと同じでなければなりません。GoogLeNet の場合、imageInputLayer のサイズは 224 x 224 x 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 モデルを作成し、[ユーザー定義関数] ライブラリから MATLAB Function ブロックを挿入します。

  2. [Computer Vision Toolbox™] ライブラリから Image From File (Computer Vision Toolbox) ブロックを追加し、File name パラメーターを [peppers.png] に設定します。[Computer Vision Toolbox] ライブラリから Resize (Computer Vision Toolbox) ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを [出力行と出力列の数] に設定し、[出力行と出力列の数] の値として「[224 224]」を入力します。このブロックにより、入力イメージのサイズがネットワークの入力層のサイズに変更されます。

    Simulink model containing blocks for classifying images using GoogLeNet.

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

  4. 予測エントリポイント関数を実装する、googlenet_predict という関数を定義します。関数ヘッダーは in を関数 googlenet_predict の引数として宣言し、scoresindxTop を戻り値として宣言します。エディター ドキュメントをファイルに保存します。

    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 に同じオブジェクトが再利用され、ネットワーク オブジェクトの再構成と再読み込みが回避されます。

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

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

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

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

    LSTM ネットワークに対しては、predictAndUpdateState (Deep Learning Toolbox) メソッドと resetState (Deep Learning Toolbox) メソッドも使用できます。これらのメソッドの使用上の注意および制限については、サポートされる関数を参照してください。

  7. MATLAB Function ブロックを右クリックし、[ブロック パラメーター (Subsystem)] を選択します。

  8. [コード生成] タブで、[関数のパッケージ化] について [再利用可能な関数] を選択します。

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

    Simulink model showing connection between the blocks.

GPU による高速化のためのモデルの構成

モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決定します。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成しなければなりません。次の表に、この例のソルバー構成を示します。

    パラメーター設定生成されたコードに対する影響
    タイプ固定ステップコード生成に必要である、一定の (固定) ステップ サイズを維持します。
    ソルバー離散 (連続状態なし)モデルの状態微分の計算に固定ステップ積分手法を適用します。
    固定ステップ サイズautoSimulink によりステップ サイズが選択されます。

    Snapshot of the configuration parameters dialog showing solver options for simulation.

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

  3. [GPU による高速化] を選択します。GPU Coder™ 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例の目的上、これらのパラメーターの既定値を使用できます。

    GPU Acceleration pane on the configuration parameters dialog of the model.

  4. [シミュレーション ターゲット] ペインを表示します。[深層学習] グループの [ターゲット ライブラリ][cuDNN] を設定します。[TensorRT] も選択できます。

    Snapshot of the configuration parameters dialog showing deep learning options for simulation acceleration.

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

  6. 関数 set_param を使用して、MATLAB® コマンド ウィンドウからモデル パラメーターをプログラムで構成できます。次に例を示します。

    set_param('googlenetModel','GPUAcceleration','on');
    

GPU により高速化されたモデルのビルド

  1. GPU により高速化されたモデルをビルドしてシミュレートするために、[シミュレーション] タブの [実行] を選択するか、次のコマンドを実行することによってモデルを開始できます。

    sim('googlenetModel');
    

    上記を MATLAB プロンプトで実行します。

    ソフトウェアはまず、モデルに対して CUDA/C++ コードが以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA/C++ コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを slprj/_slprj/googlenetModel という名前の作業フォルダーのサブフォルダーに配置します。

  2. 上位 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')
    

コード生成用のモデルの構成

モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのさまざまなオプションを指定できます。

  1. [コード生成] ペインを選択します。[システム ターゲット ファイル][ert.tlc] に変更します。Embedded Coder® のターゲットファイル [ert.tlc] を使用することもできます。

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

  3. [GPU コードの生成] を選択します。GPU Coder 固有のオプションが、[コード生成]、[GPU コード] ペインに表示されます。

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

  5. [ツールチェーン] を選択します。Linux® プラットフォームの場合は [NVIDIA CUDA | gmake (64-bit Linux)] を選択します。Windows® システムの場合は [NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)] を選択します。

  6. [コード生成]、[レポート] ペインで [コード生成レポートを作成][レポートを自動的に開く] を選択します。

  7. [コード生成]、[インターフェイス] ペインで、[深層学習] グループの [ターゲット ライブラリ][cuDNN] に設定します。[TensorRT] も選択できます。

  8. この例の目的上、[コード生成]、[GPU コード] ペインで GPU 固有のパラメーターの既定値を使用できます。

    GPU Code pane on the configuration parameters dialog of the model.

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

  10. set_param を使用して、MATLAB コマンド ウィンドウからモデル パラメーターをプログラムで構成することもできます。次に例を示します。

    set_param('googlenetModel','GenerateGPUCode','CUDA');
    

モデルの CUDA コードの生成

  1. Simulink エディターで、Simulink Coder アプリを開きます。

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

    診断ビューアーにメッセージが表示されます。コード ジェネレーターにより、CUDA ソース ファイルおよびヘッダー ファイルと HTML コード生成レポートが作成されます。コード ジェネレーターは実行可能ファイルを "ビルド フォルダー" (現在の作業フォルダーの中の googlenetModel_grt_rtw という名前のサブフォルダー) に配置します。

  3. 生成された CUDA コードの例。

     googlenetModel.cu

制限

  • カスタム層をもつ深層学習ネットワークのコード生成は Simulink ではサポートされていません。

  • Intel Math Kernel Library for Deep Neural Networks (MKL-DNN) を使用するには、C++11 標準が必要です。[深層学習] グループの [ターゲット ライブラリ][MKL-DNN] に設定すると、C++11 コードが自動的に生成されます。

  • Stateflow® チャートでの MATLAB Function ブロックの使用はサポートされていません。

  • [GPU による高速化] が有効な場合、コード ジェネレーターでは、カスタム作成された CUDA ソース ファイル (*.cu) のインポートに対する [カスタム コードのインポート] はサポートされません。代わりに、MATLAB Function ブロック内で coder.ceval を使用します。

  • MATLAB Function ブロックでは、MATLAB 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、ブロックのドキュメンテーションを参照してください。

参考

関数

関連するトピック