メインコンテンツ

dlquantizer

深層ニューラル ネットワークを 8 ビットにスケーリングされた整数データ型に量子化する

説明

dlquantizer オブジェクトを使用して、重み、バイアス、および活性化を、8 ビットにスケーリングされた整数データ型に量子化し、深層ニューラル ネットワークが必要とするメモリ量を削減します。GPU、FPGA、CPU に展開するための量子化ネットワークを作成してその動作を検証したり、MATLAB® や Simulink® で量子化ネットワークを検討したりすることができます。

サードパーティの深層学習ライブラリを使用して CPU や GPU に展開する場合は、calibrate 関数によって生成されたキャリブレーション結果ファイルを codegen (MATLAB Coder) コマンドに与えて、量子化ネットワークのコードを生成します。MATLAB でのコード生成では、quantize 関数によって生成される量子化深層ニューラル ネットワークがサポートされないことに注意してください。

FPGA に展開する場合は、キャリブレーションされた dlquantizer オブジェクトを dlhdl.Workflow (Deep Learning HDL Toolbox) クラスに入力して量子化ネットワークを展開します。

ターゲットに依存しない C/C++ コードを生成する場合は、MATLAB 実行環境を使用してネットワークを量子化し、そのネットワークを Simulink にエクスポートし、Simulink Coder™ または Embedded Coder® を使用して量子化ネットワークのコードを生成します。

このオブジェクトには、Deep Learning Toolbox Model Compression Library が必要です。深層ニューラル ネットワークの量子化に必要な製品については、量子化ワークフローの前提条件を参照してください。

作成

説明

quantObj = dlquantizer(net) は、指定された深層ニューラル ネットワーク netdlquantizer オブジェクトを作成します。

quantObj = dlquantizer(net,Name,Value) は、オプションの名前と値のペアの引数を 1 つ使用して、ExecutionEnvironment プロパティも設定します。

入力引数

すべて展開する

事前学習済みのニューラル ネットワーク。DAGNetwork オブジェクト、dlnetwork オブジェクト、SeriesNetwork オブジェクト、yolov2ObjectDetector (Computer Vision Toolbox) オブジェクト、yolov3ObjectDetector (Computer Vision Toolbox) オブジェクト、yolov4ObjectDetector (Computer Vision Toolbox) オブジェクト、または ssdObjectDetector (Computer Vision Toolbox) オブジェクトとして指定します。

プロパティ

すべて展開する

この プロパティ は読み取り専用です。

事前学習済みのニューラル ネットワーク。DAGNetwork オブジェクト、dlnetwork オブジェクト、SeriesNetwork オブジェクト、yolov2ObjectDetector (Computer Vision Toolbox) オブジェクト、yolov3ObjectDetector (Computer Vision Toolbox) オブジェクト、yolov4ObjectDetector (Computer Vision Toolbox) オブジェクト、または ssdObjectDetector (Computer Vision Toolbox) オブジェクトとして指定します。

量子化ネットワークの実行環境。'GPU''FPGA''CPU'、または 'MATLAB' として指定します。ネットワークがどのように量子化されるかは、実行環境の選択によって異なります。

次の表は、各実行環境に関連付けられているターゲット ハードウェアについて説明しています。

ターゲット ライブラリ説明
'GPU''cudnn'

CUDA® Deep Neural Network (cuDNN) ライブラリを使用するコードを生成します。

'FPGA''none'サポートされている Xilinx® および Intel® の FPGA デバイスおよび SoC デバイス用のコードを生成します。
'CPU''arm-compute'

ARM® Compute Library を使用するコードを生成します。

'MATLAB''none'

ターゲットに依存しない C/C++ コードを生成します。

このオプションの場合、MATLAB で量子化ネットワークを検討するためのターゲット ハードウェアは必要ありません。

例: 'ExecutionEnvironment','FPGA'

オブジェクト関数

prepareNetworkPrepare deep neural network for quantization
calibrate深層ニューラル ネットワークのシミュレーションと範囲の収集
quantizeQuantize deep neural network
validateQuantize and validate a deep neural network

すべて折りたたむ

