Deep Network Quantizer

Квантуйте глубокую нейронную сеть к 8-битным масштабированным целочисленным типам данных

Описание

Используйте приложение Deep Network Quantizer, чтобы уменьшать требования к памяти глубокой нейронной сети путем квантования весов, смещений и активаций слоев свертки к 8-битным масштабированным целочисленным типам данных. Используя это приложение вы можете:

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

  • Выберите отдельные слоя сети, чтобы квантовать.

  • Оцените эффективность квантованной сети.

  • Сгенерируйте код графического процессора, чтобы развернуть квантованную сеть с помощью GPU Coder™.

  • Сгенерируйте HDL-код, чтобы развернуть квантованную сеть в FPGA с помощью Deep Learning HDL Toolbox™.

  • Сгенерируйте Код С++, чтобы развернуть квантованную сеть в ARM микроконтроллер Cortex-A с помощью MATLAB® Coder™.

Пакет поддержки Библиотеки Квантования Модели Deep Learning Toolbox™ является свободным дополнением, что можно загрузить использование Add-On Explorer. В качестве альтернативы смотрите Библиотеку Квантования Модели Deep Learning Toolbox. Чтобы узнать о продуктах, требуемых квантовать и развернуть нейронную сеть для глубокого обучения в графический процессор, FPGA или среда центрального процессора, видит Необходимые условия Рабочего процесса Квантования.

Deep Network Quantizer app

Откройте приложение Deep Network Quantizer

  • Командная строка MATLAB: Войти deepNetworkQuantizer.

  • Панель инструментов MATLAB: На вкладке Apps, под Machine Learning and Deep Learning, кликают по значку приложения.

Примеры

развернуть все

Чтобы исследовать поведение нейронной сети с квантованными слоями свертки, используйте приложение Deep Network Quantizer. Этот пример квантует настраиваемые параметры слоев свертки squeezenet нейронная сеть после переобучения сети, чтобы классифицировать новые изображения согласно Обучать Нейронной сети для глубокого обучения, чтобы Классифицировать Новый пример Изображений.

Этот пример использует сеть 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.

Приложение проверяет вашу среду выполнения. Для получения дополнительной информации смотрите Необходимые условия Рабочего процесса Квантования.

В диалоговом окне выберите среду выполнения и сеть, чтобы квантовать от базового рабочего пространства. В данном примере выберите среду выполнения GPU и сеть DAG, net.

Select a network and execution environment

Отображения приложения график слоев выбранной сети.

В разделе Calibrate панели инструментов, под Calibration Data, выбирают augmentedImageDatastore объект от базового рабочего пространства, содержащего калибровочные данные, calData.

Нажмите Calibrate.

Deep Network Quantizer использует калибровочные данные, чтобы осуществить сеть и собрать информацию области значений для настраиваемых параметров в слоях сети.

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

Deep Network Quantizer calibration

В столбце Quantize таблицы укажите, квантовать ли настраиваемые параметры в слое. Слои, которые не являются слоями свертки, не могут быть квантованы, и поэтому не могут быть выбраны. Слои, которые не квантуются, остаются в с одинарной точностью после квантования.

В разделе Validate панели инструментов, под Validation Data, выбирают augmentedImageDatastore объект от базового рабочего пространства, содержащего данные о валидации, aug_valData.

В разделе Validate панели инструментов, под Quantization Options, выбирают метрическую функцию Default.

Нажмите Quantize and Validate.

Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети к масштабированным 8-битным целочисленным типам данных и использует данные о валидации, чтобы осуществить сеть. Приложение определяет метрическую функцию, чтобы использовать для валидации на основе типа сети, которая квантуется.

Тип сетиМетрическая функция
Классификация

Лучшая 1 Точность – Точность сети

Обнаружение объектов

Средняя Точность – Средняя точность по всем результатам обнаружения. Смотрите evaluateDetectionPrecision (Computer Vision Toolbox).

Регрессия

MSE – Среднеквадратическая ошибка сети

Семантическая СегментацияevaluateSemanticSegmentation (Computer Vision Toolbox) – Оцените набор данных семантической сегментации против основной истины
Один детектор выстрела (SSD)

WeightedIOU – Средний IoU каждого класса, взвешенного количеством пикселей в том классе

Когда валидация завершена, отображения приложения результаты валидации, включая:

  • Метрическая функция используется для валидации

  • Результат метрической функции до и после квантования

  • Требования к памяти сети до и после квантования (Мбайт)

Deep Network Quantizer validation

Если вы хотите использовать различную метрическую функцию для валидации, например, использовать Лучшие 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

