メインコンテンツ

コード生成のためのネットワークの解析

関数 analyzeNetworkForCodegen を使用して、深層学習ネットワークのコード生成互換性を解析できます。ネットワーク コード生成アナライザーを使用して、非ライブラリ ターゲットおよびライブラリ ターゲットの SeriesNetworkDAGNetwork、および dlnetwork を検証し、コード生成前に問題を検出します。サポートされているライブラリ ターゲットには、MKL-DNNARM ComputeCMSIS-NNARM Compute MalicuDNN、および TensorRT が含まれます。analyzeNetworkForCodegen が検出する問題には、コード生成でサポートされていない層、ネットワークの問題、組み込み層固有の問題、およびカスタム層の問題が含まれます。

関数 analyzeNetworkForCodegen には、MATLAB® Coder™ Interface for Deep Learning および GPU Coder™ Interface for Deep Learning サポート パッケージが必要です。サポート パッケージをダウンロードしてインストールするには、アドオン エクスプローラーを使用します。MathWorks GPU Coder Team および MathWorks MATLAB Coder Team からサポート パッケージをダウンロードすることもできます。

dlnetwork のコード生成互換性のチェック

この例では、関数 analyzeNetworkForCodegen を使用して、多入力 dlnetwork のコード生成互換性をチェックする方法を示します。

この例では、次のターゲットのコード生成サポートをチェックします。

  • ライブラリなしのコード生成。

  • ARM® Compute Library。

  • ARM Compute Library for Mali GPU。

  • Intel® Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)。

  • Common Microcontroller Software Interface Standard - Neural Network (CMSIS-NN) ライブラリ。

  • NVIDIA® CUDA® Deep Neural Network library (cuDNN)。

  • NVIDIA TensorRT 高性能深層学習推論オプティマイザーおよびランタイム ライブラリ。

ネットワーク アーキテクチャの定義

2 つの分岐をもつネットワークを構築します。このネットワークは 2 つの入力を取ります (各分岐から入力を 1 つずつ取ります)。加算層を使用して分岐を接続します。

layersBranch1 = [
    sequenceInputLayer(1,"Name","in1","Normalization","none")
    fullyConnectedLayer(32,"Name","fc_1")
    reluLayer("Name","relu_body1")
    lstmLayer(32,"Name","lstm", "OutputMode","last")
    fullyConnectedLayer(32,"Name","fc_3")
    reluLayer("Name","relu_body3")
    fullyConnectedLayer(4,"Name","output1")
    additionLayer(2,"Name","add")];

layersBranch2 = [
    imageInputLayer([5 5 3],"Name","in2","Normalization","none")
    fullyConnectedLayer(4,"Name","fc_1_b1")
    reluLayer("Name","output2")];

lgraph = layerGraph(layersBranch1);
lgraph = addLayers(lgraph, layersBranch2);
lgraph = lgraph.connectLayers('output2', 'add/in2');

figure
plot(lgraph)

Figure contains an axes object. The axes object contains an object of type graphplot.

dlnetwork を作成します。

dlnet = dlnetwork(lgraph);

コード生成のためのネットワークの解析

解析するターゲット ライブラリを指定し、mobilenetv2 に対して関数 analyzeNetworkForCodegen を実行します。関数 analyzeNetworkForCodegen には、"MATLAB® Coder™ Interface for Deep Learning" および "GPU Coder™ Interface for Deep Learning" サポート パッケージが必要です。必要なサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

targetLibraries = {'none','arm-compute','arm-compute-mali',...
    'mkldnn','cmsis-nn','cudnn', 'tensorrt'};
S = analyzeNetworkForCodegen(dlnet,TargetLibrary = targetLibraries);
                        Supported                                                                        NetworkDiagnostics                                                                                                                                                        LayerDiagnostics                                                                                
                        _________    ___________________________________________________________________________________________________________________________________________________________    _______________________________________________________________________________________________________________________________________________________________________________

    none                  "Yes"      ""                                                                                                                                                             ""                                                                                                                                                                             
    arm-compute           "Yes"      ""                                                                                                                                                             ""                                                                                                                                                                             
    arm-compute-mali      "No"       "Found 1 issue(s). View network diagnostics."    "Found 2 unsupported layer types. View incompatible layer types."
    mkldnn                "Yes"      ""                                                                                                                                                             ""                                                                                                                                                                             
    cmsis-nn              "No"       "Found 1 issue(s). View network diagnostics."    "Found 2 unsupported layer types. View incompatible layer types."
    cudnn                 "Yes"      ""                                                                                                                                                             ""                                                                                                                                                                             
    tensorrt              "Yes"      ""                                                                                                                                                             ""                                                                                                                                                                             

