ARM Mali GPU をターゲットとする深層学習ネットワークのコード生成
GPU Coder™ を使用して、Deep Learning Toolbox™ からさまざまな事前学習済みの深層学習ネットワークの予測に対する最適化されたコードを生成できます。生成コードでは、アーキテクチャを使用した深層畳み込みニューラル ネットワーク (CNN)、層、および入力オブジェクト (SeriesNetwork (Deep Learning Toolbox) または DAGNetwork (Deep Learning Toolbox)) で指定したパラメーターが実装されます。コード ジェネレーターはコンピューター ビジョンおよび機械学習用の ARM® Compute Library を利用します。ARM Mali GPU ターゲットで深層学習を実行するために、ホスト開発コンピューターでコードを生成します。次に、実行可能プログラムをビルドして実行するために、生成されたコードを ARM ターゲット プラットフォームに移動します。たとえば、HiKey960 は生成されたコードを実行できるターゲット プラットフォームの 1 つです。
要件
Deep Learning Toolbox.
Deep Learning Toolbox Model for MobileNet-v2 Network サポート パッケージ。
GPU Coder Interface for Deep Learning サポート パッケージ。サポート パッケージをインストールするには、MATLAB® の [アドオン] メニューでサポート パッケージを選択します。
コンピューター ビジョンおよび機械学習用の ARM Compute Library をターゲット ハードウェアにインストールしなければなりません。サポートされているコンパイラおよびライブラリのバージョンの詳細については、前提条件となる製品のインストールを参照してください。
コンパイラおよびライブラリの環境変数。詳細については、環境変数の設定を参照してください。
事前学習済みのネットワークの読み込み
事前学習済みの MobileNet-v2 ネットワークを読み込みます。イメージ分類用の異なる事前学習済みネットワークの読み込みを選択できます。必要なサポート パッケージがインストールされていない場合、ダウンロード用リンクが表示されます。
net = mobilenetv2;
オブジェクト
netにはDAGNetworkオブジェクトが格納されています。関数analyzeNetwork(Deep Learning Toolbox) を使用して、ネットワーク アーキテクチャを対話的に可視化して表示し、ネットワークに関するエラーや問題を検出して、ネットワーク層についての詳細情報を表示します。層の情報には、層の活性化と学習可能なパラメーターのサイズ、学習可能なパラメーターの総数、および再帰層の状態パラメーターのサイズが含まれます。analyzeNetwork(net);

分類するイメージのサイズは、ネットワークの入力サイズと同じでなければなりません。GoogLeNet の場合、
imageInputLayer(Deep Learning Toolbox) のサイズは 224 x 224 x 3 です。出力ClassificationOutputLayer(Deep Learning Toolbox) のClassesプロパティには、ネットワークによって学習されたクラスの名前が含まれています。合計 1000 個のクラス名のうち 10 個をランダムに表示します。classNames = net.Layers(end).Classes; numClasses = numel(classNames); disp(classNames(randperm(numClasses,10)))
cock apiary soap dispenser titi car wheel guenon muzzle agaric buckeye megalith詳細については、深層学習層の一覧 (Deep Learning Toolbox)を参照してください。
cnncodegen を使用したコード生成
ARM Compute Library を使ってコードを生成するには、cnncodegen コマンドの targetlib オプションを使用します。cnncodegen コマンドは SeriesNetwork または DAGNetwork ネットワーク オブジェクトの C++ コードを生成します。
'arm-compute-mali'として指定された'targetlib'をもつcnncodegenを呼び出します。以下に例を示します。net = googlenet; cnncodegen(net,'targetlib','arm-compute-mali','batchsize',1);
'arm-compute-mali'の場合、batchsizeの値は1でなければなりません。ARM Compute Library のライブラリ固有のパラメーターを指定できる
'targetparams'の名前と値のペアの引数は、ARM Mali GPU をターゲットとする場合、適用されません。cnncodegenコマンドは、コード、makefile、cnnbuild_rtw.mk、およびその他のサポート ファイルを生成して、ターゲット ハードウェアに生成されたコードをビルドします。コマンドはすべての生成されたファイルをcodegenフォルダーに配置します。predictを呼び出す C++ main 関数を作成します。生成されたコードと統合するメイン ファイルの例については、ARM Mali GPU での深層学習の予測を参照してください。優先する Secure File Copy (SCP) と Secure Shell (SSH) クライアントを使用して、生成された
codegenフォルダーとその他のファイルをホスト開発コンピューターから ARM ハードウェアに移動します。ターゲットで実行可能プログラムをビルドします。
生成コード
DAG ネットワークは、103 個の層クラスから成る配列を含む C++ クラス (CnnMain) として生成されます。コード ジェネレーターは畳み込み層とバッチ正規化層のレイヤー フュージョン最適化で層の数を削減します。cnn_exec.hpp ファイルからのクラス宣言のスニペットが表示されます。
このクラスの
setup()メソッドは、ハンドルを設定し、ネットワーク オブジェクトの各層にメモリを割り当てます。predict()メソッドは、ネットワーク内の 103 個の層それぞれについて予測を呼び出します。cnn_exec.cppファイルにはCnnMainクラスのオブジェクト関数の定義が含まれます。
バイナリ ファイルは、ネットワーク内の全結合層や畳み込み層などのパラメーターを持つ層に対してエクスポートされます。たとえば、ファイル cnn_CnnMain_Conv*_w および cnn_CnnMain_Conv*_b は、ネットワーク内の convolutional 層の重みとバイアス パラメーターに対応します。コード ジェネレーターは、これらのバイナリ ファイルを codegen フォルダーに配置します。コード ジェネレーターはライブラリ ファイル cnnbuild をビルドし、生成されたすべてのファイルを codegen フォルダーに配置します。
制限
ARM Mali GPU のコード生成は、
'channel-wise'として設定されたNumGroupsプロパティまたは 2 を超える値をもつ 2 次元のグループ化された畳み込み層でサポートされません。
