Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и подтвердить квантованную сеть. Быстро прототипируйте квантованную сеть с помощью симуляции MATLAB или FPGA, чтобы подтвердить квантованную сеть. В этом примере вы квантуете нейронную сеть LogoNet.
В данном примере вам нужно:
Набор инструментов Deep Learning Toolbox ™
Deep Learning HDL Toolbox ™
Библиотека квантования модели Deep Learning Toolbox
Пакет поддержки пакета Deep Learning HDL Toolbox для устройств Xlinx FPGA и SoC
Интерфейс MATLAB Coder для библиотек глубокого обучения.
Чтобы загрузить предварительно обученную сеть LogoNet и проанализировать сетевую архитектуру, введите:
snet = getLogoNetwork; analyzeNetwork(snet);
Этот пример использует logos_dataset
набор данных. Набор данных состоит из 320 изображений. Каждое изображение имеет размер 227 на 227 и имеет три цветовых канала (RGB). Создайте augmentedImageDatastore
объект, используемый для калибровки и валидации. Ускорите калибровку и валидацию, уменьшив набор калибровочных данных до 20 изображений. Рабочий процесс симуляции MATLAB имеет максимальный предел в пять изображений при проверке квантованной сети. Уменьшите размеры набора данных валидации до пяти изображений. Рабочий процесс проверки FPGA имеет максимальный предел в одно изображение при проверке квантованной сети. Уменьшите набор данных валидации FPGA до одного изображения.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir,'f'); unzip('logos_dataset.zip'); imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); [calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized'); calibrationData_reduced = calibrationData.subset(1:20); validationData_simulation = validationData.subset(1:5); validationData_FPGA = validationData.subset(1:1);
Создайте квантованный сетевой объект
Создайте dlquantizer
объект и укажите сеть для квантования. Задайте окружение выполнения как FPGA для одного объекта. Запустите симуляцию MATLAB для второго dlquantizer
объект.
dlQuantObj_simulation = dlquantizer(snet,'ExecutionEnvironment',"FPGA",'Simulation','on'); dlQuantObj_FPGA = dlquantizer(snet,'ExecutionEnvironment',"FPGA");
Калибровка квантованной сети
Используйте calibrate
функция для упражнения сети с выборочными входами и сбора информации о области значений. The calibrate
функция использует сеть и собирает динамические области значений весов и смещений. Функция калибровки возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра квантованной сети.
dlQuantObj_simulation.calibrate(calibrationData_reduced)
ans=35×5 table
Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue
____________________________ __________________ ________________________ ___________ __________
{'conv_1_Weights' } {'conv_1' } "Weights" -0.048978 0.039352
{'conv_1_Bias' } {'conv_1' } "Bias" 0.99996 1.0028
{'conv_2_Weights' } {'conv_2' } "Weights" -0.055518 0.061901
{'conv_2_Bias' } {'conv_2' } "Bias" -0.00061171 0.00227
{'conv_3_Weights' } {'conv_3' } "Weights" -0.045942 0.046927
{'conv_3_Bias' } {'conv_3' } "Bias" -0.0013998 0.0015218
{'conv_4_Weights' } {'conv_4' } "Weights" -0.045967 0.051
{'conv_4_Bias' } {'conv_4' } "Bias" -0.00164 0.0037892
{'fc_1_Weights' } {'fc_1' } "Weights" -0.051394 0.054344
{'fc_1_Bias' } {'fc_1' } "Bias" -0.00052319 0.00084454
{'fc_2_Weights' } {'fc_2' } "Weights" -0.05016 0.051557
{'fc_2_Bias' } {'fc_2' } "Bias" -0.0017564 0.0018502
{'fc_3_Weights' } {'fc_3' } "Weights" -0.050706 0.04678
{'fc_3_Bias' } {'fc_3' } "Bias" -0.02951 0.024855
{'imageinput' } {'imageinput'} "Activations" 0 255
{'imageinput_normalization'} {'imageinput'} "Activations" -139.34 198.11
⋮
dlQuantObj_FPGA.calibrate(calibrationData_reduced)
ans=35×5 table
Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue
____________________________ __________________ ________________________ ___________ __________
{'conv_1_Weights' } {'conv_1' } "Weights" -0.048978 0.039352
{'conv_1_Bias' } {'conv_1' } "Bias" 0.99996 1.0028
{'conv_2_Weights' } {'conv_2' } "Weights" -0.055518 0.061901
{'conv_2_Bias' } {'conv_2' } "Bias" -0.00061171 0.00227
{'conv_3_Weights' } {'conv_3' } "Weights" -0.045942 0.046927
{'conv_3_Bias' } {'conv_3' } "Bias" -0.0013998 0.0015218
{'conv_4_Weights' } {'conv_4' } "Weights" -0.045967 0.051
{'conv_4_Bias' } {'conv_4' } "Bias" -0.00164 0.0037892
{'fc_1_Weights' } {'fc_1' } "Weights" -0.051394 0.054344
{'fc_1_Bias' } {'fc_1' } "Bias" -0.00052319 0.00084454
{'fc_2_Weights' } {'fc_2' } "Weights" -0.05016 0.051557
{'fc_2_Bias' } {'fc_2' } "Bias" -0.0017564 0.0018502
{'fc_3_Weights' } {'fc_3' } "Weights" -0.050706 0.04678
{'fc_3_Bias' } {'fc_3' } "Bias" -0.02951 0.024855
{'imageinput' } {'imageinput'} "Activations" 0 255
{'imageinput_normalization'} {'imageinput'} "Activations" -139.34 198.11
⋮
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейсом, чтобы подключить ваше целевое устройство к хосту-компьютеру. Опции интерфейса JTAG и Ethernet. Чтобы использовать JTAG, установите Xilinx™ Vivado™ Design Suite 2020.1. Чтобы задать траекторию инструмента Xilinx Vivado, введите:
% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.1\bin\vivado.bat');
Чтобы создать целевой объект, введите:
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');
Также можно использовать интерфейс JTAG.
% hTarget = dlhdl.Target('Xilinx', 'Interface', 'JTAG');
Создание dlQuantizationOptions
Объект
Создайте dlquantizationOptions
объект. Задайте целевой интерфейс битового потока и целевой платы. Метрическая функция по умолчанию является метрической функцией Top-1 точности.
options_FPGA = dlquantizationOptions('Bitstream','zcu102_int8','Target',hTarget); options_simulation = dlquantizationOptions;
Чтобы использовать пользовательскую метрическую функцию, задайте метрическую функцию в dlquantizationOptions
объект.
% options_FPGA = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x, snet, validationData_FPGA)},'Bitstream','zcu102_int8','Target',hTarget); % options_simulation = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x, snet,validationData_simulation)})
Валидация квантованной сети
Используйте validate
функция для квантования настраиваемых параметров в слоях свертки сети. The validate
Функция моделирует квантованную сеть в MATLAB. The validate
функция использует метрическую функцию, заданную в dlquantizationOptions
объект для сравнения результатов сетевого объекта с одним типом данных с результатами квантованного сетевого объекта.
prediction_simulation = dlQuantObj_simulation.validate(validationData_simulation,options_simulation)
### Notice: (Layer 1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: (Layer 2) The layer 'out_imageinput' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv_1>>maxpool_4 ... ### Notice: (Layer 1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: (Layer 14) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv_1>>maxpool_4 ... complete. Compiling leg: fc_1>>fc_3 ... ### Notice: (Layer 1) The layer 'maxpool_4' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: (Layer 7) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: fc_1>>fc_3 ... complete. ### Should not enter here. It means a component is unaccounted for in MATLAB Emulation. ### Notice: (Layer 1) The layer 'fc_3' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: (Layer 2) The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software. ### Notice: (Layer 3) The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
prediction_simulation = struct with fields:
NumSamples: 5
MetricResults: [1×1 struct]
Для валидации на основе FPGA, validate
функция использует выход функции компиляции для программирования платы FPGA с помощью файла программирования. Он также загружает веса и смещения сети. The validate
функция использует метрическую функцию, заданную в dlquantizationOptions
объект для сравнения результатов сети до и после квантования.
prediction_FPGA = dlQuantObj_FPGA.validate(validationData_FPGA,options_FPGA)
### Compiling network for Deep Learning FPGA prototyping ... ### Targeting FPGA bitstream zcu102_int8 ... ### The network includes the following layers: 1 'imageinput' Image Input 227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations (SW Layer) 2 'conv_1' Convolution 96 5×5×3 convolutions with stride [1 1] and padding [0 0 0 0] (HW Layer) 3 'relu_1' ReLU ReLU (HW Layer) 4 'maxpool_1' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 5 'conv_2' Convolution 128 3×3×96 convolutions with stride [1 1] and padding [0 0 0 0] (HW Layer) 6 'relu_2' ReLU ReLU (HW Layer) 7 'maxpool_2' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 8 'conv_3' Convolution 384 3×3×128 convolutions with stride [1 1] and padding [0 0 0 0] (HW Layer) 9 'relu_3' ReLU ReLU (HW Layer) 10 'maxpool_3' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 11 'conv_4' Convolution 128 3×3×384 convolutions with stride [2 2] and padding [0 0 0 0] (HW Layer) 12 'relu_4' ReLU ReLU (HW Layer) 13 'maxpool_4' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 14 'fc_1' Fully Connected 2048 fully connected layer (HW Layer) 15 'relu_5' ReLU ReLU (HW Layer) 16 'dropout_1' Dropout 50% dropout (HW Layer) 17 'fc_2' Fully Connected 2048 fully connected layer (HW Layer) 18 'relu_6' ReLU ReLU (HW Layer) 19 'dropout_2' Dropout 50% dropout (HW Layer) 20 'fc_3' Fully Connected 32 fully connected layer (HW Layer) 21 'softmax' Softmax softmax (SW Layer) 22 'classoutput' Classification Output crossentropyex with 'adidas' and 31 other classes (SW Layer) 3 Memory Regions created. Skipping: imageinput Compiling leg: conv_1>>maxpool_4 ... Compiling leg: conv_1>>maxpool_4 ... complete. Compiling leg: fc_1>>fc_3 ... Compiling leg: fc_1>>fc_3 ... complete. Skipping: softmax Skipping: classoutput Creating Schedule... ......... Creating Schedule...complete. Creating Status Table... ........ Creating Status Table...complete. Emitting Schedule... ...... Emitting Schedule...complete. Emitting Status Table... .......... Emitting Status Table...complete. ### Allocating external memory buffers: offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "48.0 MB" "OutputResultOffset" "0x03000000" "4.0 MB" "SchedulerDataOffset" "0x03400000" "4.0 MB" "SystemBufferOffset" "0x03800000" "60.0 MB" "InstructionDataOffset" "0x07400000" "8.0 MB" "ConvWeightDataOffset" "0x07c00000" "12.0 MB" "FCWeightDataOffset" "0x08800000" "12.0 MB" "EndOffset" "0x09400000" "Total: 148.0 MB" ### Network compilation complete. ### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA. ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 12722978 0.05783 1 12722978 17.3 conv_1 3437086 0.01562 maxpool_1 1296014 0.00589 conv_2 2813632 0.01279 maxpool_2 477861 0.00217 conv_3 2462903 0.01120 maxpool_3 535330 0.00243 conv_4 504820 0.00229 maxpool_4 8965 0.00004 fc_1 687629 0.00313 fc_2 439923 0.00200 fc_3 58721 0.00027 * The clock frequency of the DL processor is: 220MHz
prediction_FPGA = struct with fields:
NumSamples: 1
MetricResults: [1×1 struct]
QuantizedNetworkFPS: 17.2915
Просмотр эффективности квантованной нейронной сети
Исследуйте MetricResults.Result
поле выхода валидации для просмотра эффективности квантованной сети.
prediction_simulation.MetricResults.Result
ans=2×2 table
NetworkImplementation MetricOutput
_____________________ ____________
{'Floating-Point'} 1
{'Quantized' } 1
prediction_FPGA.MetricResults.Result
ans=2×2 table
NetworkImplementation MetricOutput
_____________________ ____________
{'Floating-Point'} 1
{'Quantized' } 1
Исследуйте QuantizedNetworkFPS
поле выхода валидации для просмотра систем координат в секунду эффективности квантованной сети.
prediction_FPGA.QuantizedNetworkFPS
ans = 17.2915