Квантуйте глубокую нейронную сеть к 8-битным масштабированным целочисленным типам данных
Используйте dlquantizer
объект для уменьшения потребности глубокой нейронной сети в памяти путем квантования весов, смещений и активаций до 8-битных масштабированных целочисленных типов данных.
создает quantObj
= dlquantizer(net
)dlquantizer
объект для указанной сети.
создает quantObj
= dlquantizer(net
,Name,Value
)dlquantizer
объект для указанной сети с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение".
Использование dlquantizer
создание квантованной сети для развертывания GPU, FPGA или CPU. Чтобы узнать о продуктах, необходимых для квантования и развертывания нейронной сети для глубокого обучения в среде GPU, FPGA или CPU, см. раздел Необходимых условий рабочего процесса квантования».
net
- Предварительно обученная нейронная сетьDAGNetwork
| объекта SeriesNetwork
| объекта yolov2ObjectDetector
| объекта ssdObjectDetector
объектПредварительно обученная нейронная сеть, заданная как DAGNetwork
, SeriesNetwork
, yolov2ObjectDetector
(Computer Vision Toolbox), или ssdObjectDetector
(Computer Vision Toolbox) объект.
Квантование ssdObjectDetector
(Computer Vision Toolbox) сети требуют ExecutionEnvironment
свойство, которое должно быть установлено в 'FPGA'
.
NetworkObject
- Предварительно обученная нейронная сетьDAGNetwork
| объекта SeriesNetwork
| объекта yolov2ObjectDetector
| объекта ssdObjectDetector
объектПредварительно обученная нейронная сеть, заданная как DAGNetwork
, SeriesNetwork
, yolov2ObjectDetector
(Computer Vision Toolbox), или ssdObjectDetector
(Computer Vision Toolbox) объект.
Квантование ssdObjectDetector
(Computer Vision Toolbox) сети требуют ExecutionEnvironment
свойство, которое должно быть установлено в 'FPGA'
.
ExecutionEnvironment
- окружение выполненияЗадайте окружение выполнения для квантованной сети. Когда этот параметр не задан, окружение выполнения по умолчанию является графическим процессором. Чтобы узнать о продуктах, необходимых для квантования и развертывания нейронной сети для глубокого обучения в среде GPU, FPGA или CPU, см. раздел Необходимых условий рабочего процесса квантования».
Пример: 'ExecutionEnvironment'
, 'FPGA'
Simulation
- Включить или отключить MATLAB® рабочий процесс симуляцииВключите или отключите рабочий процесс симуляции MATLAB. Когда этот параметр установлен в on, квантованная сеть проверяется путем симуляции квантованной сети в MATLAB и сравнения результатов предсказания сети с одним типом данных с результатами моделируемого предсказания.
Пример: 'Simulation'
, 'on'
В этом примере показано, как задать окружение выполнения FPGA.
net = vgg19; quantobj = dlquantizer(net,'ExecutionEnvironment','FPGA');
Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете squeezenet
нейронная сеть после переобучения сети для классификации новых изображений в соответствии с примером Traind Нейронной Сети для Глубокого Обучения to Classify New Images. В этом примере память, необходимая для сети, уменьшается приблизительно на 75% посредством квантования, в то время как точность сети не зависит.
Загрузите предварительно обученную сеть. net
. net
- выход сеть примера Train Нейронной сети для глубокого обучения для классификации новых изображений.
net
net = DAGNetwork with properties: Layers: [68x1 nnet.cnn.layer.Layer] Connections: [75x2 table] InputNames: {'data'} OutputNames: {'new_classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Данные калибровки используются для сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети и динамических областей значений активаций во всех слоях сети. Для наилучших результатов квантования калибровочные данные должны быть показательными для входов в сеть.
Данные валидации используются для тестирования сети после квантования, чтобы понять эффекты ограниченной области значений и точности квантованных слоев свертки в сети.
В этом примере используйте изображения в MerchData
набор данных. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [calData, valData] = splitEachLabel(imds, 0.7, 'randomized'); aug_calData = augmentedImageDatastore([227 227], calData); aug_valData = augmentedImageDatastore([227 227], valData);
Создайте dlquantizer
объект и укажите сеть для квантования.
quantObj = dlquantizer(net);
Задайте метрическую функцию, которая будет использоваться для сравнения поведения сети до и после квантования. Сохраните эту функцию в локальном файле.
function accuracy = hComputeModelAccuracy(predictionScores, net, dataStore) %% Computes model-level accuracy statistics % Load ground truth tmp = readall(dataStore); groundTruth = tmp.response; % Compare with predicted label with actual ground truth predictionError = {}; for idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx,:)); yActual = net.Layers(end).Classes(idy); predictionError{end+1} = (yActual == groundTruth(idx)); %#ok end % Sum all prediction errors. predictionError = [predictionError{:}]; accuracy = sum(predictionError)/numel(predictionError); end
Задайте метрическую функцию в dlquantizationOptions
объект.
quantOpts = dlquantizationOptions('MetricFcn', ... {@(x)hComputeModelAccuracy(x, net, aug_valData)});
Используйте calibrate
функция для упражнения сети с выборочными входами и сбора информации о области значений. The calibrate
функция реализует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.
calResults = calibrate(quantObj, aug_calData)
calResults = 95x5 table Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue __________________________________________________ _________________________ ________________________ __________ ___________ {'conv1_relu_conv1_Weights' } {'relu_conv1' } "Weights" -0.91985 0.88489 {'conv1_relu_conv1_Bias' } {'relu_conv1' } "Bias" -0.07925 0.26343 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Weights'} {'fire2-relu_squeeze1x1'} "Weights" -1.38 1.2477 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Bias' } {'fire2-relu_squeeze1x1'} "Bias" -0.11641 0.24273 {'fire2-expand1x1_fire2-relu_expand1x1_Weights' } {'fire2-relu_expand1x1' } "Weights" -0.7406 0.90982 {'fire2-expand1x1_fire2-relu_expand1x1_Bias' } {'fire2-relu_expand1x1' } "Bias" -0.060056 0.14602 {'fire2-expand3x3_fire2-relu_expand3x3_Weights' } {'fire2-relu_expand3x3' } "Weights" -0.74397 0.66905 {'fire2-expand3x3_fire2-relu_expand3x3_Bias' } {'fire2-relu_expand3x3' } "Bias" -0.051778 0.074239 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Weights'} {'fire3-relu_squeeze1x1'} "Weights" -0.77263 0.68897 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Bias' } {'fire3-relu_squeeze1x1'} "Bias" -0.10141 0.32678 {'fire3-expand1x1_fire3-relu_expand1x1_Weights' } {'fire3-relu_expand1x1' } "Weights" -0.72131 0.97287 {'fire3-expand1x1_fire3-relu_expand1x1_Bias' } {'fire3-relu_expand1x1' } "Bias" -0.067043 0.30424 {'fire3-expand3x3_fire3-relu_expand3x3_Weights' } {'fire3-relu_expand3x3' } "Weights" -0.61196 0.77431 {'fire3-expand3x3_fire3-relu_expand3x3_Bias' } {'fire3-relu_expand3x3' } "Bias" -0.053612 0.10329 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Weights'} {'fire4-relu_squeeze1x1'} "Weights" -0.74145 1.0888 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Bias' } {'fire4-relu_squeeze1x1'} "Bias" -0.10886 0.13882 ...
Используйте validate
функция для квантования настраиваемых параметров в слоях свертки сети и осуществления сети. Функция использует метрическую функцию, определенную в dlquantizationOptions
объект для сравнения результатов сети до и после квантования.
valResults = validate(quantObj, aug_valData, quantOpts)
valResults = struct with fields: NumSamples: 20 MetricResults: [1x1 struct]
Исследуйте MetricResults.Result
поле выхода валидации для просмотра эффективности квантованной сети.
valResults.MetricResults.Result
ans = 2x3 table NetworkImplementation MetricOutput LearnableParameterMemory(bytes) _____________________ ____________ _______________________________ {'Floating-Point'} 1 2.9003e+06 {'Quantized' } 1 7.3393e+05
В этом примере память, необходимая для сети, была уменьшена приблизительно на 75% за счет квантования. Точность сети не зависит.
Веса, смещения и активации слоев свертки сети, заданные в dlquantizer
теперь объект использует масштабированные 8-битные целочисленные типы данных.
Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете LogoNet
нейронная сеть. Квантование помогает уменьшить потребность глубокой нейронной сети в памяти путем квантования весов, смещений и активаций слоев сети до 8-битных масштабированных целочисленных типов данных. Используйте MATLAB ®, чтобы получить результаты предсказания с целевого устройства .
Чтобы запустить этот пример, вам нужны продукты, перечисленные в FPGA
в необходимых условиях «Предпосылки рабочего процесса квантования».
Дополнительные потребности см. в разделе Необходимых условий рабочего процесса квантования.
Создайте файл в вашей текущей рабочей директории под названием getLogoNetwork.m
. Введите эти линии в файл:
function net = getLogoNetwork() data = getLogoData(); net = data.convnet; end function data = getLogoData() if ~isfile('LogoNet.mat') url = 'https://www.mathworks.com/supportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat'; websave('LogoNet.mat',url); end data = load('LogoNet.mat'); end
Загрузите предварительно обученную сеть.
snet = getLogoNetwork();
snet = SeriesNetwork with properties: Layers: [22×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Данные калибровки используются для сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети и динамических областей значений активаций во всех слоях сети. Для наилучших результатов квантования калибровочные данные должны быть показательными для входов в сеть.
Данные валидации используются для тестирования сети после квантования, чтобы понять эффекты ограниченной области значений и точности квантованных слоев свертки в сети.
Этот пример использует изображения в logos_dataset
набор данных. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir); unzip('logos_dataset.zip'); imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); [calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized');
Создайте dlquantizer
объект и укажите сеть для квантования.
dlQuantObj = dlquantizer(snet,'ExecutionEnvironment','FPGA');
Используйте calibrate
функция для упражнения сети с выборочными входами и сбора информации о области значений. The calibrate
функция реализует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.
dlQuantObj.calibrate(calibrationData)
ans = 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.72
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейсом, чтобы подключить ваше целевое устройство к хосту-компьютеру. Опции интерфейса JTAG и Ethernet. Чтобы создать целевой объект, введите:
hTarget = dlhdl.Target('Intel', 'Interface', 'JTAG');
Задайте метрическую функцию, которая будет использоваться для сравнения поведения сети до и после квантования. Сохраните эту функцию в локальном файле.
function accuracy = hComputeModelAccuracy(predictionScores, net, dataStore) %% hComputeModelAccuracy test helper function computes model level accuracy statistics % Copyright 2020 The MathWorks, Inc. % Load ground truth groundTruth = dataStore.Labels; % Compare with predicted label with actual ground truth predictionError = {}; for idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx, :)); yActual = net.Layers(end).Classes(idy); predictionError{end+1} = (yActual == groundTruth(idx)); %#ok end % Sum all prediction errors. predictionError = [predictionError{:}]; accuracy = sum(predictionError)/numel(predictionError); end
Задайте метрическую функцию в dlquantizationOptions
объект.
options = dlquantizationOptions('MetricFcn', ... {@(x)hComputeModelAccuracy(x, snet, validationData)},'Bitstream','arria10soc_int8',... 'Target',hTarget);
Чтобы скомпилировать и развернуть квантованную сеть, запустите validate
функция dlquantizer
объект. Используйте validate
функция для квантования настраиваемых параметров в слоях свертки сети и осуществления сети. Эта функция использует выход функции компиляции, чтобы запрограммировать плату FPGA с помощью файла программирования. Он также загружает веса и смещения сети. Функция развертывания проверяет наличие инструмента Intel Quartus и поддерживаемой версии инструмента. Затем он начинает программировать устройство FPGA с помощью файла sof, отображает сообщения о прогрессе и время развертывания сети. Функция использует метрическую функцию, определенную в dlquantizationOptions
объект для сравнения результатов сети до и после квантования.
prediction = dlQuantObj.validate(validationData,options);
offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "48.0 MB" "OutputResultOffset" "0x03000000" "4.0 MB" "SystemBufferOffset" "0x03400000" "60.0 MB" "InstructionDataOffset" "0x07000000" "8.0 MB" "ConvWeightDataOffset" "0x07800000" "8.0 MB" "FCWeightDataOffset" "0x08000000" "12.0 MB" "EndOffset" "0x08c00000" "Total: 140.0 MB" ### Programming FPGA Bitstream using JTAG... ### Programming the FPGA bitstream has been completed successfully. ### Loading weights to Conv Processor. ### Conv Weights loaded. Current time is 16-Jul-2020 12:45:10 ### Loading weights to FC Processor. ### FC Weights loaded. Current time is 16-Jul-2020 12:45:26 ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13570959 0.09047 30 380609145 11.8 conv_module 12667786 0.08445 conv_1 3938907 0.02626 maxpool_1 1544560 0.01030 conv_2 2910954 0.01941 maxpool_2 577524 0.00385 conv_3 2552707 0.01702 maxpool_3 676542 0.00451 conv_4 455434 0.00304 maxpool_4 11251 0.00008 fc_module 903173 0.00602 fc_1 536164 0.00357 fc_2 342643 0.00228 fc_3 24364 0.00016 * The clock frequency of the DL processor is: 150MHz ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13570364 0.09047 30 380612682 11.8 conv_module 12667103 0.08445 conv_1 3939296 0.02626 maxpool_1 1544371 0.01030 conv_2 2910747 0.01940 maxpool_2 577654 0.00385 conv_3 2551829 0.01701 maxpool_3 676548 0.00451 conv_4 455396 0.00304 maxpool_4 11355 0.00008 fc_module 903261 0.00602 fc_1 536206 0.00357 fc_2 342688 0.00228 fc_3 24365 0.00016 * The clock frequency of the DL processor is: 150MHz ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13571561 0.09048 30 380608338 11.8 conv_module 12668340 0.08446 conv_1 3939070 0.02626 maxpool_1 1545327 0.01030 conv_2 2911061 0.01941 maxpool_2 577557 0.00385 conv_3 2552082 0.01701 maxpool_3 676506 0.00451 conv_4 455582 0.00304 maxpool_4 11248 0.00007 fc_module 903221 0.00602 fc_1 536167 0.00357 fc_2 342643 0.00228 fc_3 24409 0.00016 * The clock frequency of the DL processor is: 150MHz ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13569862 0.09047 30 380613327 11.8 conv_module 12666756 0.08445 conv_1 3939212 0.02626 maxpool_1 1543267 0.01029 conv_2 2911184 0.01941 maxpool_2 577275 0.00385 conv_3 2552868 0.01702 maxpool_3 676438 0.00451 conv_4 455353 0.00304 maxpool_4 11252 0.00008 fc_module 903106 0.00602 fc_1 536050 0.00357 fc_2 342645 0.00228 fc_3 24409 0.00016 * The clock frequency of the DL processor is: 150MHz ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13570823 0.09047 30 380619836 11.8 conv_module 12667607 0.08445 conv_1 3939074 0.02626 maxpool_1 1544519 0.01030 conv_2 2910636 0.01940 maxpool_2 577769 0.00385 conv_3 2551800 0.01701 maxpool_3 676795 0.00451 conv_4 455859 0.00304 maxpool_4 11248 0.00007 fc_module 903216 0.00602 fc_1 536165 0.00357 fc_2 342643 0.00228 fc_3 24406 0.00016 * The clock frequency of the DL processor is: 150MHz offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "48.0 MB" "OutputResultOffset" "0x03000000" "4.0 MB" "SystemBufferOffset" "0x03400000" "60.0 MB" "InstructionDataOffset" "0x07000000" "8.0 MB" "ConvWeightDataOffset" "0x07800000" "8.0 MB" "FCWeightDataOffset" "0x08000000" "12.0 MB" "EndOffset" "0x08c00000" "Total: 140.0 MB" ### 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 LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13572329 0.09048 10 127265075 11.8 conv_module 12669135 0.08446 conv_1 3939559 0.02626 maxpool_1 1545378 0.01030 conv_2 2911243 0.01941 maxpool_2 577422 0.00385 conv_3 2552064 0.01701 maxpool_3 676678 0.00451 conv_4 455657 0.00304 maxpool_4 11227 0.00007 fc_module 903194 0.00602 fc_1 536140 0.00357 fc_2 342688 0.00228 fc_3 24364 0.00016 * The clock frequency of the DL processor is: 150MHz ### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 13572527 0.09048 10 127266427 11.8 conv_module 12669266 0.08446 conv_1 3939776 0.02627 maxpool_1 1545632 0.01030 conv_2 2911169 0.01941 maxpool_2 577592 0.00385 conv_3 2551613 0.01701 maxpool_3 676811 0.00451 conv_4 455418 0.00304 maxpool_4 11348 0.00008 fc_module 903261 0.00602 fc_1 536205 0.00357 fc_2 342689 0.00228 fc_3 24365 0.00016 * The clock frequency of the DL processor is: 150MHz
Исследуйте MetricResults.Result
поле выхода валидации для просмотра эффективности квантованной сети.
validateOut = prediction.MetricResults.Result
ans = NetworkImplementation MetricOutput _____________________ ____________ {'Floating-Point'} 0.9875 {'Quantized' } 0.9875
Исследуйте QuantizedNetworkFPS
поле выхода валидации для просмотра систем координат в секунду эффективности квантованной сети.
prediction.QuantizedNetworkFPS
ans = 11.8126
Веса, смещения и активации слоев свертки сети, заданные в dlquantizer
теперь объект использует масштабированные 8-битные целочисленные типы данных.
dlquantizer
Объект в приложение Deep Network QuantizerВ этом примере показано, как импортировать dlquantizer
объект из базового рабочего пространства в приложение Deep Network Quantizer. Это позволяет начать квантование глубокой нейронной сети с помощью командной строки или приложения и возобновить работу позже в приложении.
Загрузите сеть для квантования в базовое рабочее пространство.
net
net = DAGNetwork with properties: Layers: [68x1 nnet.cnn.layer.Layer] Connections: [75x2 table] InputNames: {'data'} OutputNames: {'new_classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Данные калибровки используются для сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети и динамических областей значений активаций во всех слоях сети. Для наилучших результатов квантования калибровочные данные должны быть показательными для входов в сеть.
Данные валидации используются для тестирования сети после квантования, чтобы понять эффекты ограниченной области значений и точности квантованных слоев свертки в сети.
В этом примере используйте изображения в MerchData
набор данных. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [calData, valData] = splitEachLabel(imds, 0.7, 'randomized'); aug_calData = augmentedImageDatastore([227 227], calData); aug_valData = augmentedImageDatastore([227 227], valData);
Создайте dlquantizer
объект и укажите сеть для квантования.
quantObj = dlquantizer(net);
Используйте calibrate
функция для упражнения сети с выборочными входами и сбора информации о области значений. Функция калибровки использует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.
calResults = calibrate(quantObj, aug_calData)
calResults = 95x5 table Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue __________________________________________________ _________________________ ________________________ __________ __________ {'conv1_relu_conv1_Weights' } {'relu_conv1' } "Weights" -0.91985 0.88489 {'conv1_relu_conv1_Bias' } {'relu_conv1' } "Bias" -0.07925 0.26343 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Weights'} {'fire2-relu_squeeze1x1'} "Weights" -1.38 1.2477 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Bias' } {'fire2-relu_squeeze1x1'} "Bias" -0.11641 0.24273 {'fire2-expand1x1_fire2-relu_expand1x1_Weights' } {'fire2-relu_expand1x1' } "Weights" -0.7406 0.90982 {'fire2-expand1x1_fire2-relu_expand1x1_Bias' } {'fire2-relu_expand1x1' } "Bias" -0.060056 0.14602 {'fire2-expand3x3_fire2-relu_expand3x3_Weights' } {'fire2-relu_expand3x3' } "Weights" -0.74397 0.66905 {'fire2-expand3x3_fire2-relu_expand3x3_Bias' } {'fire2-relu_expand3x3' } "Bias" -0.051778 0.074239 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Weights'} {'fire3-relu_squeeze1x1'} "Weights" -0.77262 0.68583 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Bias' } {'fire3-relu_squeeze1x1'} "Bias" -0.10145 0.32669 {'fire3-expand1x1_fire3-relu_expand1x1_Weights' } {'fire3-relu_expand1x1' } "Weights" -0.72083 0.97157 {'fire3-expand1x1_fire3-relu_expand1x1_Bias' } {'fire3-relu_expand1x1' } "Bias" -0.067019 0.30422 {'fire3-expand3x3_fire3-relu_expand3x3_Weights' } {'fire3-relu_expand3x3' } "Weights" -0.61403 0.77544 {'fire3-expand3x3_fire3-relu_expand3x3_Bias' } {'fire3-relu_expand3x3' } "Bias" -0.053621 0.1033 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Weights'} {'fire4-relu_squeeze1x1'} "Weights" -0.74164 1.0865 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Bias' } {'fire4-relu_squeeze1x1'} "Bias" -0.10885 0.13875 ...
Откройте приложение Deep Network Quantizer.
deepNetworkQuantizer
В приложении нажмите New и выберите Import dlquantizer object
.
В диалоговом окне выберите dlquantizer
объект для импорта из базового рабочего пространства.
Приложение импортирует любые данные, содержащиеся в dlquantizer
объект, который был собран в командной строке. Эти данные могут включать сеть квантования, данные калибровки, данные валидации и статистику калибровки.
Приложение отображает таблицу, содержащую данные калибровки, содержащиеся в импортированном dlquantizer
объект, quantObj
. Справа от таблицы приложение отображает гистограммы динамических областей значений параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких Нейронных Сетей.
Чтобы исследовать поведение нейронной сети, которая квантовала слои свертки, используйте Deep Network Quantizer приложения. Этот пример квантует настраиваемые параметры слоев свертки LogoNet
нейронная сеть.
В данном примере вам нужны продукты, перечисленные в FPGA
в необходимых условиях «Предпосылки рабочего процесса квантования».
Дополнительные потребности см. в разделе Необходимых условий рабочего процесса квантования.
Создайте файл в текущей рабочей папке с именем getLogoNetwork.m
. В файле введите:
function net = getLogoNetwork() if ~isfile('LogoNet.mat') url = 'https://www.mathworks.com/supportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat'; websave('LogoNet.mat',url); end data = load('LogoNet.mat'); net = data.convnet; end
Загрузите предварительно обученную сеть.
snet = getLogoNetwork();
snet = SeriesNetwork with properties: Layers: [22×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Приложение использует данные калибровки для упражнения сети и сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети. Приложение также использует динамические области значений активаций во всех слоях сети LogoNet. Для наилучших результатов квантования калибровочные данные должны быть показательными по входам в сеть LogoNet.
После квантования приложение использует набор данных валидации, чтобы протестировать сеть, чтобы понять эффекты ограниченной области значений и точности квантованных настраиваемых параметров слоев свертки в сети.
В этом примере используйте изображения в logos_dataset
набор данных для калибровки и проверки сети LogoNet. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
Ускорите процесс калибровки и валидации с помощью подмножества calibrationData
и validationData
. Сохраните новые сокращенные данные калибровки в calibrationData_concise
и новый сокращенный набор данных валидации в validationData_concise
.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir); unzip('logos_dataset.zip'); imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); [calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized'); calibrationData_concise = calibrationData.subset(1:20); validationData_concise = vaidationData.subset(1:1);
В командной строке MATLAB откройте приложение Deep Network Quantizer.
deepNetworkQuantizer
Нажмите New и выберите Quantize a network
.
Приложение проверяет ваше окружение выполнения.
Выберите окружение выполнения и сеть для квантования из базового рабочего пространства. В данном примере выберите окружение выполнения FPGA и сеть последовательного snet
.
Приложение отображает график слоев выбранной сети.
В Calibrate разделе панели инструментов приложения под Calibration Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные калибровки calibrationData_concise
.
Нажмите Calibrate.
Приложение Deep Network Quantizer использует данные калибровки для упражнения сети и сбора информации о области значений для настраиваемых параметров в слоях сети.
Когда калибровка завершена, приложение отображает таблицу, содержащую веса и смещения в свертках и полносвязных слоях сети. Также отображаются динамические области значений активаций во всех слоях сети и их минимальные и максимальные значения во время калибровки. Приложение отображает гистограммы динамических областей значений параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких Нейронных Сетей.
В Quantize столбце таблицы укажите, нужно ли квантовать настраиваемые параметры в слое. Вы не можете квантовать слои, которые не являются слоями свертки. Слои, которые не квантуются, остаются с одной точностью.
В Validate разделе панели инструментов приложения под Validation Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные валидации validationData_concise
.
В Hardware Settings разделе панели инструментов выберите из опций, перечисленных в таблице:
Среда симуляции | Действие |
MATLAB (симуляция в MATLAB) | Моделирует квантованную сеть в MATLAB. Проверяет квантованную сеть путем сравнения эффективности с одноточной версией сети. |
Программа Intel Arria 10 SoC (arria10soc_int8) | Развертывает квантованную сеть в корпорации Intel® Arria® Плата 10 SoC при помощи |
Xilinx ZCU102 (zcu102_int8) | Развертывает квантованную сеть на Xilinx® Zynq® UltraScale+™ плату MPSoC ZCU102 10 SoC при помощи |
Xilinx ZC706 (zc706_int8) | Развертывает квантованную сеть на плате Xilinx Zynq-7000 ZC706 с помощью |
Когда вы выбираете Intel Arria 10 SoC (arria10soc_int8)
, Xilinx ZCU102 (zcu102_int8)
, или Xilinx ZC706 (zc706_int8)
Опциями выберите интерфейс, который будет использоваться для развертывания и проверки квантованной сети. Опции Target интерфейса перечислены в этой таблице.
Целевая опция | Действие |
JTAG | Программирует целевую плату FPGA, выбранную в Среду симуляции, с помощью кабеля JTAG. Для получения дополнительной информации смотрите JTAG Connection |
Ethernet | Программирует целевую плату FPGA, выбранную в Среду симуляции, через интерфейс Ethernet. Укажите IP-адрес целевой платы в IP Address. |
В данном примере выберите Xilinx ZCU102 (zcu102_int8)
выберите Ethernet и введите IP-адрес платы.
В Validate разделе панели инструментов приложения под Quantization Options выберите функцию Default metric.
Нажмите Quantize and Validate.
Приложение Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети до масштабированных 8-битных целочисленных типов данных и использует данные валидации для упражнения сети. Приложение определяет метрическую функцию, которая будет использоваться для валидации, на основе типа сети, которая квантуется.
Тип сети | Метрическая функция |
---|---|
Классификация | Top-1 точности - точность сети |
Обнаружение объектов | Средняя точность - средняя точность по всем результатам обнаружения. Посмотрите |
Регресс | MSE - средняя квадратичная невязка сети |
Семантическая сегментация | evaluateSemanticSegmentation (Computer Vision Toolbox) - Оценка набора данных семантической сегментации с основной истиной |
Детектор одиночного выстрела (SSD) | WeightedIOU - Средний IoU каждого класса, взвешенный по количеству пикселей в этом классе |
Когда валидация завершена, приложение отображает результаты валидации, включая:
Метрическая функция, используемая для валидации
Результат метрической функции до и после квантования
Если вы хотите использовать другую метрическую функцию для валидации, например, чтобы использовать Top-5 метрическую функцию точности вместо метрической функции точности Top-1 по умолчанию, можно задать пользовательскую метрическую функцию. Сохраните эту функцию в локальном файле.
function accuracy = hComputeAccuracy(predictionScores, net, dataStore) %% Computes model-level accuracy statistics % Load ground truth tmp = readall(dataStore); groundTruth = tmp.response; % Compare with predicted label with actual ground truth predictionError = {}; for idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx,:)); yActual = net.Layers(end).Classes(idy); predictionError{end+1} = (yActual == groundTruth(idx)); %#ok end % Sum all prediction errors. predictionError = [predictionError{:}]; accuracy = sum(predictionError)/numel(predictionError); end
Чтобы переоценить сеть с помощью этой пользовательской метрической функции, в разделе Quantization Options введите имя пользовательской метрической функции hComputeAccuracy
. Выберите Add для добавления hComputeAccuracy
в список метрических функций, доступных в приложении Выберите hComputeAccuracy
в качестве метрической функции, которую нужно использовать.
Пользовательская функция метрики должна быть в пути. Если метрическая функция не находится в пути, этот шаг вызывает ошибку.
Нажмите Quantize and Validate.
Приложение квантует сеть и отображает результаты валидации для пользовательской метрической функции.
Приложение отображает только скалярные значения в таблице результатов валидации. Чтобы просмотреть результаты валидации для пользовательской метрической функции с нескалярными выходами, экспортируйте dlquantizer
объект затем проверьте квантованную сеть с помощью validate
функция в командном окне MATLAB.
После квантования и проверки сети можно выбрать экспорт квантованной сети.
Нажмите кнопку Export. В раскрывающемся списке выберите Export Quantizer
для создания dlquantizer
объект в базовом рабочем пространстве. Можно развернуть квантованную сеть на целевой плате FPGA и получить результаты предсказания с помощью MATLAB. См. пример развертывания квантованной сети.
Если эффективность квантованной сети не удовлетворительна, можно принять решение не квантовать некоторые слои, очистив слой в таблице. Еще раз нажмите Quantize and Validate.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.