この例では、GPU 用ニューラル ネットワークの畳み込み層の学習可能なパラメーターを量子化し、量子化されたネットワークの動作を調べる方法を説明します。この例では、新しいイメージを分類できるように squeezenet ニューラル ネットワークに再学習させた後、このネットワークを量子化します。この例では、ネットワークに必要なメモリ量が量子化によって約 75% 減少しますが、ネットワークの精度は影響を受けません。

事前学習済みのネットワークを読み込みます。net は、新しいイメージを分類するための深層学習ネットワークの学習の例で出力されたネットワークです。

load squeezedlnetmerch
net
net = 
  dlnetwork with properties:

         Layers: [67×1 nnet.cnn.layer.Layer]
    Connections: [74×2 table]
     Learnables: [52×3 table]
          State: [0×3 table]
     InputNames: {'data'}
    OutputNames: {'prob'}
    Initialized: 1

  View summary with summary.

量子化に使用するキャリブレーション データと検証データを定義します。

キャリブレーション データは、ネットワークの畳み込み層および全結合層の重みとバイアスのダイナミック レンジ、ならびにネットワークのすべての層内にある活性化のダイナミック レンジを収集するのに使用します。量子化によって最適な結果を得るには、キャリブレーション データがネットワークへの入力を典型的に表すものでなければなりません。

量子化を行った後、検証データを使用してネットワークをテストし、範囲を制限したことによる影響、および量子化後におけるネットワークの畳み込み層の精度を調べます。

この例では、MerchData データ セットのイメージを使用します。ネットワークで使用するデータのサイズを変更するための augmentedImageDatastore オブジェクトを定義します。その後、このデータをキャリブレーション データ セットと検証データ セットに分割します。

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

dlquantizer オブジェクトを作成し、量子化するネットワークを指定します。

dlquantObj = dlquantizer(net);

GPU ターゲットを指定します。

quantOpts = dlquantizationOptions(Target='gpu');
quantOpts.MetricFcn = {@(x)hAccuracy(x,net,aug_valData,classes)}
quantOpts = 
  dlquantizationOptions with properties:

   Validation Metric Info
    MetricFcn: {[@(x)hAccuracy(x,net,aug_valData,classes)]}

   Validation Environment Info
       Target: 'gpu'
    Bitstream: ''

関数 calibrate を使用して、サンプル入力でネットワークを実行し、範囲情報を収集します。関数 calibrate は、ネットワークを実行し、ネットワークの畳み込み層と全結合層の重みとバイアスのダイナミック レンジ、およびネットワークのすべての層内の活性化のダイナミック レンジを収集します。この関数はテーブルを返します。テーブルの各行に、最適化されたネットワークの学習可能なパラメーターの範囲情報が含まれています。

calResults = calibrate(dlquantObj, aug_calData)
calResults=120×5 table
        Optimized Layer Name         Network Layer Name     Learnables / Activations    MinValue     MaxValue
    ____________________________    ____________________    ________________________    _________    ________

    {'conv1_Weights'           }    {'conv1'           }           "Weights"             -0.91985     0.88489
    {'conv1_Bias'              }    {'conv1'           }           "Bias"                -0.07925     0.26343
    {'fire2-squeeze1x1_Weights'}    {'fire2-squeeze1x1'}           "Weights"                -1.38      1.2477
    {'fire2-squeeze1x1_Bias'   }    {'fire2-squeeze1x1'}           "Bias"                -0.11641     0.24273
    {'fire2-expand1x1_Weights' }    {'fire2-expand1x1' }           "Weights"              -0.7406     0.90982
    {'fire2-expand1x1_Bias'    }    {'fire2-expand1x1' }           "Bias"               -0.060056     0.14602
    {'fire2-expand3x3_Weights' }    {'fire2-expand3x3' }           "Weights"             -0.74397     0.66905
    {'fire2-expand3x3_Bias'    }    {'fire2-expand3x3' }           "Bias"               -0.051778    0.074239
    {'fire3-squeeze1x1_Weights'}    {'fire3-squeeze1x1'}           "Weights"              -0.7712     0.68917
    {'fire3-squeeze1x1_Bias'   }    {'fire3-squeeze1x1'}           "Bias"                -0.10138     0.32675
    {'fire3-expand1x1_Weights' }    {'fire3-expand1x1' }           "Weights"             -0.72035      0.9743
    {'fire3-expand1x1_Bias'    }    {'fire3-expand1x1' }           "Bias"               -0.067029     0.30425
    {'fire3-expand3x3_Weights' }    {'fire3-expand3x3' }           "Weights"             -0.61443      0.7741
    {'fire3-expand3x3_Bias'    }    {'fire3-expand3x3' }           "Bias"               -0.053613     0.10329
    {'fire4-squeeze1x1_Weights'}    {'fire4-squeeze1x1'}           "Weights"              -0.7422      1.0877
    {'fire4-squeeze1x1_Bias'   }    {'fire4-squeeze1x1'}           "Bias"                -0.10885     0.13881
      ⋮

