Квантуйте глубокую нейронную сеть к 8-битным масштабированным целочисленным типам данных
Используйте dlquantizer
объект уменьшать требования к памяти глубокой нейронной сети путем квантования весов, смещений и активаций к 8-битным масштабированным целочисленным типам данных.
создает quantObj
= dlquantizer(net
)dlquantizer
объект для заданной сети.
создает quantObj
= dlquantizer(net
,Name,Value
)dlquantizer
объект для заданной сети, с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение".
Используйте dlquantizer
создать квантованную сеть для графического процессора, FPGA или развертывания центрального процессора. Чтобы узнать о продуктах, требуемых квантовать и развернуть нейронную сеть для глубокого обучения в графический процессор, FPGA или среда центрального процессора, видит Необходимые условия Рабочего процесса Квантования.
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
Среда выполненияЗадайте среду выполнения для квантованной сети. Когда этот параметр не задан, средой выполнения по умолчанию является графический процессор. Чтобы узнать о продуктах, требуемых квантовать и развернуть нейронную сеть для глубокого обучения в графический процессор, FPGA или среда центрального процессора, видит Необходимые условия Рабочего процесса Квантования.
Пример: 'ExecutionEnvironment'
, 'FPGA'
Simulation
— Включите или отключите рабочий процесс симуляции MATLAB®Включите или отключите рабочий процесс симуляции MATLAB. Когда этот параметр устанавливается на на, квантованная сеть проверена путем симуляции квантованной сети в MATLAB и сравнения одного результатов предсказания сети типа данных с симулированными сетевыми результатами предсказания.
Пример: 'Simulation'
on
В этом примере показано, как задать среду выполнения FPGA.
net = vgg19; quantobj = dlquantizer(net,'ExecutionEnvironment','FPGA');
В этом примере показано, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете squeezenet
нейронная сеть после переобучения сети, чтобы классифицировать новые изображения согласно Обучать Нейронной сети для глубокого обучения, чтобы Классифицировать Новый пример Изображений. В этом примере память, требуемая для сети, уменьшается приблизительно на 75% посредством квантования, в то время как точность сети не затронута.
Загрузите предварительно обученную сеть. net
.NET
выходная сеть Обучать Нейронной сети для глубокого обучения, чтобы Классифицировать Новый пример Изображений.
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
функционируйте, чтобы осуществить сеть с демонстрационными входными параметрами и собрать информацию области значений. 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
функционируйте, чтобы осуществить сеть с демонстрационными входными параметрами и собрать информацию области значений. 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 и поддерживаемую версию инструмента. Это затем начинает программировать устройство 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 |
Ethernet | Программирует целевую плату FPGA, выбранную в Среде симуляции через интерфейс Ethernet. Задайте IP-адрес для своей требуемой платы в IP Address. |
В данном примере выберите Xilinx ZCU102 (zcu102_int8)
, выберите Ethernet и введите IP-адрес платы.
В разделе Validate панели инструментов приложения, под Quantization Options, выбирают метрическую функцию Default.
Нажмите Quantize and Validate.
Приложение Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети к масштабированным 8-битным целочисленным типам данных и использует данные о валидации, чтобы осуществить сеть. Приложение определяет метрическую функцию, чтобы использовать для валидации на основе типа сети, которая квантуется.
Тип сети | Метрическая функция |
---|---|
Классификация | Лучшая 1 Точность – Точность сети |
Обнаружение объектов | Средняя Точность – Средняя точность по всем результатам обнаружения. Смотрите |
Регрессия | MSE – Среднеквадратическая ошибка сети |
Семантическая Сегментация | evaluateSemanticSegmentation (Computer Vision Toolbox) – Оцените набор данных семантической сегментации против основной истины |
Один детектор выстрела (SSD) | WeightedIOU – Средний IoU каждого класса, взвешенного количеством пикселей в том классе |
Когда валидация завершена, отображения приложения результаты валидации, включая:
Метрическая функция используется для валидации
Результат метрической функции до и после квантования
Если вы хотите использовать различную метрическую функцию для валидации, например, использовать Лучшие 5 метрических функций точности вместо Лучшей 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.