Квантуйте глубокую нейронную сеть к 8-битным масштабированным целочисленным типам данных
Используйте приложение Deep Network Quantizer, чтобы уменьшить потребность в памяти глубокой нейронной сети путем квантования весов, смещений и активаций слоев свертки до 8-битных масштабированных целочисленных типов данных. Используя это приложение, вы можете:
Визуализируйте динамические области значений слоев свертки в глубокой нейронной сети.
Выберите отдельные слои сети для квантования.
Оцените эффективность квантованной сети.
Сгенерируйте код GPU для развертывания квантованной сети с помощью GPU Coder™.
Сгенерируйте HDL-код, чтобы развернуть квантованную сеть в FPGA с помощью Toolbox™ Deep Learning HDL.
Сгенерируйте код С++, чтобы развернуть квантованную сеть на микроконтроллере ARM Cortex-A с помощью MATLAB® Coder™.
Пакет поддержки Deep Learning Toolbox™ Model Quantization Library является бесплатным дополнением, которое можно скачать с помощью Add-On Explorer. Кроме того, см. Deep Learning Toolbox Model Quantization Library. Чтобы узнать о продуктах, необходимых для квантования и развертывания нейронной сети для глубокого обучения в среде GPU, FPGA или CPU, см. раздел Необходимых условий рабочего процесса квантования».
Командная строка MATLAB: Ввод deepNetworkQuantizer
.
MATLAB панели инструментов: На вкладке Apps, в разделе Machine Learning and Deep Learning, нажмите значок приложения.
Чтобы исследовать поведение нейронной сети с квантованными слоями свертки, используйте Deep Network Quantizer приложения. Этот пример квантует настраиваемые параметры слоев свертки squeezenet
нейронная сеть после переобучения сети для классификации новых изображений в соответствии с примером Traind Нейронной Сети для Глубокого Обучения to Classify New Images.
Этот пример использует сеть 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
В приложении нажмите New и выберите Quantize a network
.
Приложение проверяет ваше окружение выполнения. Для получения дополнительной информации см. раздел Необходимых условий рабочего процесса квантования».
В диалоговом окне выберите окружение выполнения и сеть для квантования из базового рабочего пространства. В данном примере выберите окружение выполнения графический процессор и сеть DAG, net
.
Приложение отображает график слоев выбранной сети.
В Calibrate разделе панели инструментов под Calibration Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные калибровки, calData
.
Нажмите Calibrate.
Этот Deep Network Quantizer использует данные калибровки для упражнения сети и сбора информации о области значений для настраиваемых параметров в слоях сети.
Когда калибровка завершена, приложение отображает таблицу, содержащую веса и смещения в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети и их минимальные и максимальные значения во время калибровки. Справа от таблицы приложение отображает гистограммы динамических областей значений параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких Нейронных Сетей.
В Quantize столбце таблицы укажите, нужно ли квантовать настраиваемые параметры в слое. Слои, которые не являются слоями свертки, не могут быть квантованы, и поэтому не могут быть выбраны. Слои, которые не квантуются, остаются с одинарной точностью после квантования.
В Validate разделе панели инструментов под Validation Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные валидации, aug_valData
.
В Validate разделе панели инструментов под Quantization Options выберите функцию Default metric.
Нажмите Quantize and Validate.
Этот Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети до масштабированных 8-битных целочисленных типов данных и использует данные валидации для выполнения сети. Приложение определяет метрическую функцию, которая будет использоваться для валидации, на основе типа сети, которая квантуется.
Тип сети | Метрическая функция |
---|---|
Классификация | Top-1 точности - точность сети |
Обнаружение объектов | Средняя точность - средняя точность по всем результатам обнаружения. Посмотрите |
Регресс | MSE - средняя квадратичная невязка сети |
Семантическая сегментация | evaluateSemanticSegmentation (Computer Vision Toolbox) - Оценка набора данных семантической сегментации с основной истиной |
Детектор одиночного выстрела (SSD) | WeightedIOU - Средний IoU каждого класса, взвешенный по количеству пикселей в этом классе |
Когда валидация завершена, приложение отображает результаты валидации, включая:
Метрическая функция, используемая для валидации
Результат метрической функции до и после квантования
Требования к памяти сети до и после квантования (МБ)
Если вы хотите использовать другую метрическую функцию для валидации, например, чтобы использовать Top-5 метрическую функцию точности вместо метрической функции точности Top-1 по умолчанию, можно задать пользовательскую метрическую функцию. Сохраните эту функцию в локальном файле.
function accuracy = 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
Чтобы переоценить сеть с помощью этой пользовательской метрической функции, в разделе Quantization Options введите имя пользовательской метрической функции, hComputeModelAccuracy
. Выберите Add для добавления hComputeModelAccuracy
в список метрических функций, доступных в приложении Выберите hComputeModelAccuracy
в качестве метрической функции, которую нужно использовать.
Пользовательская функция метрики должна быть в пути. Если метрическая функция отсутствует в пути, этот шаг вызовет ошибку.
Нажмите Quantize and Validate.
Приложение квантует сеть и отображает результаты валидации для пользовательской метрической функции.
Приложение отображает только скалярные значения в таблице результатов валидации. Чтобы просмотреть результаты валидации для пользовательской метрической функции с некалярным выходом, экспортируйте dlquantizer
объект, как описано ниже, затем проверьте с помощью validate
функция в командном окне MATLAB.
После квантования и проверки сети можно выбрать экспорт квантованной сети.
Нажмите кнопку Export. В выпадающем списке выберите Export Quantizer
для создания dlquantizer
объект в базовом рабочем пространстве. Чтобы открыть приложение GPU Coder и сгенерировать код GPU из квантованной нейронной сети, выберите Generate Code
. Для генерации кода GPU требуется лицензия GPU Coder.
Если эффективность квантованной сети не удовлетворительна, можно принять решение не квантовать некоторые слои, отменив выбор слоя в таблице. Чтобы увидеть эффекты, нажмите Quantize and Validate еще раз.
dlquantizer
Объект в приложение Deep Network QuantizerВ этом примере показано, как импортировать dlquantizer
объект из базового рабочего пространства в приложение Deep Network Quantizer. Это позволяет начать квантование глубокой нейронной сети с помощью командной строки или приложения и возобновить работу позже в приложении.
Загрузите сеть для квантования в базовое рабочее пространство.
net
net = DAGNetwork with properties: Layers: [68x1 nnet.cnn.layer.Layer] Connections: [75x2 table] InputNames: {'data'} OutputNames: {'new_classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Данные калибровки используются для сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети и динамических областей значений активаций во всех слоях сети. Для наилучших результатов квантования калибровочные данные должны быть показательными для входов в сеть.
Данные валидации используются для тестирования сети после квантования, чтобы понять эффекты ограниченной области значений и точности квантованных слоев свертки в сети.
В этом примере используйте изображения в MerchData
набор данных. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [calData, valData] = splitEachLabel(imds, 0.7, 'randomized'); aug_calData = augmentedImageDatastore([227 227], calData); aug_valData = augmentedImageDatastore([227 227], valData);
Создайте dlquantizer
объект и укажите сеть для квантования.
quantObj = dlquantizer(net);
Используйте calibrate
функция для упражнения сети с выборочными входами и сбора информации о области значений. Функция калибровки использует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.
calResults = calibrate(quantObj, aug_calData)
calResults = 95x5 table Optimized Layer Name Network Layer Name Learnables / Activations MinValue MaxValue __________________________________________________ _________________________ ________________________ __________ __________ {'conv1_relu_conv1_Weights' } {'relu_conv1' } "Weights" -0.91985 0.88489 {'conv1_relu_conv1_Bias' } {'relu_conv1' } "Bias" -0.07925 0.26343 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Weights'} {'fire2-relu_squeeze1x1'} "Weights" -1.38 1.2477 {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Bias' } {'fire2-relu_squeeze1x1'} "Bias" -0.11641 0.24273 {'fire2-expand1x1_fire2-relu_expand1x1_Weights' } {'fire2-relu_expand1x1' } "Weights" -0.7406 0.90982 {'fire2-expand1x1_fire2-relu_expand1x1_Bias' } {'fire2-relu_expand1x1' } "Bias" -0.060056 0.14602 {'fire2-expand3x3_fire2-relu_expand3x3_Weights' } {'fire2-relu_expand3x3' } "Weights" -0.74397 0.66905 {'fire2-expand3x3_fire2-relu_expand3x3_Bias' } {'fire2-relu_expand3x3' } "Bias" -0.051778 0.074239 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Weights'} {'fire3-relu_squeeze1x1'} "Weights" -0.77262 0.68583 {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Bias' } {'fire3-relu_squeeze1x1'} "Bias" -0.10145 0.32669 {'fire3-expand1x1_fire3-relu_expand1x1_Weights' } {'fire3-relu_expand1x1' } "Weights" -0.72083 0.97157 {'fire3-expand1x1_fire3-relu_expand1x1_Bias' } {'fire3-relu_expand1x1' } "Bias" -0.067019 0.30422 {'fire3-expand3x3_fire3-relu_expand3x3_Weights' } {'fire3-relu_expand3x3' } "Weights" -0.61403 0.77544 {'fire3-expand3x3_fire3-relu_expand3x3_Bias' } {'fire3-relu_expand3x3' } "Bias" -0.053621 0.1033 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Weights'} {'fire4-relu_squeeze1x1'} "Weights" -0.74164 1.0865 {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Bias' } {'fire4-relu_squeeze1x1'} "Bias" -0.10885 0.13875 ...
Откройте приложение Deep Network Quantizer.
deepNetworkQuantizer
В приложении нажмите New и выберите Import dlquantizer object
.
В диалоговом окне выберите dlquantizer
объект для импорта из базового рабочего пространства.
Приложение импортирует любые данные, содержащиеся в dlquantizer
объект, который был собран в командной строке. Эти данные могут включать сеть квантования, данные калибровки, данные валидации и статистику калибровки.
Приложение отображает таблицу, содержащую данные калибровки, содержащиеся в импортированном dlquantizer
объект, quantObj
. Справа от таблицы приложение отображает гистограммы динамических областей значений параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких Нейронных Сетей.
Чтобы исследовать поведение нейронной сети, которая квантовала слои свертки, используйте Deep Network Quantizer приложения. Этот пример квантует настраиваемые параметры слоев свертки LogoNet
нейронная сеть.
В данном примере вам нужны продукты, перечисленные в FPGA
в необходимых условиях «Предпосылки рабочего процесса квантования».
Дополнительные потребности см. в разделе Необходимых условий рабочего процесса квантования.
Создайте файл в текущей рабочей папке с именем getLogoNetwork.m
. В файле введите:
function net = getLogoNetwork() if ~isfile('LogoNet.mat') url = 'https://www.mathworks.com/supportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat'; websave('LogoNet.mat',url); end data = load('LogoNet.mat'); net = data.convnet; end
Загрузите предварительно обученную сеть.
snet = getLogoNetwork();
snet = SeriesNetwork with properties: Layers: [22×1 nnet.cnn.layer.Layer] InputNames: {'imageinput'} OutputNames: {'classoutput'}
Задайте данные калибровки и валидации, которые будут использоваться для квантования.
Приложение использует данные калибровки для упражнения сети и сбора динамических областей значений весов и смещений в свертках и полносвязных слоях сети. Приложение также использует динамические области значений активаций во всех слоях сети LogoNet. Для наилучших результатов квантования калибровочные данные должны быть показательными по входам в сеть LogoNet.
После квантования приложение использует набор данных валидации, чтобы протестировать сеть, чтобы понять эффекты ограниченной области значений и точности квантованных настраиваемых параметров слоев свертки в сети.
В этом примере используйте изображения в logos_dataset
набор данных для калибровки и проверки сети LogoNet. Задайте augmentedImageDatastore
объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.
Ускорите процесс калибровки и валидации с помощью подмножества calibrationData
и validationData
. Сохраните новые сокращенные данные калибровки в calibrationData_concise
и новый сокращенный набор данных валидации в validationData_concise
.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir); unzip('logos_dataset.zip'); imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); [calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized'); calibrationData_concise = calibrationData.subset(1:20); validationData_concise = vaidationData.subset(1:1);
В командной строке MATLAB откройте приложение Deep Network Quantizer.
deepNetworkQuantizer
Нажмите New и выберите Quantize a network
.
Приложение проверяет ваше окружение выполнения.
Выберите окружение выполнения и сеть для квантования из базового рабочего пространства. В данном примере выберите окружение выполнения FPGA и сеть последовательного snet
.
Приложение отображает график слоев выбранной сети.
В Calibrate разделе панели инструментов приложения под Calibration Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные калибровки calibrationData_concise
.
Нажмите Calibrate.
Приложение Deep Network Quantizer использует данные калибровки для упражнения сети и сбора информации о области значений для настраиваемых параметров в слоях сети.
Когда калибровка завершена, приложение отображает таблицу, содержащую веса и смещения в свертках и полносвязных слоях сети. Также отображаются динамические области значений активаций во всех слоях сети и их минимальные и максимальные значения во время калибровки. Приложение отображает гистограммы динамических областей значений параметров. Серые области гистограмм указывают данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких Нейронных Сетей.
В Quantize столбце таблицы укажите, нужно ли квантовать настраиваемые параметры в слое. Вы не можете квантовать слои, которые не являются слоями свертки. Слои, которые не квантуются, остаются с одной точностью.
В Validate разделе панели инструментов приложения под Validation Data выберите augmentedImageDatastore
объект из базового рабочего пространства, содержащего данные валидации validationData_concise
.
В Hardware Settings разделе панели инструментов выберите из опций, перечисленных в таблице:
Среда симуляции | Действие |
MATLAB (симуляция в MATLAB) | Моделирует квантованную сеть в MATLAB. Проверяет квантованную сеть путем сравнения эффективности с одноточной версией сети. |
Программа Intel Arria 10 SoC (arria10soc_int8) | Развертывает квантованную сеть в корпорации Intel® Arria® Плата 10 SoC при помощи |
Xilinx ZCU102 (zcu102_int8) | Развертывает квантованную сеть на Xilinx® Zynq® UltraScale+™ плату MPSoC ZCU102 10 SoC при помощи |
Xilinx ZC706 (zc706_int8) | Развертывает квантованную сеть на плате Xilinx Zynq-7000 ZC706 с помощью |
Когда вы выбираете Intel Arria 10 SoC (arria10soc_int8)
, Xilinx ZCU102 (zcu102_int8)
, или Xilinx ZC706 (zc706_int8)
Опциями выберите интерфейс, который будет использоваться для развертывания и проверки квантованной сети. Опции Target интерфейса перечислены в этой таблице.
Целевая опция | Действие |
JTAG | Программирует целевую плату FPGA, выбранную в Среду симуляции, с помощью кабеля JTAG. Для получения дополнительной информации смотрите JTAG Connection (Deep Learning HDL Toolbox) |
Ethernet | Программирует целевую плату FPGA, выбранную в Среду симуляции, через интерфейс Ethernet. Укажите IP-адрес целевой платы в IP Address. |
В данном примере выберите Xilinx ZCU102 (zcu102_int8)
выберите Ethernet и введите IP-адрес платы.
В Validate разделе панели инструментов приложения под Quantization Options выберите функцию Default metric.
Нажмите Quantize and Validate.
Приложение Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети до масштабированных 8-битных целочисленных типов данных и использует данные валидации для упражнения сети. Приложение определяет метрическую функцию, которая будет использоваться для валидации, на основе типа сети, которая квантуется.
Тип сети | Метрическая функция |
---|---|
Классификация | Top-1 точности - точность сети |
Обнаружение объектов | Средняя точность - средняя точность по всем результатам обнаружения. Посмотрите |
Регресс | MSE - средняя квадратичная невязка сети |
Семантическая сегментация | evaluateSemanticSegmentation (Computer Vision Toolbox) - Оценка набора данных семантической сегментации с основной истиной |
Детектор одиночного выстрела (SSD) | WeightedIOU - Средний IoU каждого класса, взвешенный по количеству пикселей в этом классе |
Когда валидация завершена, приложение отображает результаты валидации, включая:
Метрическая функция, используемая для валидации
Результат метрической функции до и после квантования
Если вы хотите использовать другую метрическую функцию для валидации, например, чтобы использовать Top-5 метрическую функцию точности вместо метрической функции точности Top-1 по умолчанию, можно задать пользовательскую метрическую функцию. Сохраните эту функцию в локальном файле.
function accuracy = hComputeAccuracy(predictionScores, net, dataStore) %% Computes model-level accuracy statistics % Load ground truth tmp = readall(dataStore); groundTruth = tmp.response; % Compare with predicted label with actual ground truth predictionError = {}; for idx=1:numel(groundTruth) [~, idy] = max(predictionScores(idx,:)); yActual = net.Layers(end).Classes(idy); predictionError{end+1} = (yActual == groundTruth(idx)); %#ok end % Sum all prediction errors. predictionError = [predictionError{:}]; accuracy = sum(predictionError)/numel(predictionError); end
Чтобы переоценить сеть с помощью этой пользовательской метрической функции, в разделе Quantization Options введите имя пользовательской метрической функции hComputeAccuracy
. Выберите Add для добавления hComputeAccuracy
в список метрических функций, доступных в приложении Выберите hComputeAccuracy
в качестве метрической функции, которую нужно использовать.
Пользовательская функция метрики должна быть в пути. Если метрическая функция не находится в пути, этот шаг вызывает ошибку.
Нажмите Quantize and Validate.
Приложение квантует сеть и отображает результаты валидации для пользовательской метрической функции.
Приложение отображает только скалярные значения в таблице результатов валидации. Чтобы просмотреть результаты валидации для пользовательской метрической функции с нескалярными выходами, экспортируйте dlquantizer
объект затем проверьте квантованную сеть с помощью validate
функция в командном окне MATLAB.
После квантования и проверки сети можно выбрать экспорт квантованной сети.
Нажмите кнопку Export. В раскрывающемся списке выберите Export Quantizer
для создания dlquantizer
объект в базовом рабочем пространстве. Можно развернуть квантованную сеть на целевой плате FPGA и получить результаты предсказания с помощью MATLAB. См. пример развертывания квантованной сети (Deep Learning HDL Toolbox).
Если эффективность квантованной сети не удовлетворительна, можно принять решение не квантовать некоторые слои, очистив слой в таблице. Еще раз нажмите Quantize and Validate.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.