関数 validate を使用して、ネットワークの畳み込み層内の学習可能なパラメーターを量子化し、ネットワークを実行します。この関数は、量子化の前後のネットワークの結果を比較するために dlquantizationOptions オブジェクトで定義されたメトリクス関数を使用します。

valResults = validate(dlquantObj, aug_valData, quantOpts)
valResults = struct with fields:
       NumSamples: 20
    MetricResults: [1×1 struct]
       Statistics: [2×2 table]

検証出力を調べ、量子化後のネットワークのパフォーマンスを確認します。

valResults.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

     {'Floating-Point'}           1      
     {'Quantized'     }           1      

valResults.Statistics
ans=2×2 table
    NetworkImplementation    LearnableParameterMemory(bytes)
    _____________________    _______________________________

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

この例では、ネットワークに必要なメモリ量が量子化によって約 75% 減少しました。ネットワークの精度は影響を受けていません。

これで、dlquantizer オブジェクトで指定されたネットワークの畳み込み層の重み、バイアス、および活性化に、スケーリングされた 8 ビット整数データ型が使用されるようになりました。

この例では、CPU ターゲット用のニューラル ネットワークの量子化と検証を行う方法を説明します。このワークフローは、他の実行環境の場合と同様ですが、検証を行う前に raspi 接続を確立し、dlquantizationOptions を使用してそれをターゲットとして指定しなければなりません。

まず、ネットワークを読み込みます。この例では、事前学習済みのネットワーク squeezenet を使用します。

load squeezedlnetmerch
net
net = 
  dlnetwork with properties:

         Layers: [67×1 nnet.cnn.layer.Layer]
    Connections: [74×2 table]
     Learnables: [52×3 table]
          State: [0×3 table]
     InputNames: {'data'}
    OutputNames: {'prob'}
    Initialized: 1

  View summary with summary.

次に、キャリブレーション データ calDS と検証データ valDS を定義します。

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

dlquantizer オブジェクトを作成し、CPU の実行環境を指定します。

dq =  dlquantizer(net,'ExecutionEnvironment','CPU') 
dq = 
  dlquantizer with properties:

           NetworkObject: [1×1 dlnetwork]
    ExecutionEnvironment: 'CPU'

ネットワークのキャリブレーションを実行します。

calResults = calibrate(dq,aug_calData,'UseGPU','off')
calResults=120×5 table
       Optimized Layer Name        Network Layer Name     Learnables / Activations    MinValue     MaxValue
    __________________________    ____________________    ________________________    _________    ________

    "conv1_Weights"               {'conv1'           }           "Weights"             -0.91985     0.88489
    "conv1_Bias"                  {'conv1'           }           "Bias"                -0.07925     0.26343
    "fire2-squeeze1x1_Weights"    {'fire2-squeeze1x1'}           "Weights"                -1.38      1.2477
    "fire2-squeeze1x1_Bias"       {'fire2-squeeze1x1'}           "Bias"                -0.11641     0.24273
    "fire2-expand1x1_Weights"     {'fire2-expand1x1' }           "Weights"              -0.7406     0.90982
    "fire2-expand1x1_Bias"        {'fire2-expand1x1' }           "Bias"               -0.060056     0.14602
    "fire2-expand3x3_Weights"     {'fire2-expand3x3' }           "Weights"             -0.74397     0.66905
    "fire2-expand3x3_Bias"        {'fire2-expand3x3' }           "Bias"               -0.051778    0.074239
    "fire3-squeeze1x1_Weights"    {'fire3-squeeze1x1'}           "Weights"              -0.7712     0.68917
    "fire3-squeeze1x1_Bias"       {'fire3-squeeze1x1'}           "Bias"                -0.10138     0.32675
    "fire3-expand1x1_Weights"     {'fire3-expand1x1' }           "Weights"             -0.72035      0.9743
    "fire3-expand1x1_Bias"        {'fire3-expand1x1' }           "Bias"               -0.067029     0.30425
    "fire3-expand3x3_Weights"     {'fire3-expand3x3' }           "Weights"             -0.61443      0.7741
    "fire3-expand3x3_Bias"        {'fire3-expand3x3' }           "Bias"               -0.053613     0.10329
    "fire4-squeeze1x1_Weights"    {'fire4-squeeze1x1'}           "Weights"              -0.7422      1.0877
    "fire4-squeeze1x1_Bias"       {'fire4-squeeze1x1'}           "Bias"                -0.10885     0.13881
      ⋮

MATLAB Support Package for Raspberry Pi Hardware の関数 raspi を使用して、Raspberry Pi への接続を作成します。以下のコードで、次を置き換えます。

  • raspiname: Raspberry Pi の名前またはアドレス

  • username: 自分のユーザー名

  • password: 自分のパスワード

% r = raspi('raspiname','username','password')

以下に例を示します。

r = raspi('gpucoder-raspberrypi-8','pi','matlab')
r = 
  raspi with properties:

         DeviceAddress: 'gpucoder-raspberrypi-8'      
                  Port: 18734                         
             BoardName: 'Raspberry Pi 3 Model B+'     
         AvailableLEDs: {'led0'}                      
  AvailableDigitalPins: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]
  AvailableSPIChannels: {}                            
     AvailableI2CBuses: {}                            
      AvailableWebcams: {}                            
           I2CBusSpeed:                               
AvailableCANInterfaces: {}                            

  Supported peripherals

raspi オブジェクトを量子化ネットワークのターゲットとして指定します。

opts = dlquantizationOptions('Target',r);
opts.MetricFcn = {@(x)hAccuracy(x,net,aug_valData,classes)}
opts = 
  dlquantizationOptions with properties:

   Validation Metric Info
    MetricFcn: {[@(x)hAccuracy(x,net,aug_valData,classes)]}

   Validation Environment Info
       Target: [1×1 raspi]
    Bitstream: ''

関数 validate を使用して、量子化後のネットワークを検証します。

valResults = validate(dq,aug_valData,opts)
### Starting application: 'codegen/lib/validate_predict_int8/pil/validate_predict_int8.elf'
    To terminate execution: clear validate_predict_int8_pil
### Launching application validate_predict_int8.elf...
### Host application produced the following standard output (stdout) and standard error (stderr) messages:
valResults = struct with fields:
       NumSamples: 20
    MetricResults: [1×1 struct]
       Statistics: []

検証出力を調べ、量子化後のネットワークのパフォーマンスを確認します。

valResults.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

     {'Floating-Point'}           1      
     {'Quantized'     }           1      

畳み込み層の重み、バイアス、および活性化を、8 ビットにスケーリングされた整数データ型に量子化することで、深層ニューラル ネットワークのメモリ フットプリントを削減します。この例では、Deep Learning Toolbox Model Compression Library と Deep Learning HDL Toolbox を使用して、int8 ネットワークをターゲット FPGA ボードに展開する方法を示します。

事前学習済みのネットワークの読み込み

事前学習済みの LogoNet ネットワークを読み込み、ネットワーク アーキテクチャを解析します。

snet = getLogoNetwork;
deepNetworkDesigner(snet);

再現性をもたせるために、乱数発生器を設定します。

rng(0);

