В этом примере показано, как обновить настраиваемые параметры и параметры состояния нейронных сетей для глубокого обучения, не регенерируя код для сети. Можно обновить сетевые параметры для SeriesNetwork
, DAGNetwork
и dlnetwork
.
Обновление параметра поддерживает MEX и автономную генерацию кода для Intel® Math Kernel Library для глубоких нейронных сетей (MKL-DNN) и ARM® Вычислите библиотеки.
Напишите функцию точки входа в MATLAB® это:
Использует coder.loadDeepLearningNetwork
функционируйте, чтобы создать и настроить сетевой объект CNN. Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода.
Вызовы predict
(Deep Learning Toolbox), чтобы предсказать ответы.
Например:
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
Чтобы сконфигурировать настройки сборки, такие как имя выходного файла, местоположение и тип, вы создаете объекты настройки кодера. Чтобы создать объекты, используйте coder.CodeConfig
функция.
Чтобы задать параметры генерации кода для MKL-DNN, установите DeepLearningConfig
свойство к coder.MklDNNConfig
возразите, что вы создаете с coder.DeepLearningConfig
cfg = coder.CodeConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('TargetLibrary', 'mkldnn')
Задайте входные параметры.
cnnMatFile = fullfile(pwd, 'trainedNet.mat');
inputArgs = {im, coder.Constant(cnnMatFile)};
Запустите codegen
команда. codegen
команда генерирует CUDA® код от mLayers.m
Функция точки входа MATLAB.
codegen -config cfg mLayers -args inputArgs -report
Вызов предсказывает на входе, отображают и сравнивают результаты с 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'}
Вызов предсказывает на входе, отображают и сравнивают результаты с 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.
SeriesNetwork
(Deep Learning Toolbox) | DAGNetwork
(Deep Learning Toolbox) | dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox)