Квантование и валидация глубокой нейронной сети
квантует веса, смещения и активации в слоях свертки сети и подтверждает сеть, заданную validationResults = validate(quantObj, valData)dlquantizer объект, quantObj и использование данных, заданных valData.
квантует веса, смещения и активации в слоях свертки сети и подтверждает сеть, заданную validationResults = validate(quantObj, valData, quantOpts)dlquantizer объект, quantObj, с использованием данных, заданных valDataи необязательный аргумент quantOpts который задает метрическую функцию для оценки эффективности квантованной сети.
Чтобы узнать о продуктах, необходимых для квантования глубокой нейронной сети, смотрите Необходимые условия рабочего процесса квантования.
Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете 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-битные целочисленные типы данных.
Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и подтвердить квантованную сеть. Быстро прототипируйте квантованную сеть с помощью симуляции на основе MATLAB, чтобы подтвердить квантованную сеть. Для этого типа симуляции вам не нужна аппаратная плата FPGA из процесса прототипирования. В этом примере вы квантуете нейронную сеть LogoNet.
В данном примере вам нужны продукты, перечисленные в FPGA в необходимых условиях «Предпосылки рабочего процесса квантования».
Загрузите предварительно обученную сеть и проанализируйте сетевую архитектуру.
snet = getLogoNetwork; analyzeNetwork(snet);

Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Этот пример использует logos_dataset набор данных. Набор данных состоит из 320 изображений. Каждое изображение имеет размер 227 на 227 и имеет три цветовых канала (RGB). Создайте augmentedImageDatastore объект, используемый для калибровки и валидации. Ускорите процесс калибровки и валидации, сократив набор данных калибровки до 20 изображений. Рабочий процесс симуляции MATLAB имеет максимальный предел в пять изображений при проверке квантованной сети. Уменьшите размеры набора данных валидации до пяти изображений.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir,'f'); unzip('logos_dataset.zip'); imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); [calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized'); calibrationData_reduced = calibrationData.subset(1:20); validationData_reduced = validationData.subset(1:5);
Создайте квантованную сеть с помощью dlquantizer объект. Чтобы использовать среду симуляции MATLAB, установите Simulation на on.
dlQuantObj = dlquantizer(snet,'ExecutionEnvironment','FPGA','Simulation','on')
Используйте calibrate функция для упражнения сети с выборочными входами и сбора информации о области значений. calibrate функция реализует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция калибровки возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра квантованной сети.
dlQuantObj.calibrate(calibrationData_reduced)
ans =
35×5 table
Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue
____________________________ __________________ ________________________ ___________ __________
{'conv_1_Weights' } {'conv_1' } "Weights" -0.048978 0.039352
{'conv_1_Bias' } {'conv_1' } "Bias" 0.99996 1.0028
{'conv_2_Weights' } {'conv_2' } "Weights" -0.055518 0.061901
{'conv_2_Bias' } {'conv_2' } "Bias" -0.00061171 0.00227
{'conv_3_Weights' } {'conv_3' } "Weights" -0.045942 0.046927
{'conv_3_Bias' } {'conv_3' } "Bias" -0.0013998 0.0015218
{'conv_4_Weights' } {'conv_4' } "Weights" -0.045967 0.051
{'conv_4_Bias' } {'conv_4' } "Bias" -0.00164 0.0037892
{'fc_1_Weights' } {'fc_1' } "Weights" -0.051394 0.054344
{'fc_1_Bias' } {'fc_1' } "Bias" -0.00052319 0.00084454
{'fc_2_Weights' } {'fc_2' } "Weights" -0.05016 0.051557
{'fc_2_Bias' } {'fc_2' } "Bias" -0.0017564 0.0018502
{'fc_3_Weights' } {'fc_3' } "Weights" -0.050706 0.04678
{'fc_3_Bias' } {'fc_3' } "Bias" -0.02951 0.024855
{'imageinput' } {'imageinput' } "Activations" 0 255
{'imageinput_normalization'} {'imageinput' } "Activations" -139.34 198.11
{'conv_1' } {'conv_1' } "Activations" -431.01 290.14
{'relu_1' } {'relu_1' } "Activations" 0 290.14
{'maxpool_1' } {'maxpool_1' } "Activations" 0 290.14
{'conv_2' } {'conv_2' } "Activations" -166.41 466.4
{'relu_2' } {'relu_2' } "Activations" 0 466.4
{'maxpool_2' } {'maxpool_2' } "Activations" 0 466.4
{'conv_3' } {'conv_3' } "Activations" -219.6 300.65
{'relu_3' } {'relu_3' } "Activations" 0 300.65
{'maxpool_3' } {'maxpool_3' } "Activations" 0 299.73
{'conv_4' } {'conv_4' } "Activations" -245.37 209.11
{'relu_4' } {'relu_4' } "Activations" 0 209.11
{'maxpool_4' } {'maxpool_4' } "Activations" 0 209.11
{'fc_1' } {'fc_1' } "Activations" -123.79 77.114
{'relu_5' } {'relu_5' } "Activations" 0 77.114
{'fc_2' } {'fc_2' } "Activations" -16.557 17.512
{'relu_6' } {'relu_6' } "Activations" 0 17.512
{'fc_3' } {'fc_3' } "Activations" -13.049 37.204
{'softmax' } {'softmax' } "Activations" 1.4971e-22 1
{'classoutput' } {'classoutput'} "Activations" 1.4971e-22 1Установите целевую метрическую функцию и создайте dlquantizationOptions объект с целевой функцией метрики и набором данных валидации. В этом примере целевая метрическая функция вычисляет точность Top-5.
options = dlquantizationOptions('MetricFcn', {@(x)hComputeAccuracy(x,snet,validationData_reduced)});Примечание
Если пользовательская метрическая функция не задана, для валидации будет использоваться метрическая функция по умолчанию. Метрическая функция по умолчанию использует не более 5 файлов из datastore валидации, когда MATLAB® выбирается среда симуляции. Пользовательские метрические функции не имеют этого ограничения.
Используйте validate функция для квантования настраиваемых параметров в слоях свертки сети. validate Функция моделирует квантованную сеть в MATLAB. validate функция использует метрическую функцию, заданную в dlquantizationOptions объект для сравнения результатов сетевого объекта с одним типом данных с результатами квантованного сетевого объекта.
prediction = dlQuantObj.validate(validationData_reduced,options)
### Notice: (Layer 1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer 2) The layer 'out_imageinput' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: conv_1>>maxpool_4 ...
### Notice: (Layer 1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer 14) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: conv_1>>maxpool_4 ... complete.
Compiling leg: fc_1>>fc_3 ...
### Notice: (Layer 1) The layer 'maxpool_4' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer 7) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: fc_1>>fc_3 ... complete.
### Should not enter here. It means a component is unaccounted for in MATLAB Emulation.
### Notice: (Layer 1) The layer 'fc_3' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer 2) The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software.
### Notice: (Layer 3) The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
prediction =
struct with fields:
NumSamples: 5
MetricResults: [1×1 struct]Исследуйте MetricResults.Result поле выхода валидации для просмотра эффективности квантованной сети.
validateOut = prediction.MetricResults.Result
validateOut =
2×2 table
NetworkImplementation MetricOutput
_____________________ ____________
{'Floating-Point'} 1
{'Quantized' } 1
quantObj - Сеть для квантованияdlquantizer объектdlquantizer объект, задающий сеть для квантования.
valData - Данные для валидации квантованной сетиimageDataStore | объекта augmentedImageDataStore | объекта pixelLabelImageDataStore объектДанные для валидации квантованной сети, заданные как imageDataStore объект, augmentedImageDataStore объект, или pixelLabelImageDataStore объект.
quantOpts - Опции квантования сетиdlQuantizationOptions объектОпции квантования сети, заданные как dlquantizationOptions объект.
validationResults - Результаты квантования сетиРезультаты квантования сети, возвращенные как struct. Эти поля содержатся в struct.
NumSamples - Количество выборочных входов, используемых для проверки сети.
MetricResults - Struct, содержащая результаты метрической функции, заданные в dlquantizationOptions объект. Когда в dlquantizationOptions задано более одной метрической функции объект, MetricResults - массив структур.
MetricResults содержит эти поля.
| Область | Описание |
|---|---|
MetricFunction | Функция, используемая для определения эффективности квантованной сети. Эта функция задана в dlquantizationOptions объект. |
Result | Таблица, указывающая результаты метрической функции до и после квантования. Первая строка таблицы содержит информацию для исходной реализации с плавающей точкой. Вторая строка содержит информацию для квантованной реализации. Выход метрической функции отображается в |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.