このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
コード生成のためのネットワークの解析
関数 analyzeNetworkForCodegen
を使用して、深層学習ネットワークのコード生成互換性を解析できます。ネットワーク コード生成アナライザーを使用して、非ライブラリ ターゲットおよびライブラリ ターゲットの SeriesNetwork
、DAGNetwork
、および dlnetwork
を検証し、コード生成前に問題を検出します。サポートされているライブラリ ターゲットには、MKL-DNN
、ARM Compute
、CMSIS-NN
、ARM Compute Mali
、cuDNN
、および 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)
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 type(s). View incompatible layer types." mkldnn "Yes" "" "" cmsis-nn "No" "Found 1 issue(s). View network diagnostics." "Found 2 unsupported layer type(s). 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
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);
検証イメージの分類と精度の計算
学習済みネットワークを使用して検証データのラベルを予測し、最終検証精度を計算します。精度とは、ネットワークによって予測が正しく行われるラベルの割合です。この場合、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
は問題を報告しません。これで、ネットワークはコード生成の準備が整いました。