Квантование глубокой нейронной сети в 8-битные масштабированные целочисленные типы данных
Используйте приложение Deep Network Quantizer, чтобы уменьшить требования к памяти глубокой нейронной сети, квантуя веса, смещения и активации слоев свертки до 8-битных масштабированных целочисленных типов данных. С помощью этого приложения можно:
Визуализация динамических диапазонов слоев свертки в глубокой нейронной сети.
Выберите отдельные сетевые уровни для квантования.
Оценка производительности квантованной сети.
Создание кода GPU для развертывания квантованной сети с использованием Coder™ GPU.
Создание кода HDL для развертывания квантованной сети в FPGA с использованием Toolbox™ HDL Deep Learning.
Создайте код C++ для развертывания квантованной сети на микроконтроллере ARM Cortex-A с помощью MATLAB ® Coder™.
Пакет поддержки библиотеки квантования Deep Learning Toolbox™ Model - это бесплатная надстройка, которую можно загрузить с помощью проводника Add-On. Также см. раздел Библиотека квантования модели панели инструментов глубокого обучения. Сведения о продуктах, необходимых для квантования и развертывания сети глубокого обучения в среде GPU, FPGA или CPU, см. в разделе Предварительные условия потока операций квантования.

командная строка MATLAB: Enter deepNetworkQuantizer.
Панель инструментов MATLAB: на вкладке «Приложения» в разделе «Машинное обучение» и «Глубокое обучение» щелкните значок приложения.
Чтобы исследовать поведение нейронной сети с квантованными слоями свертки, используйте приложение Глубокий сетевой квантователь. Этот пример квантует обучаемые параметры слоев свертки squeezenet нейросеть после переподготовки сети для классификации новых изображений в соответствии с примером Train Deep Learning Network для классификации новых изображений.
В этом примере используется сеть DAG с средой выполнения графического процессора.
Загрузите сеть для квантования в базовую рабочую область.
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);
В командной строке MATLAB откройте приложение.
deepNetworkQuantizer
В приложении щелкните Создать и выберите Quantize a network.
Приложение проверяет среду выполнения. Дополнительные сведения см. в разделе Предварительные условия потока операций квантования.
В диалоговом окне выберите среду выполнения и сеть для квантования из базовой рабочей области. В этом примере выберите среду выполнения графического процессора и сеть DAG. net.

Приложение отображает график слоев выбранной сети.
В разделе Калибровка (Calibrate) панели инструментов в разделе Калибровочные данные (Calibration Data) выберите augmentedImageDatastore объект из базового рабочего пространства, содержащего данные калибровки, calData.
Щелкните Калибровка (Calibrate).
Глубокий сетевой квантователь использует калибровочные данные для проверки сети и сбора информации о диапазоне для обучаемых параметров на сетевых уровнях.
По завершении калибровки приложение отображает таблицу, содержащую веса и смещения в сверточных и полностью соединенных слоях сети, а также динамические диапазоны активизаций на всех уровнях сети и их минимальные и максимальные значения во время калибровки. Справа от таблицы приложение отображает гистограммы динамических диапазонов параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Дополнительные сведения о том, как интерпретировать эти гистограммы, см. в разделе Квантование глубоких нейронных сетей.

В столбце Квантование таблицы укажите, следует ли квантовать обучаемые параметры на уровне. Слои, которые не являются слоями свертки, не могут быть квантованы и поэтому не могут быть выбраны. Слои, которые не квантуются, остаются с одной точностью после квантования.
В разделе «Проверка» панели инструментов в разделе «Данные проверки» выберите augmentedImageDatastore объект из базовой рабочей области, содержащий данные проверки; aug_valData.
В разделе «Проверка» панели инструментов в разделе «Параметры квантования» выберите функцию метрики по умолчанию.
Щелкните Квантовать (Quantize) и Проверить (Validate).
Глубокий сетевой квантователь квантует веса, активации и смещения слоев свертки в сети до масштабированных 8-битовых целочисленных типов данных и использует данные проверки подлинности для осуществления сети. Приложение определяет метрическую функцию для использования при проверке на основе типа сети, которая квантуется.
| Тип сети | Метрическая функция |
|---|---|
| Классификация | Top-1 Точность - точность сети |
| Обнаружение объектов | Средняя точность (Average Precision) - средняя точность по всем результатам обнаружения. Посмотрите |
| Регресс | MSE - среднеквадратичная ошибка сети |
| Семантическая сегментация | evaluateSemanticSegmentation (Computer Vision Toolbox) - Оценка набора семантических данных сегментации с учетом истинного состояния земли |
| Однокадровый детектор (SSD) | WeightedIOU - Средний IoU каждого класса, нагруженного числом пикселей в том классе |
По завершении проверки приложение отображает результаты проверки, включая:
Метрическая функция, используемая для проверки
Результат метрической функции до и после квантования
Требования к памяти сети до и после квантования (МБ)

