Обновите сетевые параметры после генерации кода

В этом примере показано, как обновить настраиваемые параметры и параметры состояния нейронных сетей для глубокого обучения, не регенерируя код для сети. Можно обновить сетевые параметры для SeriesNetwork, DAGNetwork и dlnetwork.

Обновление параметра поддерживает MEX и автономную генерацию кода для Intel® Math Kernel Library для глубоких нейронных сетей (MKL-DNN) и ARM® Вычислите библиотеки.

Создайте функцию точки входа

  1. Напишите функцию точки входа в MATLAB® это:

    1. Использует coder.loadDeepLearningNetwork функционируйте, чтобы создать и настроить сетевой объект CNN. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.

    2. Вызовы predict (Deep Learning Toolbox), чтобы предсказать ответы.

  2. Например:

    function out = mLayer(in, matFile)
    
    myNet = coder.loadDeepLearningNetwork(coder.const(matFile));
    
    out = myNet.predict(in); 
    

Создайте сеть

Сеть, используемая в этом примере, требует входных изображений размера 4 5 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.CodeConfig функция.

  2. Чтобы задать параметры генерации кода для MKL-DNN, установите DeepLearningConfig свойство к coder.MklDNNConfig возразите, что вы создаете с coder.DeepLearningConfig

    cfg = coder.CodeConfig('mex');
    cfg.TargetLang = 'C++';
    cfg.DeepLearningConfig = coder.DeepLearningConfig('TargetLibrary', 'mkldnn')
    

  3. Задайте входные параметры.

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

  4. Запустите codegen команда. codegen команда генерирует CUDA® код от mLayers.m Функция точки входа MATLAB.

    codegen -config cfg mLayers -args inputArgs -report
    

Запустите сгенерированный MEX

Вызов предсказывает на входе, отображают и сравнивают результаты с 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 обновить learnables к различным значениям.

rng(10);
dlnet2 = dlnetwork(layers);
save('trainedNet.mat', 'dlnet2');

Используйте coder.regenerateDeepLearningParameters функция, чтобы регенерировать файлы смещения на основе нового learnables и состояний сети.

Первый вход к coder.regenerateDeepLearningParameters функцией является SeriesNetwork, DAGNetwork или dlnetwork объект. Второй аргумент является путем к сетевым файлам информации о параметре, испускаемым во время генерации кода. Можно опционально задать NetworkName=MYNET аргумент, чтобы задать имя класса C++ для сети в сгенерированном коде.

codegenDir = fullfile(pwd, 'codegen/mex/mLayer');
networkFileNames = (coder.regenerateDeepLearningParameters(dlnet2, codegenDir))'

coder.regenerateDeepLearningParameters функция возвращает массив ячеек файлов, содержащих сеть learnables и состояния.

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 с обновленным Learnables

Вызов предсказывает на входе, отображают и сравнивают результаты с 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

Ограничения

Только сеть learnables и состояния могут быть обновлены при помощи coder.regenerateDeepLearningParameters функция. Для модификаций, которые не поддерживает генератор кода, выдано сообщение об ошибке. Например, использование coder.regenerateDeepLearningParameters после изменения масштабного коэффициента текучего слоя ReLU выдает следующее сообщение об ошибке, когда масштабным коэффициентом не является learnable сеть.

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.

Смотрите также

Функции

Объекты

Связанные примеры

Больше о