Чтобы подтвердить сеть с помощью этой пользовательской метрической функции, под Quantization Options, вводят имя пользовательской метрической функции, hComputeModelAccuracy. Выберите Add, чтобы добавить hComputeModelAccuracy к списку метрических функций, доступных в приложении. Выберите hComputeModelAccuracy как метрическая функция, чтобы использовать.

Пользовательская метрическая функция должна быть на пути. Если метрическая функция не будет на пути, этот шаг произведет ошибку.

Deep Network Quantizer select custom metric function

Нажмите Quantize and Validate.

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

Deep Network Quantizer validation

Отображения приложения только скалярные значения в таблице результатов валидации. Чтобы просмотреть результаты валидации для пользовательской метрической функции с нескалярным выходом, экспортируйте dlquantizer объект, аналогичный описанному ниже, затем подтвердите использование validate функция в окне команды MATLAB.

После квантования и проверения сети, можно принять решение экспортировать квантованную сеть.

Нажмите кнопку Export. В выпадающем списке выберите Export Quantizer создать dlquantizer объект в базовом рабочем пространстве. Чтобы открыть приложение GPU Coder и сгенерировать код графического процессора от квантованной нейронной сети, выберите Generate Code. Генерация кода графического процессора требует лицензии GPU Coder.

Если эффективность квантованной сети не является удовлетворительной, можно принять решение не квантовать некоторые слои путем отмены выбора слоя в таблице. Чтобы видеть эффекты, нажмите Quantize and Validate снова.

Этот пример показывает вам, как импортировать 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.

Deep Network Quantizer import dlquantizer object

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

Select a dlquantizer object to import

Приложение импортирует любые данные, содержавшиеся в dlquantizer объект, который был собран в командной строке. Эти данные могут включать сеть, чтобы квантовать, калибровочные данные, данные о валидации и калибровочная статистика.

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

Deep Network Quantizer app

Чтобы исследовать поведение нейронной сети, которая квантовала слои свертки, используйте приложение 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.

Select a network and execution environment

Отображения приложения график слоев выбранной сети.

В разделе Calibrate панели инструментов приложения, под Calibration Data, выбирают augmentedImageDatastore объект от базового рабочего пространства, содержащего калибровочные данные calibrationData_concise.

Нажмите Calibrate.

Приложение Deep Network Quantizer использует калибровочные данные, чтобы осуществить сеть и собрать информацию области значений для настраиваемых параметров в слоях сети.

Когда калибровка завершена, отображения приложения таблица, содержащая веса и смещения в свертке и полносвязных слоях сети. Также отображенный динамические диапазоны активаций во всех слоях сети и их минимальных и максимальных значений во время калибровки. Гистограммы отображений приложения динамических диапазонов параметров. Серые области гистограмм указывают на данные, которые не могут быть представлены квантованным представлением. Для получения дополнительной информации о том, как интерпретировать эти гистограммы, смотрите Квантование Глубоких нейронных сетей.

Deep Network Quantizer calibration

В столбце Quantize таблицы укажите, квантовать ли настраиваемые параметры в слое. Вы не можете квантовать слои, которые не являются слоями свертки. Слои, которые не квантуются, остаются в с одинарной точностью.

В разделе Validate панели инструментов приложения, под Validation Data, выбирают augmentedImageDatastore объект от базового рабочего пространства, содержащего данные о валидации validationData_concise.

В разделе Hardware Settings панели инструментов выберите из перечисленных в таблице опций:

Среда симуляцииДействие
MATLAB (Симулируют в MATLAB),Симулирует квантованную сеть в MATLAB. Проверяет квантованную сеть путем сравнения эффективности с версией с одинарной точностью сети.
Intel Arria 10 SoC (arria10soc_int8)

Развертывает квантованную сеть в плату Intel® Arria® 10 SoC при помощи arria10soc_int8 поток битов. Проверяет квантованную сеть путем сравнения эффективности с версией с одинарной точностью сети.

Xilinx ZCU102 (zcu102_int8)

Развертывает квантованную сеть в Xilinx® Zynq® UltraScale +™ плата MPSoC ZCU102 10 SoC при помощи zcu102_int8 поток битов. Проверяет квантованную сеть путем сравнения эффективности с версией с одинарной точностью сети.

Xilinx ZC706 (zc706_int8)

Развертывает квантованную сеть в плату Xilinx Zynq-7000 ZC706 при помощи zc706_int8 поток битов. Проверяет квантованную сеть путем сравнения эффективности с версией с одинарной точностью сети.

Когда вы выбираете Intel Arria 10 SoC (arria10soc_int8), Xilinx ZCU102 (zcu102_int8), или Xilinx ZC706 (zc706_int8) опции, выберите интерфейс, чтобы использовать, чтобы развернуть и проверить квантованную сеть. Опции интерфейса Target перечислены в этой таблице.

Целевая опцияДействие
JTAGПрограммирует целевую плату FPGA, выбранную в Среде симуляции при помощи кабеля JTAG. Для получения дополнительной информации см. Связь JTAG (Deep Learning HDL Toolbox)
EthernetПрограммирует целевую плату FPGA, выбранную в Среде симуляции через интерфейс Ethernet. Задайте IP-адрес для своей требуемой платы в IP Address.

В данном примере выберите Xilinx ZCU102 (zcu102_int8), выберите Ethernet и введите IP-адрес платы.

Deep Network Quantizer Hardware Settings

В разделе Validate панели инструментов приложения, под Quantization Options, выбирают метрическую функцию Default.

Нажмите Quantize and Validate.

Приложение Deep Network Quantizer квантует веса, активации и смещения слоев свертки в сети к масштабированным 8-битным целочисленным типам данных и использует данные о валидации, чтобы осуществить сеть. Приложение определяет метрическую функцию, чтобы использовать для валидации на основе типа сети, которая квантуется.

Тип сетиМетрическая функция
Классификация

Лучшая 1 Точность – Точность сети

Обнаружение объектов

Средняя Точность – Средняя точность по всем результатам обнаружения. Смотрите evaluateDetectionPrecision (Computer Vision Toolbox).

Регрессия

MSE – Среднеквадратическая ошибка сети

Семантическая СегментацияevaluateSemanticSegmentation (Computer Vision Toolbox) – Оцените набор данных семантической сегментации против основной истины
Один детектор выстрела (SSD)

WeightedIOU – Средний IoU каждого класса, взвешенного количеством пикселей в том классе

Когда валидация завершена, отображения приложения результаты валидации, включая:

  • Метрическая функция используется для валидации

  • Результат метрической функции до и после квантования

Deep Network Quantizer validation

Если вы хотите использовать различную метрическую функцию для валидации, например, использовать Лучшие 5 метрических функций точности вместо Лучшей 1 метрической функции точности по умолчанию, можно задать пользовательскую метрическую функцию. Сохраните эту функцию в локальном файле.

function accuracy = hComputeAccuracy(predictionScores, net, dataStore)
%% Computes model-level accuracy statistics
    
    % Load ground truth
    tmp = readall(dataStore);
    groundTruth = tmp.response;
    
    % Compare with predicted label with actual ground truth 
    predictionError = {};
    for idx=1:numel(groundTruth)
        [~, idy] = max(predictionScores(idx,:)); 
        yActual = net.Layers(end).Classes(idy);
        predictionError{end+1} = (yActual == groundTruth(idx)); %#ok
    end
    
    % Sum all prediction errors.
    predictionError = [predictionError{:}];
    accuracy = sum(predictionError)/numel(predictionError);
end

Чтобы подтвердить сеть при помощи этой пользовательской метрической функции, под Quantization Options, вводят имя пользовательской метрической функции hComputeAccuracy. Выберите Add, чтобы добавить hComputeAccuracy к списку метрических функций, доступных в приложении. Выберите hComputeAccuracy как метрическая функция, чтобы использовать.

Пользовательская метрическая функция должна быть на пути. Если метрическая функция не находится на пути, этот шаг производит ошибку.

Deep Network Quantizer select custom metric function

Нажмите Quantize and Validate.

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

Deep Network Quantizer validation with custom metric function

Отображения приложения только скалярные значения в таблице результатов валидации. Чтобы просмотреть результаты валидации для пользовательской метрической функции с нескалярным выходом, экспортируйте dlquantizer объект, затем проверьте квантованную сеть при помощи validate функция в окне команды MATLAB.

После квантования и проверения сети, можно принять решение экспортировать квантованную сеть.

Нажмите кнопку Export. В выпадающем списке выберите Export Quantizer создать dlquantizer объект в базовом рабочем пространстве. Можно развернуть квантованную сеть в целевую плату FPGA и получить результаты предсказания при помощи MATLAB. Смотрите, Разверните Квантованный Сетевой Пример (Deep Learning HDL Toolbox).

Если эффективность квантованной сети не является удовлетворительной, можно принять решение не квантовать некоторые слои путем очистки слоя в таблице. Нажмите Quantize and Validate снова.

Связанные примеры

Смотрите также

Функции

Введенный в R2020a