Deep Network Quantizer

Квантуйте глубокую нейронную сеть к 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, см. раздел Необходимых условий рабочего процесса квантования».

Deep Network Quantizer app

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

  • Командная строка 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.

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 metric.

Нажмите Quantize and Validate.

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

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

Top-1 точности - точность сети

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

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

Регресс

MSE - средняя квадратичная невязка сети

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

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

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

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

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

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

Deep Network Quantizer validation

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

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

Deep Network Quantizer select custom metric function

Нажмите Quantize and Validate.

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

Deep Network Quantizer validation

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

После квантования и проверки сети можно выбрать экспорт квантованной сети.

Нажмите кнопку Export. В выпадающем списке выберите Export Quantizer для создания dlquantizer объект в базовом рабочем пространстве. Чтобы открыть приложение GPU Coder и сгенерировать код GPU из квантованной нейронной сети, выберите Generate Code. Для генерации кода GPU требуется лицензия 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 Connection (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 metric.

Нажмите Quantize and Validate.

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

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

Top-1 точности - точность сети

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

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

Регресс

MSE - средняя квадратичная невязка сети

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

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

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

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

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

Deep Network Quantizer validation

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

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

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