Моделируйте и собирайте области значений глубокой нейронной сети
осуществляет упражнения сети и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети, заданные calibrationResults
= calibrate(quantObj
, calData
)dlquantizer
объект, quantObj
, с использованием данных, заданных calData
.
осуществляет упражнения сети и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети, заданные calibrationResults
= calibrate(quantObj
, calData
,Name,Value
)dlquantizer
объект, quantObj
, с использованием данных, заданных calData
, с дополнительными аргументами, заданными одним или несколькими аргументами пары "имя-значение".
Чтобы узнать о продуктах, необходимых для квантования глубокой нейронной сети, смотрите Необходимые условия рабочего процесса квантования
Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете 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-битные целочисленные типы данных.
quantObj
- Сеть для квантованияdlquantizer
объектdlquantizer
объект, содержащий сеть для квантования.
calData
- Данные для калибровки квантованной сетиimageDatastore
| объекта augmentedImageDatastore
| объекта pixelLabelImageDatastore
объектДанные для калибровки квантованной сети, заданные как imageDatastore
объект, augmentedImageDatastore
объект, или pixelLabelImageDatastore
(Computer Vision Toolbox) объект.
Задайте необязательные разделенные разделенными запятой парами Name,Value
аргументы. Name
- имя аргумента и Value
- соответствующее значение. Name
должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN
.
calResults = calibrate(quantObj, calData, 'UseGPU', 'on')
'UseGPU'
- Логический флаг для использования графический процессор для калибровкиЛогический флаг для использования графический процессор для калибровки при dlquantizer
ExecutionEnvironment объекта
установлено в 'FPGA'
или 'CPU'
.
Пример: 'UseGPU', 'on'
calibrationResults
- Динамические области значений сетиДинамические области значений слоев сети, возвращенные как таблица. Каждая строка в таблице отображает минимальное и максимальное значения настраиваемого параметра слоя свертки оптимизированной сети. Программа использует эти минимальные и максимальные значения, чтобы определить масштабирование для типа данных квантованного параметра.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.