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++ コードを生成し、イメージを分類する方法について説明します。
事前学習済みの GoogLeNet ネットワークを読み込みます。イメージ分類用に別の事前学習済みのネットワークを読み込むこともできます。この関数を使用するには、Deep Learning Toolbox™ Model for GoogLeNet Network サポート パッケージが必要です。このサポート パッケージがインストールされていない場合は、この関数でダウンロード リンクが示されます。
net = googlenet;
オブジェクト
net
にはDAGNetwork
オブジェクトが含まれます。この関数を使用してネットワーク アーキテクチャの対話式の可視化を表示し、ネットワーク内のエラーや問題を検出し、ネットワーク層に関する詳細情報を表示します。層情報には、層の活性化および学習可能なパラメーターのサイズ、学習可能なパラメーターの合計数、および再帰層の状態パラメーターのサイズが含まれています。analyzeNetwork(net);
分類するイメージのサイズはネットワークの入力サイズと同じでなければなりません。GoogLeNet では、
imageInputLayer
のサイズは 224×224×3 です。出力classificationLayer
のClasses
プロパティには、ネットワークで学習したクラスの名前が含まれます。合計 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 モデルの作成
Simulink モデルを作成し、User-Defined Functions ライブラリの MATLAB Function ブロックを挿入します。
Computer Vision Toolbox™ ライブラリの Image From File ブロックを追加し、
File name
パラメーターをpeppers.png
に設定します。Computer Vision Toolbox ライブラリの Resize ブロックをモデルに追加します。Resize ブロックの [指定] パラメーターを
[出力行と出力列の数]
に設定し、[出力行と出力列の数] の値として「[224 224]
」と入力します。このブロックは、入力イメージのサイズをネットワークの入力層のサイズに変更します。MATLAB Function ブロックをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターで表示されます。
予測エントリポイント関数を実装する
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);
永続オブジェクト
mynet
はDAGNetwork
オブジェクトを読み込みます。エントリポイント関数の最初の呼び出しで、永続オブジェクトが作成および設定されます。関数の後続の呼び出しでは、同じオブジェクトを再利用して入力に対してpredict
を呼び出すことで、ネットワーク オブジェクトの再作成と再読み込みを回避します。特定の層のネットワーク活性化に
activations
(Deep Learning Toolbox) メソッドを使用できます。たとえば、次のコードの行は、layerIdx
で指定された層のネットワーク活性化を返します。out = activations(mynet,in,layerIdx,'OutputAs','Channels');
classify
(Deep Learning Toolbox) メソッドを使用して、学習済みネットワークmynet
でin
のイメージ データのクラス ラベルを予測できます。[out,scores] = classify(mynet,in);
LSTM ネットワークに対しては、
predictAndUpdateState
(Deep Learning Toolbox) メソッドとresetState
(Deep Learning Toolbox) メソッドを使用できます。MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] に
[再利用可能な関数]
を選択します。これらのブロックを、ブロック線図に示すように接続します。モデルを
googlenetModel
として保存します。
モデルのシミュレーション
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを選択します。[タイプ] パラメーターを
Fixed-step
に設定します。この設定により、コード生成に必要な一定の (固定) ステップ サイズが維持されます。[シミュレーション ターゲット] ペインを選択します。[言語] を
[C++]
に設定します。[シミュレーション ターゲット] ペインの [深層学習] グループで [ターゲット ライブラリ] パラメーターを
[MKL-DNN]
に設定します。[OK] をクリックして保存し、[コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。
モデルをビルドしてシミュレートするには、以下のコマンドを使用します。
out = sim('googlenetModel');
上位 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 Coder アプリまたは Embedded Coder アプリを開きます。[C コード] タブが開きます。
[コンフィギュレーション パラメーター] ダイアログ ボックスで、Simulink Coder™ のライセンスがある場合は、[システム ターゲット ファイル] を
[grt.tlc]
に設定します。Embedded Coder® がある場合は、[システム ターゲット ファイル] パラメーターを[ert.tlc]
に設定します。[言語] を
[C++]
に設定します。[コード生成のみ] を選択します。
[コード生成] 、 [インターフェイス] ペインの [深層学習] グループで [ターゲット ライブラリ] を
[MKL-DNN]
に設定します。[MAT ファイルのログ] パラメーターの選択を解除します。
[OK] をクリックして保存し、[コンフィギュレーション パラメーター] ダイアログ ボックスを閉じます。
[C++ コード] アプリで、[コード生成] をクリックします。
参考
googlenet
(Deep Learning Toolbox) | Image From File (Computer Vision Toolbox) | MATLAB Function