CMSIS-NN コード生成の層診断を表示します。

S(5).LayerDiagnostics
ans=4×3 table
     LayerName         LayerType              Diagnostics       
    ____________    _______________    _________________________

    "add"           "AdditionLayer"    "Unsupported layer type."
    "relu_body1"    "ReLULayer"        "Unsupported layer type."
    "relu_body3"    "ReLULayer"        "Unsupported layer type."
    "output2"       "ReLULayer"        "Unsupported layer type."

CMSIS-NN コード生成のネットワーク診断を表示します。

S(5).NetworkDiagnostics.Diagnostics
ans = 
"Code generation for cmsis-nn library does not support dlnetwork objects with combinations of sequence and non-sequence input layers. "

分類ネットワークのコード生成互換性の解析

この例では、深層学習分類用の単純な畳み込みニューラル ネットワークを作成し、ネットワークのコード生成互換性をテストする方法を示します。この例では、以下を実行する方法を示します。

  • イメージ データを読み込み、確認します。

  • ネットワーク アーキテクチャを定義します。

  • 学習オプションを指定し、ネットワークに学習させます。

  • 新しいデータのラベルを予測し、分類精度を計算します。

  • analyzeNetworkForCodegenを使用して、コード生成のために深層学習ネットワークを解析し、ネットワークと層の互換性の問題を報告。

関数 analyzeNetworkForCodegen には、"MATLAB® Coder™ Interface for Deep Learning" および "GPU Coder™ Interface for Deep Learning" サポート パッケージが必要です。必要なサポート パッケージをインストールするには、アドオン エクスプローラーを使用します。

イメージ データの読み込みと確認

数字の標本データをイメージ データストアとして読み込みます。データストアのイメージをいくつか表示します。

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true,'LabelSource','foldernames');

figure;
perm = randperm(10000,20);
for i = 1:20
    subplot(4,5,i);
    imshow(imds.Files{perm(i)});
end

Figure contains 20 axes objects. Hidden axes object 1 contains an object of type image. Hidden axes object 2 contains an object of type image. Hidden axes object 3 contains an object of type image. Hidden axes object 4 contains an object of type image. Hidden axes object 5 contains an object of type image. Hidden axes object 6 contains an object of type image. Hidden axes object 7 contains an object of type image. Hidden axes object 8 contains an object of type image. Hidden axes object 9 contains an object of type image. Hidden axes object 10 contains an object of type image. Hidden axes object 11 contains an object of type image. Hidden axes object 12 contains an object of type image. Hidden axes object 13 contains an object of type image. Hidden axes object 14 contains an object of type image. Hidden axes object 15 contains an object of type image. Hidden axes object 16 contains an object of type image. Hidden axes object 17 contains an object of type image. Hidden axes object 18 contains an object of type image. Hidden axes object 19 contains an object of type image. Hidden axes object 20 contains an object of type image.

digitData の最初のイメージのサイズを確認します。イメージはそれぞれ 28 x 28 x 1 ピクセルです。

img = readimage(imds,1);
size(img)
ans = 1×2

    28    28

データを学習データ セットと検証データ セットに分割し、学習セットの各カテゴリに 750 個のイメージが含まれ、検証セットに各ラベルの残りのイメージが含まれるようにします。

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');

ネットワーク アーキテクチャの定義

畳み込みニューラル ネットワーク アーキテクチャを定義します。

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,'PaddingValue',5,'Name','conv1')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same','Name','conv2')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same','Name','conv3')
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

学習オプションの指定とネットワークの学習

初期学習率を 0.01 としたモーメンタム項付き確率的勾配降下法 (SGDM) を使用して、ネットワークに学習させます。エポックの最大数を 4 に設定します。検証データと検証頻度を指定して、学習中にネットワークの精度を監視します。すべてのエポックでデータをシャッフルします。学習の進行状況プロットをオンにして、コマンド ウィンドウの出力をオフにします。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