データの読み込み

この例では logos_dataset データ セットを使用します。データ セットは 320 個のイメージで構成されています。各イメージのサイズは 227×227 で 3 つのカラー チャネル (RGB) があります。キャリブレーションと検証のためのaugmentedImageDatastoreオブジェクトを作成します。

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

ネットワーク用のキャリブレーション結果ファイルの生成

dlquantizer (Deep Learning HDL Toolbox)オブジェクトを作成し、量子化するネットワークを指定します。実行環境を FPGA として指定します。

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

関数calibrate (Deep Learning HDL Toolbox)を使用して、サンプル入力でネットワークを実行し、範囲情報を収集します。関数 calibrate は、重みとバイアスのダイナミック レンジを収集します。関数 calibrate は table を返します。テーブルの各行に、量子化されたネットワークの学習可能なパラメーターの範囲情報が含まれています。

calibrate(dlQuantObj,calibrationData)
ans=35×5 table
        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 とイーサネットです。インターフェイス オプションは、JTAG とイーサネットです。JTAG を使用するには、Xilinx Vivado® Design Suite 2022.1 をインストールします。Xilinx Vivado ツールパスを設定するには、次のように入力します。

hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2022.1\bin\vivado.bat');

ターゲット オブジェクトを作成するには、次のように入力します。

hTarget = dlhdl.Target('Xilinx','Interface','Ethernet','IPAddress','10.10.10.15');

あるいは、JTAG インターフェイスを使用することもできます。

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

dlQuantizationOptions オブジェクトの作成

dlquantizationOptionsオブジェクトを作成します。ターゲット ビットストリームとターゲット ボード インターフェイスを指定します。既定のメトリクス関数は、最上位精度のメトリクス関数です。

options_FPGA = dlquantizationOptions('Bitstream','zcu102_int8','Target',hTarget);
options_emulation = dlquantizationOptions('Target','host');

カスタム メトリクス関数を使用するには、dlquantizationOptions オブジェクトでメトリクス関数を指定します。

options_FPGA = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x,snet,validationData)},'Bitstream','zcu102_int8','Target',hTarget);
options_emulation = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x,snet,validationData)})

量子化ネットワークの検証

関数validateを使用して、ネットワークの畳み込み層内の学習可能なパラメーターを量子化します。関数 validate は、量子化されたネットワークを MATLAB でシミュレーションします。関数 validate は、dlquantizationOptions オブジェクトで定義されたメトリクス関数を使用して、単一データ型のネットワーク オブジェクトの結果と量子化されたネットワーク オブジェクトの結果を比較します。

prediction_emulation = dlQuantObj.validate(validationData,options_emulation)
prediction_emulation = struct with fields:
       NumSamples: 160
    MetricResults: [1×1 struct]
       Statistics: []

FPGA での検証の場合、関数 validate は以下を行います。

  • compile メソッドの出力とプログラミング ファイルを使用して FPGA ボードをプログラムする

  • ネットワークの重みとバイアスをダウンロードする

  • 量子化前後のネットワークのパフォーマンスを比較する

prediction_FPGA = dlQuantObj.validate(validationData,options_FPGA)
### Compiling network for Deep Learning FPGA prototyping ...
### Targeting FPGA bitstream zcu102_int8.
### The network includes the following layers:
     1   'imageinput'    Image Input             227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations  (SW Layer)
     2   'conv_1'        2-D Convolution         96 5×5×3 convolutions with stride [1  1] and padding [0  0  0  0]                (HW Layer)
     3   'relu_1'        ReLU                    ReLU                                                                             (HW Layer)
     4   'maxpool_1'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     5   'conv_2'        2-D Convolution         128 3×3×96 convolutions with stride [1  1] and padding [0  0  0  0]              (HW Layer)
     6   'relu_2'        ReLU                    ReLU                                                                             (HW Layer)
     7   'maxpool_2'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     8   'conv_3'        2-D Convolution         384 3×3×128 convolutions with stride [1  1] and padding [0  0  0  0]             (HW Layer)
     9   'relu_3'        ReLU                    ReLU                                                                             (HW Layer)
    10   'maxpool_3'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    11   'conv_4'        2-D Convolution         128 3×3×384 convolutions with stride [2  2] and padding [0  0  0  0]             (HW Layer)
    12   'relu_4'        ReLU                    ReLU                                                                             (HW Layer)
    13   'maxpool_4'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    14   'fc_1'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    15   'relu_5'        ReLU                    ReLU                                                                             (HW Layer)
    16   'fc_2'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    17   'relu_6'        ReLU                    ReLU                                                                             (HW Layer)
    18   'fc_3'          Fully Connected         32 fully connected layer                                                         (HW Layer)
    19   'softmax'       Softmax                 softmax                                                                          (SW Layer)
    20   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes                                (SW Layer)
                                                                                                                                
