exponenta event banner

dlquantizer

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

Описание

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

Создание

Описание

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

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

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

Входные аргументы

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

Предварительно обученная нейронная сеть, указанная как DAGNetwork, SeriesNetwork, yolov2ObjectDetector(Панель инструментов компьютерного зрения) или ssdObjectDetector (Панель инструментов компьютерного зрения).

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

Свойства

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

Предварительно обученная нейронная сеть, указанная как DAGNetwork, SeriesNetwork, yolov2ObjectDetector(Панель инструментов компьютерного зрения) или ssdObjectDetector (Панель инструментов компьютерного зрения).

Квантование 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 нейросеть после переподготовки сети для классификации новых изображений в соответствии с примером Train Deep Learning Network для классификации новых изображений. В этом примере память, необходимая для сети, уменьшается приблизительно на 75% за счет квантования, в то время как точность сети не изменяется.

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

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

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

net
net = 

  DAGNetwork with properties:

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

Определите данные калибровки и проверки для квантования.

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

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

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

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

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

quantObj = dlquantizer(net);

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

calResults = calibrate(quantObj, aug_calData)
calResults =

  95x5 table

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

    {'conv1_relu_conv1_Weights'                      }    {'relu_conv1'           }         "Weights"                -0.91985       0.88489
    {'conv1_relu_conv1_Bias'                         }    {'relu_conv1'           }         "Bias"                   -0.07925       0.26343
    {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Weights'}    {'fire2-relu_squeeze1x1'}         "Weights"                   -1.38        1.2477
    {'fire2-squeeze1x1_fire2-relu_squeeze1x1_Bias'   }    {'fire2-relu_squeeze1x1'}         "Bias"                   -0.11641       0.24273
    {'fire2-expand1x1_fire2-relu_expand1x1_Weights'  }    {'fire2-relu_expand1x1' }         "Weights"                 -0.7406       0.90982
    {'fire2-expand1x1_fire2-relu_expand1x1_Bias'     }    {'fire2-relu_expand1x1' }         "Bias"                  -0.060056       0.14602
    {'fire2-expand3x3_fire2-relu_expand3x3_Weights'  }    {'fire2-relu_expand3x3' }         "Weights"                -0.74397       0.66905
    {'fire2-expand3x3_fire2-relu_expand3x3_Bias'     }    {'fire2-relu_expand3x3' }         "Bias"                  -0.051778      0.074239
    {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Weights'}    {'fire3-relu_squeeze1x1'}         "Weights"                -0.77262       0.68583
    {'fire3-squeeze1x1_fire3-relu_squeeze1x1_Bias'   }    {'fire3-relu_squeeze1x1'}         "Bias"                   -0.10145       0.32669
    {'fire3-expand1x1_fire3-relu_expand1x1_Weights'  }    {'fire3-relu_expand1x1' }         "Weights"                -0.72083       0.97157
    {'fire3-expand1x1_fire3-relu_expand1x1_Bias'     }    {'fire3-relu_expand1x1' }         "Bias"                  -0.067019       0.30422
    {'fire3-expand3x3_fire3-relu_expand3x3_Weights'  }    {'fire3-relu_expand3x3' }         "Weights"                -0.61403       0.77544
    {'fire3-expand3x3_fire3-relu_expand3x3_Bias'     }    {'fire3-relu_expand3x3' }         "Bias"                  -0.053621        0.1033
    {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Weights'}    {'fire4-relu_squeeze1x1'}         "Weights"                -0.74164        1.0865
    {'fire4-squeeze1x1_fire4-relu_squeeze1x1_Bias'   }    {'fire4-relu_squeeze1x1'}         "Bias"                   -0.10885       0.13875
...

Откройте приложение Глубокий сетевой квантователь.

deepNetworkQuantizer

В приложении щелкните Создать и выберите Import dlquantizer object.

Deep Network Quantizer import dlquantizer object

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

Select a dlquantizer object to import

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

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

Deep Network Quantizer app

Чтобы исследовать поведение нейронной сети, которая имеет квантованные уровни свертки, используйте приложение Глубокий сетевой квантователь. Этот пример квантует обучаемые параметры слоев свертки LogoNet нейронная сеть.

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

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

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

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

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

snet = getLogoNetwork();
snet = 

  SeriesNetwork with properties:

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

Определите данные калибровки и проверки для квантования.

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

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

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

Ускорьте процесс калибровки и проверки с помощью подмножества calibrationData и validationData. Сохранить новый сокращенный набор калибровочных данных в calibrationData_concise и новый сокращенный набор данных проверки в validationData_concise.

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

В командной строке MATLAB откройте приложение Глубокий сетевой квантователь.

deepNetworkQuantizer

Щелкните Создать и выберите Quantize a network.

Приложение проверяет среду выполнения.

Выберите среду выполнения и сеть для квантования из базовой рабочей области. В этом примере выберите среду выполнения FPGA и последовательную сеть. snet.

Select a network and execution environment

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

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

Щелкните Калибровка (Calibrate).

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

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

Deep Network Quantizer calibration

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

В разделе Проверить на панели инструментов приложения в разделе Данные проверки выберите augmentedImageDatastore объект из базовой рабочей области, содержащий данные проверки validationData_concise.

В разделе «Параметры оборудования» на панели инструментов выберите один из параметров, перечисленных в таблице:

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

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

Ксилинкс ZCU102 (zcu102_int8)

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

Ксилинкс ZC706 (zc706_int8)

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

При выборе Intel Arria 10 SoC (arria10soc_int8), Xilinx ZCU102 (zcu102_int8), или Xilinx ZC706 (zc706_int8) выберите интерфейс для развертывания и проверки квантованной сети. В этой таблице перечислены параметры целевого интерфейса.

Целевой вариантДействие
JTAGПрограммирование целевой платы FPGA, выбранной в среде моделирования, с помощью кабеля JTAG. Дополнительные сведения см. в разделе Подключение JTAG
EthernetПрограммирование целевой платы FPGA, выбранной в среде моделирования, через интерфейс Ethernet. В поле IP Address укажите IP-адрес целевой платы.

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

Deep Network Quantizer Hardware Settings

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

Щелкните Квантовать (Quantize) и Проверить (Validate).

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

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

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

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

Средняя точность (Average Precision) - средняя точность по всем результатам обнаружения. Посмотрите evaluateDetectionPrecision(Панель инструментов компьютерного зрения).

Регресс

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

Для повторной проверки сети с помощью этой пользовательской метрической функции в разделе «Параметры квантования» введите имя пользовательской метрической функции. hComputeAccuracy. Выберите Добавить для добавления hComputeAccuracy в список метрических функций, доступных в приложении. Выберите hComputeAccuracy в качестве используемой метрической функции.

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

Deep Network Quantizer select custom metric function

Щелкните Квантовать (Quantize) и Проверить (Validate)

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

Deep Network Quantizer validation with custom metric function

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

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

Нажмите кнопку «Экспорт». В раскрывающемся списке выберите Export Quantizer для создания dlquantizer в базовой рабочей области. Можно развернуть квантованную сеть на целевой плате FPGA и извлечь результаты прогнозирования с помощью MATLAB. См. раздел Пример развертывания квантованной сети.

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

Представлен в R2020a