layers、学習データ、および学習オプションによって定義されたアーキテクチャを使用して、ネットワークに学習させます。学習の進行状況プロットには、ミニバッチの損失と精度、および検証の損失と精度が表示されます。

net = trainNetwork(imdsTrain,layers,options);

Figure Training Progress (09-Aug-2025 14:16:36) contains 8 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 11 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 11 objects of type patch, text, line. Hidden axes object 3 contains 2 objects of type line, text. Hidden axes object 4 contains 2 objects of type line, text. Hidden axes object 5 contains 2 objects of type line, text. Hidden axes object 6 contains 2 objects of type line, text. Hidden axes object 7 contains 2 objects of type line, text. Hidden axes object 8 contains 2 objects of type line, text.

検証イメージの分類と精度の計算

学習済みネットワークを使用して検証データのラベルを予測し、最終検証精度を計算します。精度とは、ネットワークによって予測が正しく行われるラベルの割合です。この場合、99% を超える予測ラベルが検証セット内の真のラベルに一致しています。

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;

accuracy = sum(YPred == YValidation)/numel(YValidation)
accuracy = 
0.9904

コード生成のためのネットワークの解析

ネットワークのコード生成互換性をチェックするには、analyzeNetworkForCodegen を実行します。既定では、関数は既定の CPU と GPU 深層学習ライブラリ ターゲットから成るセットに対して検証を行います。analyzeNetworkForCodegen は、解析結果を含む 1 行 N 列の構造体を返します。

S = analyzeNetworkForCodegen(net)
                   Supported                                                                               LayerDiagnostics                                                                            
                   _________    _______________________________________________________________________________________________________________________________________________________________________

    none             "No"       "Found 1 issue(s) in 1 layer(s). View layer diagnostics."
    arm-compute      "No"       "Found 1 issue(s) in 1 layer(s). View layer diagnostics."
    mkldnn           "No"       "Found 1 issue(s) in 1 layer(s). View layer diagnostics."
    cudnn            "No"       "Found 1 issue(s) in 1 layer(s). View layer diagnostics."
    tensorrt         "No"       "Found 1 issue(s) in 1 layer(s). View layer diagnostics."
S=1×5 struct array with fields:
    TargetLibrary
    Supported
    NetworkDiagnostics
    LayerDiagnostics
    IncompatibleLayerTypes

cuDNN ターゲットのネットワークにある層の問題を表示するには、次のコマンドを使用します。または、View layer diagnostics ハイパーリンクをクリックして、層の問題を表示することもできます。

S(4).LayerDiagnostics
ans=1×3 table
    LayerName         LayerType                                                                            Diagnostics                                                                  
    _________    ____________________    _______________________________________________________________________________________________________________________________________________

     "conv1"     "Convolution2DLayer"    "Layer 'conv1' has a non-default padding value. Code generation for nnet.cnn.layer.Convolution2DLayer only supports padding value equal to 0. "

最初の convolution2dLayer (conv1) には非ゼロのパディング値があります。コード生成では、PaddingValue パラメーターは既定の値 0 と等しくなければなりません。

ネットワークの問題の修正と再学習

この例では、畳み込み層のパディング値をゼロに設定できます。

layers(2) = convolution2dLayer(3,8,'PaddingValue',0,'Name','conv1');

次の学習オプションを使用して、変更されたネットワークに再学習させます。

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','none');
net = trainNetwork(imdsTrain,layers,options);

変更されたネットワークのコード生成互換性をチェックします。

S = analyzeNetworkForCodegen(net)
                   Supported
                   _________

    none             "Yes"  
    arm-compute      "Yes"  
    mkldnn           "Yes"  
    cudnn            "Yes"  
    tensorrt         "Yes"  
S=1×5 struct array with fields:
    TargetLibrary
    Supported
    NetworkDiagnostics
    LayerDiagnostics
    IncompatibleLayerTypes

関数 analyzeNetworkForCodegen は問題を報告しません。これで、ネットワークはコード生成の準備が整いました。

参考

関数

トピック