深層学習ネットワークのコード生成
この例では、深層学習を使用するイメージ分類アプリケーションの CUDA コードを生成する方法を説明します。codegen
コマンドを使用し、イメージ分類ネットワークである ResNet を使用して予測を実行する MEX 関数を生成します。
サードパーティの必要条件
この例では、CUDA® MEX を生成します。以下のサードパーティ要件が適用されます。
CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA Toolkit。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェア (GPU Coder)と前提条件となる製品の設定 (GPU Coder)を参照してください。
GPU 環境の検証
関数coder.checkGpuInstall
(GPU Coder)を使用して、この例を実行するのに必要なコンパイラおよびライブラリが正しく設定されていることを検証します。
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'none'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
ResNet-50 ネットワークを使用したイメージの分類
ResNet-50 は、深さが 50 層の畳み込みニューラル ネットワークで、イメージを 1000 個のオブジェクト カテゴリに分類できます。MATLAB® 用の事前学習済み ResNet-50 モデルは、Deep Learning Toolbox™ Model for ResNet-50 Network サポート パッケージに含まれています。このサポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。
[net, classNames] = imagePretrainedNetwork('resnet50');
disp(net)
dlnetwork with properties: Layers: [176×1 nnet.cnn.layer.Layer] Connections: [191×2 table] Learnables: [214×3 table] State: [106×3 table] InputNames: {'input_1'} OutputNames: {'fc1000_softmax'} Initialized: 1 View summary with summary.
エントリポイント関数 resnet_predict
エントリポイント関数 resnet_predict.m
は、イメージ入力を受け取り、事前学習済み resnet50
深層学習ネットワークを使用して、イメージについて予測を実行します。この関数は永続オブジェクト dlnet
を使用して dlnetwork
オブジェクトを読み込み、それ以降の呼び出しではこの永続オブジェクトを予測に再利用します。このエントリポイント関数はimagePretrainedNetwork
を使用して、dlnetwork
オブジェクトを読み込み、入力イメージに対して予測を実行します。dlarray
オブジェクトはエントリポイント関数内で作成されます。エントリポイント関数への入力と出力のデータ型はプリミティブ型になります。詳細については、dlarray 用のコード生成 (GPU Coder)を参照してください。
type('resnet_predict.m')
function out = resnet_predict(in) %#codegen % Copyright 2020-2024 The MathWorks, Inc. persistent dlnet; dlIn = dlarray(in, 'SSC'); if isempty(dlnet) % Call the function resnet50 that returns a dlnetwork object % for ResNet-50 model. dlnet = imagePretrainedNetwork('resnet50'); end dlOut = predict(dlnet, dlIn); out = extractdata(dlOut); end
MEX コード生成の実行
エントリポイント関数 resnet_predict.m
用の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成します。関数coder.DeepLearningConfig
(GPU Coder)を使用して深層学習コード構成オブジェクトを作成し、それを GPU コード構成オブジェクトの DeepLearningConfig
プロパティに割り当てます。codegen
コマンドを実行し、入力サイズを 224×224×3 に指定します。この値はネットワークの入力層のサイズに対応します。
cfg = coder.gpuConfig('mex'); dlcfg = coder.DeepLearningConfig(TargetLibrary = "none"); cfg.DeepLearningConfig = dlcfg; codegen -config cfg resnet_predict -args {ones(224,224,3,'single')} -report
Code generation successful: View report
生成された MEX の実行
入力イメージに対して resnet_predict_mex
を呼び出します。
im = imread('peppers.png');
im = imresize(im, [224,224]);
predict_scores = resnet_predict_mex(single(im));
ラベルへの予測スコアのマッピングおよび出力の表示
上位 5 つの予測スコアとそのラベルを取得します。
[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,scores(5:-1:1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top Five Predictions That Use ResNet-50')
メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。
clear resnet_predict_mex;