Main Content

コード生成後のネットワーク パラメーターの更新

この例では、ネットワークのコードを再生成せずに、深層学習ネットワークの学習可能パラメーターと状態パラメーターを更新する方法を示します。SeriesNetworkDAGNetwork、および dlnetwork のネットワーク パラメーターを更新できます。

パラメーターの更新は、NVIDIA® CUDA® Deep Neural Network library (cuDNN) および NVIDIA TensorRT™ 高性能推論ライブラリについての MEX コード生成およびスタンドアロン コード生成をサポートします。

エントリポイント関数の作成

  1. MATLAB® で次を行うエントリポイント関数を記述します。

    1. 関数 coder.loadDeepLearningNetwork を使用して深層学習モデルを読み込みます。詳細については、コード生成用の事前学習済みのネットワークの読み込みを参照してください。

    2. predict (Deep Learning Toolbox) を呼び出して応答を予測する。

  2. 次に例を示します。

    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 を使用したコード生成

  1. 出力ファイル名、場所、タイプなどのビルド設定を構成するには、コーダー構成オブジェクトを作成します。このオブジェクトを作成するには、関数 coder.gpuConfig を使用します。

  2. 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';
    

  3. 入力を指定します。

    cnnMatFile = fullfile(pwd, 'trainedNet.mat');
    inputArgs = {im, coder.Constant(cnnMatFile)};
    

  4. 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 への最初の入力は、SeriesNetworkDAGNetwork、または 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.

参考

関数

オブジェクト

関連するトピック