Если Вы хотите использовать другую метрическую функцию для проверки, например, использовать Лучшие 5 метрических функций точности вместо дефолта Лучшая 1 метрическая функция точности, Вы можете определить таможенную метрическую функцию. Сохраните эту функцию в локальном файле.
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
Для повторной проверки сети с помощью этой пользовательской метрической функции в разделе «Параметры квантования» введите имя пользовательской метрической функции. hComputeModelAccuracy. Выберите Добавить для добавления hComputeModelAccuracy в список метрических функций, доступных в приложении. Выберите hComputeModelAccuracy в качестве используемой метрической функции.
Пользовательская метрическая функция должна находиться в пути. Если метрическая функция не находится на пути, то на этом шаге возникнет ошибка.

Щелкните Квантовать (Quantize) и Проверить (Validate)
Приложение квантует сеть и отображает результаты проверки для пользовательской метрической функции.

Приложение отображает только скалярные значения в таблице результатов проверки. Чтобы просмотреть результаты проверки для пользовательской метрической функции с нескалярным выводом, экспортируйте dlquantizer как описано ниже, затем проверьте с помощью validate в окне команд MATLAB.
После квантования и проверки сети можно экспортировать квантованную сеть.
Нажмите кнопку «Экспорт». В раскрывающемся списке выберите Export Quantizer для создания dlquantizer в базовой рабочей области. Чтобы открыть приложение GPU Coder и сгенерировать код GPU из квантованной нейронной сети, выберите Generate Code. Для создания кода графического процессора требуется лицензия кодера графического процессора.
Если производительность квантованной сети неудовлетворительна, можно отказаться от квантования некоторых уровней, отменив выбор уровня в таблице. Чтобы увидеть эффекты, снова щелкните Квантовать (Quantize) и Проверить (Validate).
dlquantizer Объект в приложении глубинного сетевого квантователяВ этом примере показано, как импортировать dlquantizer объект из базовой рабочей области в приложение Глубокий сетевой квантователь. Это позволяет начать квантование глубокой нейронной сети с помощью командной строки или приложения и возобновить работу позже в приложении.
Загрузите сеть для квантования в базовую рабочую область.
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
...Откройте приложение Глубокий сетевой квантователь.
deepNetworkQuantizer
В приложении щелкните Создать и выберите Import dlquantizer object.

В диалоговом окне выберите dlquantizer объект для импорта из базовой рабочей области.

Приложение импортирует любые данные, содержащиеся в dlquantizer объект, собранный в командной строке. Эти данные могут включать в себя данные квантования сети, данные калибровки, данные проверки достоверности и статистику калибровки.
Приложение отображает таблицу, содержащую калибровочные данные, содержащиеся в импортированном dlquantizer объект, quantObj. Справа от таблицы приложение отображает гистограммы динамических диапазонов параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Дополнительные сведения о том, как интерпретировать эти гистограммы, см. в разделе Квантование глубоких нейронных сетей.

Чтобы исследовать поведение нейронной сети, которая имеет квантованные уровни свертки, используйте приложение Глубокий сетевой квантователь. Этот пример квантует обучаемые параметры слоев свертки 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 откройте приложение Глубокий сетевой квантователь.
deepNetworkQuantizer
Щелкните Создать и выберите Quantize a network.
Приложение проверяет среду выполнения.
Выберите среду выполнения и сеть для квантования из базовой рабочей области. В этом примере выберите среду выполнения FPGA и последовательную сеть. snet.

Приложение отображает график слоев выбранной сети.
В разделе Калибровка на панели инструментов приложения в разделе Калибровочные данные выберите augmentedImageDatastore объект из базового рабочего пространства, содержащего данные калибровки calibrationData_concise.
Щелкните Калибровка (Calibrate).
Приложение Deep Network Quantizer использует калибровочные данные для проверки сети и сбора информации о диапазоне для обучаемых параметров на сетевых уровнях.
По завершении калибровки приложение отображает таблицу, содержащую веса и смещения в свертке и полностью соединенных уровнях сети. Также отображаются динамические диапазоны активизаций на всех уровнях сети и их минимальные и максимальные значения во время калибровки. Приложение отображает гистограммы динамических диапазонов параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Дополнительные сведения о том, как интерпретировать эти гистограммы, см. в разделе Квантование глубоких нейронных сетей.

