コード生成後のネットワーク パラメーターの更新
この例では、ネットワークのコードを再生成せずに、深層学習ネットワークの学習可能なパラメーターと状態パラメーターを更新する方法を示します。SeriesNetwork、DAGNetwork、および dlnetwork のネットワーク パラメーターを更新できます。
パラメーターの更新は、NVIDIA® CUDA® Deep Neural Network library (cuDNN) および NVIDIA TensorRT™ 高性能推論ライブラリについての MEX コード生成およびスタンドアロン コード生成をサポートします。
エントリポイント関数の作成
MATLAB® で次を行うエントリポイント関数を記述します。
関数
coder.loadDeepLearningNetworkを使用して深層学習モデルを読み込みます。詳細については、コード生成用の事前学習済みのネットワークの読み込みを参照してください。predict(Deep Learning Toolbox) を呼び出して応答を予測する。
以下に例を示します。
function out = mLayer(in, matFile) myNet = coder.loadDeepLearningNetwork(coder.const(matFile)); out = myNet.predict(in);
ネットワークの作成
この例で使用されるネットワークには、サイズが 4 x 5 x 3 の入力イメージが必要です。サイズおよび形式がネットワーク入力と同じであるサンプルのネットワーク入力を作成します。
inputSize = [4 5 3]; im = dlarray(rand(inputSize, 'single'), 'SSCB');
ネットワーク アーキテクチャを定義します。
outSize = 6;
layers = [
imageInputLayer(inputSize,'Name','input','Normalization','none')
convolution2dLayer([3 3], 5, 'Name', 'conv-1')
batchNormalizationLayer('Name', 'batchNorm')
reluLayer('Name','relu1')
transposedConv2dLayer([2 2], 5, 'Name', 'transconv')
convolution2dLayer([2 2], 5, 'Name', 'conv2')
reluLayer('Name','relu2')
fullyConnectedLayer(outSize, 'Name', 'fc3')
];
層グラフから初期化済みの dlnetwork オブジェクトを作成します。
rng(0); dlnet1 = dlnetwork(layers); save('trainedNet.mat', 'dlnet1');
codegen を使用したコード生成
出力ファイル名、場所、タイプなどのビルド設定を構成するには、コーダー構成オブジェクトを作成します。このオブジェクトを作成するには、関数
coder.gpuConfigを使用します。cuDNN のコード生成パラメーターを指定するには、
DeepLearningConfigプロパティを、coder.DeepLearningConfigを使用して作成したcoder.CuDNNConfigオブジェクトに設定します。cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('TargetLibrary', 'cudnn') cfg.DeepLearningConfig.AutoTuning = true; cfg.DeepLearningConfig.DataType = 'fp32';
入力を指定します。
cnnMatFile = fullfile(pwd, 'trainedNet.mat'); inputArgs = {im, coder.Constant(cnnMatFile)};codegenコマンドを実行します。codegenコマンドは MATLAB エントリポイント関数mLayers.mから CUDA コードを生成します。codegen -config cfg mLayer -args inputArgs -report
生成された MEX の実行
入力イメージで predict を呼び出し、結果を MATLAB で比較します。
out = mLayer_mex(im,cnnMatFile) out_MATLAB = mLayer(im,cnnMatFile)
out1 =
6(C) x 1(B) single dlarray
-0.0064
-0.1422
-0.0897
0.2223
0.0329
0.0365
out_MATLAB =
6(C) x 1(B) single dlarray
-0.0064
-0.1422
-0.0897
0.2223
0.0329
0.0365
異なる学習可能なパラメーターでのネットワークの更新
dlnetwork を再初期化して、学習可能なパラメーターを異なる値に更新します。
rng(10); dlnet2 = dlnetwork(layers); save('trainedNet.mat', 'dlnet2');
関数 coder.regenerateDeepLearningParameters を使用して、ネットワークの新しい学習可能なパラメーターと状態パラメーターに基づいてバイアス ファイルを再生成します。
関数 coder.regenerateDeepLearningParameters への最初の入力は、SeriesNetwork、DAGNetwork、または dlnetwork オブジェクトです。2 番目の引数は、コード生成時に出力されるネットワーク パラメーター情報ファイルへのパスです。オプションで、NetworkName=MYNET の名前と値のペアの引数を指定して、生成コードにおけるネットワークの C++ クラス名を指定できます。
codegenDir = fullfile(pwd, 'codegen/mex/mLayer');
networkFileNames = (coder.regenerateDeepLearningParameters(dlnet2, codegenDir))'
関数 coder.regenerateDeepLearningParameters は、ネットワークの学習可能なパラメーターと状態パラメーターが格納されたファイルの cell 配列を返します。
networkFileNames =
8×1 cell array
{'cnn_trainedNet0_0_conv-1_b.bin' }
{'cnn_trainedNet0_0_conv-1_w.bin' }
{'cnn_trainedNet0_0_conv2_b.bin' }
{'cnn_trainedNet0_0_conv2_w.bin' }
{'cnn_trainedNet0_0_fc3_b.bin' }
{'cnn_trainedNet0_0_fc3_w.bin' }
{'cnn_trainedNet0_0_transconv_b.bin'}
{'cnn_trainedNet0_0_transconv_w.bin'}
メモ
MEX ワークフローでは、生成された MEX および関連する codegen フォルダーをある場所から別の場所に移動した場合、coder.regenerateDeepLearningParameters が、ネットワークの学習可能なパラメーターと状態パラメーターを含むファイルを新しい場所に再生成できません。coder.regenerateDeepLearningParameters の 'OverrideParameterFiles' パラメーターを true に設定して、関数 coder.regenerateDeepLearningParameters が、元の codegen の場所にネットワークの学習可能なパラメーターと状態パラメーターを含むファイルを再生成できるようにします。
スタンドアロン ワークフローでは、coder.regenerateDeepLearningParameters が、ネットワークの学習可能なパラメーターと状態パラメーターを含むファイルを新しい場所に再生成できます。
更新された学習可能なパラメーターを使用して生成された MEX の実行
入力イメージで predict を呼び出し、結果を MATLAB で比較します。
clear mLayer_mex;
outNew = mLayer_mex(im,cnnMatFile)
outNew_MATLAB = mLayer(im,cnnMatFile)
outNew =
6(C) x 1(B) single dlarray
0.1408
-0.0080
0.0342
-0.0065
0.1843
0.0799
outNew_MATLAB =
6(C) x 1(B) single dlarray
0.1408
-0.0080
0.0342
-0.0065
0.1843
0.0799制限
関数 coder.regenerateDeepLearningParameters を使用して更新できるのは、ネットワークの学習可能なパラメーターと状態パラメーターのみです。コード ジェネレーターがサポートしていない変更の場合、エラー メッセージがスローされます。たとえば、Leaky ReLU 層のスケール係数を変更した後に coder.regenerateDeepLearningParameters を使用した場合、スケール係数がネットワークの学習可能なパラメーターではないため、次のエラー メッセージがスローされます。
Network architecture has been modified since the last code generation. Unable to accommodate the provided network in the generated code. Regenerate code for the provided network to reflect changes in the network. For more information, see Limitations to Regenerating Network Parameters After Code Generation.
参考
関数
オブジェクト
SeriesNetwork(Deep Learning Toolbox) |DAGNetwork(Deep Learning Toolbox) |dlarray(Deep Learning Toolbox) |dlnetwork(Deep Learning Toolbox)