dlquantizer

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

Описание

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

Создание

Описание

quantObj = dlquantizer(net) создает dlquantizer объект для указанной сети.

quantObj = dlquantizer(net,Name,Value) создает dlquantizer объект для указанной сети с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение".

Использование dlquantizer создание квантованной сети для развертывания GPU, FPGA или CPU. Чтобы узнать о продуктах, необходимых для квантования и развертывания нейронной сети для глубокого обучения в среде GPU, FPGA или CPU, см. раздел Необходимых условий рабочего процесса квантования».

Входные параметры

расширить все

Предварительно обученная нейронная сеть, заданная как DAGNetwork, SeriesNetwork, yolov2ObjectDetector (Computer Vision Toolbox), или ssdObjectDetector (Computer Vision Toolbox) объект.

Квантование ssdObjectDetector (Computer Vision Toolbox) сети требуют ExecutionEnvironment свойство, которое должно быть установлено в 'FPGA'.

Свойства

расширить все

Предварительно обученная нейронная сеть, заданная как DAGNetwork, SeriesNetwork, yolov2ObjectDetector (Computer Vision Toolbox), или ssdObjectDetector (Computer Vision Toolbox) объект.

Квантование ssdObjectDetector (Computer Vision Toolbox) сети требуют ExecutionEnvironment свойство, которое должно быть установлено в 'FPGA'.

Задайте окружение выполнения для квантованной сети. Когда этот параметр не задан, окружение выполнения по умолчанию является графическим процессором. Чтобы узнать о продуктах, необходимых для квантования и развертывания нейронной сети для глубокого обучения в среде GPU, FPGA или CPU, см. раздел Необходимых условий рабочего процесса квантования».

Пример: 'ExecutionEnvironment', 'FPGA'

Включите или отключите рабочий процесс симуляции MATLAB. Когда этот параметр установлен в on, квантованная сеть проверяется путем симуляции квантованной сети в MATLAB и сравнения результатов предсказания сети с одним типом данных с результатами моделируемого предсказания.

Пример: 'Simulation', 'on'

Функции объекта

calibrateМоделируйте и собирайте области значений глубокой нейронной сети
validateКвантование и валидация глубокой нейронной сети

Примеры

свернуть все

  • В этом примере показано, как задать окружение выполнения FPGA.

    net = vgg19;
    quantobj = dlquantizer(net,'ExecutionEnvironment','FPGA');

Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете squeezenet нейронная сеть после переобучения сети для классификации новых изображений в соответствии с примером Traind Нейронной Сети для Глубокого Обучения to Classify New Images. В этом примере память, необходимая для сети, уменьшается приблизительно на 75% посредством квантования, в то время как точность сети не зависит.

Загрузите предварительно обученную сеть. net. net - выход сеть примера Train Нейронной сети для глубокого обучения для классификации новых изображений.

net
net = 

  DAGNetwork with properties:

         Layers: [68x1 nnet.cnn.layer.Layer]
    Connections: [75x2 table]
     InputNames: {'data'}
    OutputNames: {'new_classoutput'}

Задайте данные калибровки и валидации, которые будут использоваться для квантования.

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

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

В этом примере используйте изображения в MerchData набор данных. Задайте augmentedImageDatastore объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');
[calData, valData] = splitEachLabel(imds, 0.7, 'randomized');
aug_calData = augmentedImageDatastore([227 227], calData);
aug_valData = augmentedImageDatastore([227 227], valData);

Создайте dlquantizer объект и укажите сеть для квантования.

quantObj = dlquantizer(net);

Задайте метрическую функцию, которая будет использоваться для сравнения поведения сети до и после квантования. Сохраните эту функцию в локальном файле.

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

Задайте метрическую функцию в dlquantizationOptions объект.

quantOpts = dlquantizationOptions('MetricFcn', ...
    {@(x)hComputeModelAccuracy(x, net, aug_valData)});

Используйте calibrate функция для упражнения сети с выборочными входами и сбора информации о области значений. The calibrate функция реализует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.

calResults = calibrate(quantObj, aug_calData)
calResults =

  95x5 table

                   Optimized Layer Name                      Network Layer Name        Learnables / Activations     MinValue      MaxValue  
    __________________________________________________    _________________________    ________________________    __________    ___________

    {'conv1_relu_conv1_Weights'                      }    {'relu_conv1'           }         "Weights"                -0.91985        0.88489
    {'conv1_relu_conv1_Bias'                         }    {'relu_conv1'           }         "Bias"                   -0.07925        0.26343
    {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Weights'}    {'fire2-relu_squeeze1x1'}         "Weights"                   -1.38         1.2477
    {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Bias'   }    {'fire2-relu_squeeze1x1'}         "Bias"                   -0.11641        0.24273
    {'fire2-expand1x1_fire2-relu_expand1x1_Weights'  }    {'fire2-relu_expand1x1' }         "Weights"                 -0.7406        0.90982
    {'fire2-expand1x1_fire2-relu_expand1x1_Bias'     }    {'fire2-relu_expand1x1' }         "Bias"                  -0.060056        0.14602
    {'fire2-expand3x3_fire2-relu_expand3x3_Weights'  }    {'fire2-relu_expand3x3' }         "Weights"                -0.74397        0.66905
    {'fire2-expand3x3_fire2-relu_expand3x3_Bias'     }    {'fire2-relu_expand3x3' }         "Bias"                  -0.051778       0.074239
    {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Weights'}    {'fire3-relu_squeeze1x1'}         "Weights"                -0.77263        0.68897
    {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Bias'   }    {'fire3-relu_squeeze1x1'}         "Bias"                   -0.10141        0.32678
    {'fire3-expand1x1_fire3-relu_expand1x1_Weights'  }    {'fire3-relu_expand1x1' }         "Weights"                -0.72131        0.97287
    {'fire3-expand1x1_fire3-relu_expand1x1_Bias'     }    {'fire3-relu_expand1x1' }         "Bias"                  -0.067043        0.30424
    {'fire3-expand3x3_fire3-relu_expand3x3_Weights'  }    {'fire3-relu_expand3x3' }         "Weights"                -0.61196        0.77431
    {'fire3-expand3x3_fire3-relu_expand3x3_Bias'     }    {'fire3-relu_expand3x3' }         "Bias"                  -0.053612        0.10329
    {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Weights'}    {'fire4-relu_squeeze1x1'}         "Weights"                -0.74145         1.0888
    {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Bias'   }    {'fire4-relu_squeeze1x1'}         "Bias"                   -0.10886        0.13882
...

Используйте validate функция для квантования настраиваемых параметров в слоях свертки сети и осуществления сети. Функция использует метрическую функцию, определенную в dlquantizationOptions объект для сравнения результатов сети до и после квантования.

valResults = validate(quantObj, aug_valData, quantOpts)
valResults = 

  struct with fields:

       NumSamples: 20
    MetricResults: [1x1 struct]

Исследуйте MetricResults.Result поле выхода валидации для просмотра эффективности квантованной сети.

valResults.MetricResults.Result
ans =

  2x3 table

    NetworkImplementation    MetricOutput    LearnableParameterMemory(bytes)
    _____________________    ____________    _______________________________

     {'Floating-Point'}           1                    2.9003e+06           
     {'Quantized'     }           1                    7.3393e+05           

В этом примере память, необходимая для сети, была уменьшена приблизительно на 75% за счет квантования. Точность сети не зависит.

Веса, смещения и активации слоев свертки сети, заданные в dlquantizer теперь объект использует масштабированные 8-битные целочисленные типы данных.

Этот пример показывает, как квантовать настраиваемые параметры в слоях свертки нейронной сети и исследовать поведение квантованной сети. В этом примере вы квантуете LogoNet нейронная сеть. Квантование помогает уменьшить потребность глубокой нейронной сети в памяти путем квантования весов, смещений и активаций слоев сети до 8-битных масштабированных целочисленных типов данных. Используйте MATLAB ®, чтобы получить результаты предсказания с целевого устройства .

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

Дополнительные потребности см. в разделе Необходимых условий рабочего процесса квантования.

Создайте файл в вашей текущей рабочей директории под названием getLogoNetwork.m. Введите эти линии в файл:

function net = getLogoNetwork()
    data = getLogoData();
    net  = data.convnet;
end

function data = getLogoData()
    if ~isfile('LogoNet.mat')
        url = 'https://www.mathworks.com/supportfiles/gpucoder/cnn_models/logo_detection/LogoNet.mat';
        websave('LogoNet.mat',url);
    end
    data = load('LogoNet.mat');
end

Загрузите предварительно обученную сеть.

snet = getLogoNetwork();
snet = 

  SeriesNetwork with properties:

         Layers: [22×1 nnet.cnn.layer.Layer]
     InputNames: {'imageinput'}
    OutputNames: {'classoutput'}

Задайте данные калибровки и валидации, которые будут использоваться для квантования.

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

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

Этот пример использует изображения в logos_dataset набор данных. Задайте augmentedImageDatastore объект для изменения размера данных для сети. Затем разделите данные на наборы данных калибровки и валидации.

curDir = pwd;
newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip');
copyfile(newDir,curDir);
unzip('logos_dataset.zip');
imageData = imageDatastore(fullfile(curDir,'logos_dataset'),...
 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames');
[calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized');

Создайте dlquantizer объект и укажите сеть для квантования.

dlQuantObj = dlquantizer(snet,'ExecutionEnvironment','FPGA');

Используйте calibrate функция для упражнения сети с выборочными входами и сбора информации о области значений. The calibrate функция реализует сеть и собирает динамические области значений весов и смещений в свертках и полносвязных слоях сети и динамические области значений активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию о области значений для настраиваемого параметра оптимизированной сети.

 dlQuantObj.calibrate(calibrationData)
ans = 
        Optimized Layer Name        Network Layer Name    Learnables / Activations     MinValue       MaxValue 
    ____________________________    __________________    ________________________    ___________    __________

    {'conv_1_Weights'          }      {'conv_1'    }           "Weights"                -0.048978      0.039352
    {'conv_1_Bias'             }      {'conv_1'    }           "Bias"                     0.99996        1.0028
    {'conv_2_Weights'          }      {'conv_2'    }           "Weights"                -0.055518      0.061901
    {'conv_2_Bias'             }      {'conv_2'    }           "Bias"                 -0.00061171       0.00227
    {'conv_3_Weights'          }      {'conv_3'    }           "Weights"                -0.045942      0.046927
    {'conv_3_Bias'             }      {'conv_3'    }           "Bias"                  -0.0013998     0.0015218
    {'conv_4_Weights'          }      {'conv_4'    }           "Weights"                -0.045967         0.051
    {'conv_4_Bias'             }      {'conv_4'    }           "Bias"                    -0.00164     0.0037892
    {'fc_1_Weights'            }      {'fc_1'      }           "Weights"                -0.051394      0.054344
    {'fc_1_Bias'               }      {'fc_1'      }           "Bias"                 -0.00052319    0.00084454
    {'fc_2_Weights'            }      {'fc_2'      }           "Weights"                 -0.05016      0.051557
    {'fc_2_Bias'               }      {'fc_2'      }           "Bias"                  -0.0017564     0.0018502
    {'fc_3_Weights'            }      {'fc_3'      }           "Weights"                -0.050706       0.04678
    {'fc_3_Bias'               }      {'fc_3'      }           "Bias"                    -0.02951      0.024855
    {'imageinput'              }      {'imageinput'}           "Activations"                    0           255
    {'imageinput_normalization'}      {'imageinput'}           "Activations"              -139.34        198.72

Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейсом, чтобы подключить ваше целевое устройство к хосту-компьютеру. Опции интерфейса JTAG и Ethernet. Чтобы создать целевой объект, введите:

hTarget = dlhdl.Target('Intel', 'Interface', 'JTAG');

Задайте метрическую функцию, которая будет использоваться для сравнения поведения сети до и после квантования. Сохраните эту функцию в локальном файле.

function accuracy = hComputeModelAccuracy(predictionScores, net, dataStore)
%% hComputeModelAccuracy test helper function computes model level accuracy statistics

% Copyright 2020 The MathWorks, Inc.
    
    % Load ground truth 
    groundTruth = dataStore.Labels;
    
    % Compare with predicted label with actual ground truth 
    predictionError = {};
    for idx=1:numel(groundTruth)
        [~, idy] = max(predictionScores(idx, :)); 
        yActual = net.Layers(end).Classes(idy);
        predictionError{end+1} = (yActual == groundTruth(idx)); %#ok
    end
    
    % Sum all prediction errors.
    predictionError = [predictionError{:}];
    accuracy = sum(predictionError)/numel(predictionError);
end

Задайте метрическую функцию в dlquantizationOptions объект.

options = dlquantizationOptions('MetricFcn', ...
    {@(x)hComputeModelAccuracy(x, snet, validationData)},'Bitstream','arria10soc_int8',...
'Target',hTarget);

Чтобы скомпилировать и развернуть квантованную сеть, запустите validate функция dlquantizer объект. Используйте validate функция для квантования настраиваемых параметров в слоях свертки сети и осуществления сети. Эта функция использует выход функции компиляции, чтобы запрограммировать плату FPGA с помощью файла программирования. Он также загружает веса и смещения сети. Функция развертывания проверяет наличие инструмента Intel Quartus и поддерживаемой версии инструмента. Затем он начинает программировать устройство FPGA с помощью файла sof, отображает сообщения о прогрессе и время развертывания сети. Функция использует метрическую функцию, определенную в dlquantizationOptions объект для сравнения результатов сети до и после квантования.

prediction = dlQuantObj.validate(validationData,options);
           offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "48.0 MB"        
    "OutputResultOffset"        "0x03000000"     "4.0 MB"         
    "SystemBufferOffset"        "0x03400000"     "60.0 MB"        
    "InstructionDataOffset"     "0x07000000"     "8.0 MB"         
    "ConvWeightDataOffset"      "0x07800000"     "8.0 MB"         
    "FCWeightDataOffset"        "0x08000000"     "12.0 MB"        
    "EndOffset"                 "0x08c00000"     "Total: 140.0 MB"

### Programming FPGA Bitstream using JTAG...
### Programming the FPGA bitstream has been completed successfully.
### Loading weights to Conv Processor.
### Conv Weights loaded. Current time is 16-Jul-2020 12:45:10
### Loading weights to FC Processor.
### FC Weights loaded. Current time is 16-Jul-2020 12:45:26
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13570959                  0.09047                      30          380609145             11.8
    conv_module           12667786                  0.08445 
        conv_1             3938907                  0.02626 
        maxpool_1          1544560                  0.01030 
        conv_2             2910954                  0.01941 
        maxpool_2           577524                  0.00385 
        conv_3             2552707                  0.01702 
        maxpool_3           676542                  0.00451 
        conv_4              455434                  0.00304 
        maxpool_4            11251                  0.00008 
    fc_module               903173                  0.00602 
        fc_1                536164                  0.00357 
        fc_2                342643                  0.00228 
        fc_3                 24364                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13570364                  0.09047                      30          380612682             11.8
    conv_module           12667103                  0.08445 
        conv_1             3939296                  0.02626 
        maxpool_1          1544371                  0.01030 
        conv_2             2910747                  0.01940 
        maxpool_2           577654                  0.00385 
        conv_3             2551829                  0.01701 
        maxpool_3           676548                  0.00451 
        conv_4              455396                  0.00304 
        maxpool_4            11355                  0.00008 
    fc_module               903261                  0.00602 
        fc_1                536206                  0.00357 
        fc_2                342688                  0.00228 
        fc_3                 24365                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13571561                  0.09048                      30          380608338             11.8
    conv_module           12668340                  0.08446 
        conv_1             3939070                  0.02626 
        maxpool_1          1545327                  0.01030 
        conv_2             2911061                  0.01941 
        maxpool_2           577557                  0.00385 
        conv_3             2552082                  0.01701 
        maxpool_3           676506                  0.00451 
        conv_4              455582                  0.00304 
        maxpool_4            11248                  0.00007 
    fc_module               903221                  0.00602 
        fc_1                536167                  0.00357 
        fc_2                342643                  0.00228 
        fc_3                 24409                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13569862                  0.09047                      30          380613327             11.8
    conv_module           12666756                  0.08445 
        conv_1             3939212                  0.02626 
        maxpool_1          1543267                  0.01029 
        conv_2             2911184                  0.01941 
        maxpool_2           577275                  0.00385 
        conv_3             2552868                  0.01702 
        maxpool_3           676438                  0.00451 
        conv_4              455353                  0.00304 
        maxpool_4            11252                  0.00008 
    fc_module               903106                  0.00602 
        fc_1                536050                  0.00357 
        fc_2                342645                  0.00228 
        fc_3                 24409                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13570823                  0.09047                      30          380619836             11.8
    conv_module           12667607                  0.08445 
        conv_1             3939074                  0.02626 
        maxpool_1          1544519                  0.01030 
        conv_2             2910636                  0.01940 
        maxpool_2           577769                  0.00385 
        conv_3             2551800                  0.01701 
        maxpool_3           676795                  0.00451 
        conv_4              455859                  0.00304 
        maxpool_4            11248                  0.00007 
    fc_module               903216                  0.00602 
        fc_1                536165                  0.00357 
        fc_2                342643                  0.00228 
        fc_3                 24406                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "48.0 MB"        
    "OutputResultOffset"        "0x03000000"     "4.0 MB"         
    "SystemBufferOffset"        "0x03400000"     "60.0 MB"        
    "InstructionDataOffset"     "0x07000000"     "8.0 MB"         
    "ConvWeightDataOffset"      "0x07800000"     "8.0 MB"         
    "FCWeightDataOffset"        "0x08000000"     "12.0 MB"        
    "EndOffset"                 "0x08c00000"     "Total: 140.0 MB"

### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA.
### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA.
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13572329                  0.09048                      10          127265075             11.8
    conv_module           12669135                  0.08446 
        conv_1             3939559                  0.02626 
        maxpool_1          1545378                  0.01030 
        conv_2             2911243                  0.01941 
        maxpool_2           577422                  0.00385 
        conv_3             2552064                  0.01701 
        maxpool_3           676678                  0.00451 
        conv_4              455657                  0.00304 
        maxpool_4            11227                  0.00007 
    fc_module               903194                  0.00602 
        fc_1                536140                  0.00357 
        fc_2                342688                  0.00228 
        fc_3                 24364                  0.00016 
 * The clock frequency of the DL processor is: 150MHz


### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastLayerLatency(cycles)   LastLayerLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   13572527                  0.09048                      10          127266427             11.8
    conv_module           12669266                  0.08446 
        conv_1             3939776                  0.02627 
        maxpool_1          1545632                  0.01030 
        conv_2             2911169                  0.01941 
        maxpool_2           577592                  0.00385 
        conv_3             2551613                  0.01701 
        maxpool_3           676811                  0.00451 
        conv_4              455418                  0.00304 
        maxpool_4            11348                  0.00008 
    fc_module               903261                  0.00602 
        fc_1                536205                  0.00357 
        fc_2                342689                  0.00228 
        fc_3                 24365                  0.00016 
 * The clock frequency of the DL processor is: 150MHz

Исследуйте MetricResults.Result поле выхода валидации для просмотра эффективности квантованной сети.

validateOut = prediction.MetricResults.Result
ans = 
    NetworkImplementation    MetricOutput
    _____________________    ____________

     {'Floating-Point'}         0.9875   
     {'Quantized'     }         0.9875   

Исследуйте QuantizedNetworkFPS поле выхода валидации для просмотра систем координат в секунду эффективности квантованной сети.

prediction.QuantizedNetworkFPS
ans = 11.8126

Веса, смещения и активации слоев свертки сети, заданные в dlquantizer теперь объект использует масштабированные 8-битные целочисленные типы данных.

В этом примере показано, как импортировать 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
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. См. пример развертывания квантованной сети.

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

Введенный в R2020a