このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
コード生成後のネットワーク パラメーターの更新
この例では、ネットワークのコードを再生成せずに、深層学習ネットワークの学習可能なパラメーターと状態パラメーターを更新する方法を示します。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)