### Notice: The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software.
### Notice: The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
### Compiling layer group: conv_1>>relu_4 ...
### Compiling layer group: conv_1>>relu_4 ... complete.
### Compiling layer group: maxpool_4 ...
### Compiling layer group: maxpool_4 ... complete.
### Compiling layer group: fc_1>>fc_3 ...
### Compiling layer group: fc_1>>fc_3 ... complete.

### Allocating external memory buffers:

          offset_name          offset_address    allocated_space 
    _______________________    ______________    ________________

    "InputDataOffset"           "0x00000000"     "11.9 MB"       
    "OutputResultOffset"        "0x00be0000"     "128.0 kB"      
    "SchedulerDataOffset"       "0x00c00000"     "128.0 kB"      
    "SystemBufferOffset"        "0x00c20000"     "9.9 MB"        
    "InstructionDataOffset"     "0x01600000"     "4.6 MB"        
    "ConvWeightDataOffset"      "0x01aa0000"     "8.2 MB"        
    "FCWeightDataOffset"        "0x022e0000"     "10.4 MB"       
    "EndOffset"                 "0x02d40000"     "Total: 45.2 MB"

### Network compilation complete.

### 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 activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Finished writing input activations.
### Running single input activation.
### Notice: The layer 'imageinput' of type 'ImageInputLayer' is split into an image input layer 'imageinput' and an addition layer 'imageinput_norm' for normalization on hardware.
### The network includes the following layers:
     1   'imageinput'    Image Input             227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations  (SW Layer)
     2   'conv_1'        2-D Convolution         96 5×5×3 convolutions with stride [1  1] and padding [0  0  0  0]                (HW Layer)
     3   'relu_1'        ReLU                    ReLU                                                                             (HW Layer)
     4   'maxpool_1'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     5   'conv_2'        2-D Convolution         128 3×3×96 convolutions with stride [1  1] and padding [0  0  0  0]              (HW Layer)
     6   'relu_2'        ReLU                    ReLU                                                                             (HW Layer)
     7   'maxpool_2'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     8   'conv_3'        2-D Convolution         384 3×3×128 convolutions with stride [1  1] and padding [0  0  0  0]             (HW Layer)
     9   'relu_3'        ReLU                    ReLU                                                                             (HW Layer)
    10   'maxpool_3'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    11   'conv_4'        2-D Convolution         128 3×3×384 convolutions with stride [2  2] and padding [0  0  0  0]             (HW Layer)
    12   'relu_4'        ReLU                    ReLU                                                                             (HW Layer)
    13   'maxpool_4'     2-D Max Pooling         3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    14   'fc_1'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    15   'relu_5'        ReLU                    ReLU                                                                             (HW Layer)
    16   'fc_2'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    17   'relu_6'        ReLU                    ReLU                                                                             (HW Layer)
    18   'fc_3'          Fully Connected         32 fully connected layer                                                         (HW Layer)
    19   'softmax'       Softmax                 softmax                                                                          (SW Layer)
    20   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes                                (SW Layer)
                                                                                                                                
