Main Content

深層学習ネットワークのコード生成

この例では、深層学習を使用するイメージ分類アプリケーションの CUDA コードを生成する方法を説明します。codegen コマンドを使用し、イメージ分類ネットワークである ResNet を使用して予測を実行する MEX 関数を生成します。

サードパーティの必要条件

この例では、CUDA® MEX を生成します。以下のサードパーティ要件が適用されます。

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

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')

Figure contains 2 axes objects and another object of type subplottext. Axes object 1 contains an object of type image. Axes object 2 with xlabel Probability contains an object of type bar.

メモリに読み込まれた静的ネットワーク オブジェクトをクリアします。

clear resnet_predict_mex;

関連するトピック