Main Content

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

Deep Neural Networks ライブラリを使用した Simulink の深層学習

Simulink® のモデルでは、さまざまな学習済み深層学習ネットワークの予測および検出のために最適化されたコードを生成できます。Deep Neural Networks ブロック ライブラリを使用すると、Simulink 環境内から予測または分類を実行できます。

Deep Neural Networks ブロック ライブラリには次のものがあります。

  • Predict (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済みネットワークを使用して応答を予測します。このブロックでは、MAT ファイルまたは MATLAB® 関数から事前学習済みネットワークを Simulink モデルに読み込むことができます。

    Predict ブロックの使用方法の詳細については、深層学習を使用した Simulink での車線検出と車両検出 (Deep Learning Toolbox)を参照してください。

  • Image Classifier (Deep Learning Toolbox) ブロック — ブロック パラメーターで指定された学習済み深層学習ニューラル ネットワークを使用してデータを分類します。このブロックでは、MAT ファイルまたは MATLAB 関数から事前学習済みネットワークを Simulink モデルに読み込むことができます。

    Image Classifier ブロックの使用方法の詳細については、深層学習を使用した Simulink での ECG 信号の分類 (Deep Learning Toolbox)を参照してください。

生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (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 モデルを作成し、[Deep Neural Networks] ライブラリから Predict ブロックを挿入します。

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

    Simulink model containing blocks for classifying images using GoogLeNet.

  3. Predict ブロックの 1 つをダブルクリックします。[ネットワーク][MATLAB 関数からのネットワーク] を選択し、[MATLAB 関数][googlenet] を選択します。

  4. これらのブロックを、次の図に示すように接続します。モデルを 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');
    predict_scores = out.yPred.Data(:,:,1);
    [scores,indx] = sort(predict_scores,'descend');
    classNamesTop = classNames(indx(1:5))
    
    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. [コード生成] ペインを選択します。[システム ターゲット ファイル][grt.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 ブロックの使用はサポートされていません。

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

参考

関数

関連するトピック