### Notice: The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software.
### Notice: The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.


              Deep Learning Processor Estimator Performance Results

                   LastFrameLatency(cycles)   LastFrameLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   39136574                  0.17789                       1           39136574              5.6
    imageinput_norm         216472                  0.00098 
    conv_1                 6832680                  0.03106 
    maxpool_1              3705912                  0.01685 
    conv_2                10454501                  0.04752 
    maxpool_2              1173810                  0.00534 
    conv_3                 9364533                  0.04257 
    maxpool_3              1229970                  0.00559 
    conv_4                 1759348                  0.00800 
    maxpool_4                24450                  0.00011 
    fc_1                   2651288                  0.01205 
    fc_2                   1696632                  0.00771 
    fc_3                     26978                  0.00012 
 * The clock frequency of the DL processor is: 220MHz


### Finished writing input activations.
### Running single input activation.
prediction_FPGA = struct with fields:
       NumSamples: 160
    MetricResults: [1×1 struct]
       Statistics: [2×7 table]

量子化されたニューラル ネットワークのパフォーマンスの表示

量子化されたネットワークの精度を表示します。

prediction_emulation.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

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

prediction_FPGA.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

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

量子化されたネットワークのパフォーマンスを 1 秒あたりのフレーム数で表示します。

prediction_FPGA.Statistics
ans=2×7 table
    NetworkImplementation    FramesPerSecond    Number of Threads (Convolution)    Number of Threads (Fully Connected)    LUT Utilization (%)    BlockRAM Utilization (%)    DSP Utilization (%)
    _____________________    _______________    _______________________________    ___________________________________    ___________________    ________________________    ___________________

     {'Floating-Point'}          5.6213                       16                                    4                           93.198                    63.925                   15.595       
     {'Quantized'     }          19.433                       64                                   16                            62.31                     50.11                   32.103       

ベース ワークスペースからディープ ネットワーク量子化器アプリに dlquantizer オブジェクトをインポートして、コマンド ラインまたはアプリを使用して深層ニューラル ネットワークの量子化を開始し、後ほどアプリ内で作業を再開します。

ディープ ネットワーク量子化器アプリを開きます。

deepNetworkQuantizer

アプリ内で [New] をクリックし、[Import dlquantizer object] を選択します。

Deep Network Quantizer import dlquantizer object

ダイアログで、ベース ワークスペースからインポートする dlquantizer オブジェクトを選択します。この例では、上記の例「GPU ターゲットのニューラル ネットワークの量子化」の dlquantizer オブジェクト quantizer を使用します。ネットワークを量子化した後、[Export] ドロップダウン リストから [Export Quantizer] を選択することで、quantizer オブジェクトを作成できます。

Select a dlquantizer object to import

このアプリは、コマンド ラインで収集された dlquantizer オブジェクトに含まれるすべてのデータ (量子化ネットワーク、キャリブレーション データ、検証データ、キャリブレーション統計など) をインポートします。

このアプリは、インポートされた dlquantizer オブジェクト quantizer に含まれる量子化データのテーブルを表示します。テーブルの右側では、アプリがパラメーターのダイナミック レンジのヒストグラムを表示します。ヒストグラムの灰色の領域は、量子化された表現では表せないデータを示しています。これらのヒストグラムを解釈する方法の詳細については、深層ニューラル ネットワークの量子化を参照してください。

Deep Network Quantizer app displaying calibration data.

この例では、MATLAB 内でターゲットに依存せずにシミュレート可能な量子化深層ニューラル ネットワークを作成する方法を示します。

ターゲットに依存しない量子化を行うことで、ターゲット ハードウェアやターゲット固有の量子化スキームを使用せずに、量子化がニューラル ネットワークに与える影響を確認できます。ターゲットに依存しない量子化ネットワークを作成すると、次のような場合に役立ちます。

  • ターゲット ハードウェアにアクセスできない。

  • ネットワークが量子化に適しているかどうかを確認したい。

  • 量子化に敏感な層を見つけたい。

量子化ネットワークは、量子化に対応した層の量子化された動作をエミュレートします。層や接続などのネットワーク アーキテクチャは元のネットワークと同じですが、推論動作では精度が制限された型が使用されます。ネットワークを量子化した後、quantizationDetails 関数を使用して量子化の詳細を取得できます。