В столбце Квантование таблицы укажите, следует ли квантовать обучаемые параметры на уровне. Нельзя квантовать слои, которые не являются слоями свертки. Уровни, которые не квантуются, остаются с одной точностью.
В разделе Проверить на панели инструментов приложения в разделе Данные проверки выберите augmentedImageDatastore объект из базовой рабочей области, содержащий данные проверки validationData_concise.
В разделе «Параметры оборудования» на панели инструментов выберите один из параметров, перечисленных в таблице:
| Среда моделирования | Действие |
| MATLAB (моделирование в MATLAB) | Имитирует квантованную сеть в MATLAB. Проверка квантованной сети путем сравнения производительности с версией сети с одной точностью. |
| Intel Arria 10 SoC (arria10soc_int8) | Развертывание квантованной сети на плате Intel ® Arria ® 10 SoC с помощью |
| Ксилинкс ZCU102 (zcu102_int8) | Развертывание квантованной сети на плате SoC Xilinx ® Zynq ® UltraScale+™ MPSoC ZCU102 10 с помощью |
| Ксилинкс ZC706 (zc706_int8) | Развертывание квантованной сети на плате Xilinx Zynq-7000 ZC706 с помощью |
При выборе Intel Arria 10 SoC (arria10soc_int8), Xilinx ZCU102 (zcu102_int8), или Xilinx ZC706 (zc706_int8) выберите интерфейс для развертывания и проверки квантованной сети. В этой таблице перечислены параметры целевого интерфейса.
| Целевой вариант | Действие |
| JTAG | Программирование целевой платы FPGA, выбранной в среде моделирования, с помощью кабеля JTAG. Дополнительные сведения см. в разделе Подключение JTAG (инструментарий глубокого обучения HDL) |
| Ethernet | Программирование целевой платы FPGA, выбранной в среде моделирования, через интерфейс Ethernet. В поле IP Address укажите IP-адрес целевой платы. |
В этом примере выберите Xilinx ZCU102 (zcu102_int8), выберите Ethernet и введите IP-адрес платы.

В разделе Проверка панели инструментов приложения в разделе Параметры квантования выберите функцию метрики по умолчанию.
Щелкните Квантовать (Quantize) и Проверить (Validate).
Приложение Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети до масштабированных 8-битовых целочисленных типов данных и использует данные проверки для выполнения сети. Приложение определяет метрическую функцию для использования при проверке на основе типа сети, которая квантуется.
| Тип сети | Метрическая функция |
|---|---|
| Классификация | Top-1 Точность - точность сети |
| Обнаружение объектов | Средняя точность (Average Precision) - средняя точность по всем результатам обнаружения. Посмотрите |
| Регресс | 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
Для повторной проверки сети с помощью этой пользовательской метрической функции в разделе «Параметры квантования» введите имя пользовательской метрической функции. hComputeAccuracy. Выберите Добавить для добавления hComputeAccuracy в список метрических функций, доступных в приложении. Выберите hComputeAccuracy в качестве используемой метрической функции.
Пользовательская метрическая функция должна находиться в пути. Если метрическая функция отсутствует в пути, то на этом шаге возникает ошибка.

Щелкните Квантовать (Quantize) и Проверить (Validate).
Приложение квантует сеть и отображает результаты проверки для пользовательской метрической функции.

Приложение отображает только скалярные значения в таблице результатов проверки. Чтобы просмотреть результаты проверки для пользовательской метрической функции с нескалярным выводом, экспортируйте dlquantizer затем проверьте квантованную сеть с помощью validate в окне команд MATLAB.
После квантования и проверки сети можно экспортировать квантованную сеть.
Нажмите кнопку «Экспорт». В раскрывающемся списке выберите Export Quantizer для создания dlquantizer в базовой рабочей области. Можно развернуть квантованную сеть на целевой плате FPGA и извлечь результаты прогнозирования с помощью MATLAB. См., Пример развертывания квантованной сети (инструментарий глубокого обучения HDL).
Если производительность квантованной сети неудовлетворительна, можно выбрать, чтобы не квантовать некоторые уровни, очистив уровень в таблице. Снова щелкните Квантовать (Quantize) и Проверить (Validate).
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.