事前学習済みのネットワークを読み込みます。net は、MerchData データ セット内のイメージを分類するために転移学習を使用して再学習させた SqueezeNet ネットワークです。

load squeezedlnetmerch
net
net = 
  dlnetwork with properties:

         Layers: [67×1 nnet.cnn.layer.Layer]
    Connections: [74×2 table]
     Learnables: [52×3 table]
          State: [0×3 table]
     InputNames: {'data'}
    OutputNames: {'prob'}
    Initialized: 1

  View summary with summary.

quantizationDetails 関数を使用すると、ネットワークが量子化されていないことを確認できます。

qDetailsOriginal = quantizationDetails(net)
qDetailsOriginal = struct with fields:
            IsQuantized: 0
          TargetLibrary: ""
    QuantizedLayerNames: [0×0 string]
    QuantizedLearnables: [0×3 table]

MerchData イメージを解凍してイメージ データストアとして読み込み、データストアからクラスを抽出します。

unzip('MerchData.zip')
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');
classes = categories(imds.Labels);

量子化に使用するキャリブレーション データと検証データを定義します。ネットワーク要件に応じて、キャリブレーション データと検証データの両方のイメージの出力サイズが変わります。

[calData,valData] = splitEachLabel(imds,0.7,'randomized');
augCalData = augmentedImageDatastore([227 227],calData);
augValData = augmentedImageDatastore([227 227],valData);

dlquantizer オブジェクトを作成し、量子化するネットワークを指定します。実行環境を MATLAB に設定します。ネットワークがどのように量子化されるかは、実行環境によって異なります。MATLAB 実行環境では、ターゲット ハードウェアに依存せず、量子化された動作のプロトタイプを作成できます。MATLAB 実行環境を使用する場合、量子化は fi 固定小数点データ型を使用して実行されますが、これには Fixed-Point Designer™ のライセンスが必要です。

quantObj = dlquantizer(net,'ExecutionEnvironment','MATLAB');

関数 calibrate を使用して、サンプル入力でネットワークを実行し、範囲情報を収集します。関数 calibrate は、ネットワークを実行し、ネットワークの畳み込み層と全結合層の重みとバイアスのダイナミック レンジ、およびネットワークのすべての層内の活性化のダイナミック レンジを収集します。この関数はテーブルを返します。テーブルの各行に、最適化されたネットワークの学習可能なパラメーターの範囲情報が含まれています。

calResults = calibrate(quantObj,augCalData);

quantize メソッドを使用してネットワーク オブジェクトを量子化し、シミュレーション可能な量子化ネットワークを返します。

qNet = quantize(quantObj)  
qNet = 
  Quantized dlnetwork with properties:

         Layers: [67×1 nnet.cnn.layer.Layer]
    Connections: [74×2 table]
     Learnables: [52×3 table]
          State: [0×3 table]
     InputNames: {'data'}
    OutputNames: {'prob'}
    Initialized: 1

  View summary with summary.
  Use the quantizationDetails function to extract quantization details.

quantizationDetails 関数を使用すると、ネットワークが量子化されたことを確認できます。

qDetailsQuantized = quantizationDetails(qNet)
qDetailsQuantized = struct with fields:
            IsQuantized: 1
          TargetLibrary: "none"
    QuantizedLayerNames: [53×1 string]
    QuantizedLearnables: [52×3 table]

元の単精度浮動小数点ネットワークと量子化された INT8 ネットワークを使用して予測を行います。

origScores = minibatchpredict(net,augValData);
predOriginal = scores2label(origScores,classes);    % Predictions for the non-quantized network

qScores = minibatchpredict(qNet,augValData);
predQuantized = scores2label(qScores,classes);     % Predictions for the quantized network 

元のネットワークに対する量子化ネットワークの相対精度を計算します。

ccrQuantized = mean(squeeze(predQuantized) == valData.Labels)*100
ccrQuantized = 100
ccrOriginal = mean(squeeze(predOriginal) == valData.Labels)*100
ccrOriginal = 100

この検証データ セットでは、量子化ネットワークが浮動小数点ネットワークと同じ予測結果を返します。

バージョン履歴

R2020a で導入

すべて展開する