Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

predict

推論用の深層学習ネットワーク出力の計算

R2019b 以降

説明

深層学習層によっては学習時と推論時 (予測時) の動作が異なる場合があります。たとえば、学習時には過適合を防ぐためにドロップアウト層によって入力要素がランダムに 0 に設定されますが、推論時にはドロップアウト層によって入力が変更されることはありません。

推論用のネットワーク出力を計算するには、関数 predict を使用します。学習用のネットワーク出力を計算するには、関数 forward を使用します。SeriesNetwork オブジェクトおよび DAGNetwork オブジェクトを使用した予測については、predict を参照してください。

ヒント

SeriesNetwork オブジェクトおよび DAGNetwork オブジェクトを使用した予測については、predict を参照してください。

Y = predict(net,X) は、入力データ X、および 1 つの入力と 1 つの出力をもつネットワーク net が与えられたときに、推論時のネットワーク出力 Y を返します。

Y = predict(net,X1,...,XM) は、M 個の入力 X1, ...,XM、および M 個の入力と 1 つの出力をもつネットワーク net が与えられたときに、推論時のネットワーク出力 Y を返します。

[Y1,...,YN] = predict(___) は、前述のいずれかの構文を使用して、N 個の出力をもつネットワークについて、N 個の推論時の出力 Y1, …, YN を返します。

[Y1,...,YK] = predict(___,'Outputs',layerNames) は、前述のいずれかの構文を使用して、指定された層について、推論時の出力 Y1, …, YK を返します。

[___] = predict(___,'Acceleration',acceleration) は、前述の構文の入力引数に加え、推論時に使用するパフォーマンスの最適化も指定します。

[___,state] = predict(___) は、更新されたネットワークの状態も返します。

すべて折りたたむ

この例では、データをミニバッチに分割することにより、dlnetwork オブジェクトを使用して予測を行う方法を示します。

データセットが大きい場合、またはメモリが限られたハードウェアで予測を行う場合、データをミニバッチに分割して予測を行います。SeriesNetwork または DAGNetwork オブジェクトで予測を行う場合、関数 predict は入力データをミニバッチに自動的に分割します。dlnetwork オブジェクトでは、データを手動でミニバッチに分割しなければなりません。

dlnetwork オブジェクトの読み込み

学習済み dlnetwork オブジェクトと対応するクラスを読み込みます。

s = load("digitsCustom.mat");
dlnet = s.dlnet;
classes = s.classes;

予測用データの読み込み

予測用の数字データを読み込みます。

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true);

予測の実行

テスト データのミニバッチをループ処理して、カスタム予測ループを使って予測を行います。

minibatchqueueを使用して、イメージのミニバッチを処理および管理します。ミニバッチ サイズとして 128 を指定します。イメージ データストアの読み取りサイズ プロパティをミニバッチ サイズに設定します。

各ミニバッチで次を行います。

  • カスタム ミニバッチ前処理関数 preprocessMiniBatch (この例の最後に定義) を使用して、データをバッチに連結し、イメージを正規化。

  • イメージを次元 'SSCB' (spatial、spatial、channel、batch) で書式設定。既定では、minibatchqueue オブジェクトは、基となる型が singledlarray オブジェクトにデータを変換します。

  • GPU が利用できる場合、GPU で予測を実行。既定では、minibatchqueue オブジェクトは、GPU が利用可能な場合、出力を gpuArray に変換します。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。

miniBatchSize = 128;
imds.ReadSize = miniBatchSize;

mbq = minibatchqueue(imds,...
    "MiniBatchSize",miniBatchSize,...
    "MiniBatchFcn", @preprocessMiniBatch,...
    "MiniBatchFormat","SSCB");

データのミニバッチをループ処理し、関数 predict を使用して予測を行います。関数 onehotdecode を使用して、クラス ラベルを決定します。予測クラス ラベルを保存します。

numObservations = numel(imds.Files);
YPred = strings(1,numObservations);

predictions = [];

% Loop over mini-batches.
while hasdata(mbq)
    
    % Read mini-batch of data.
    dlX = next(mbq);
       
    % Make predictions using the predict function.
    dlYPred = predict(dlnet,dlX);
   
    % Determine corresponding classes.
    predBatch = onehotdecode(dlYPred,classes,1);
    predictions = [predictions predBatch];
  
end

予測の一部を可視化します。

idx = randperm(numObservations,9);

figure
for i = 1:9
    subplot(3,3,i)
    I = imread(imds.Files{idx(i)});    
    label = predictions(idx(i));
    imshow(I)
    title("Label: " + string(label))
  
end

ミニバッチ前処理関数

関数 preprocessMiniBatch は、次の手順でデータを前処理します。

  1. 入力 cell 配列からデータを抽出し、数値配列に連結します。4 番目の次元で連結することにより、3 番目の次元が各イメージに追加されます。この次元は、シングルトン チャネル次元として使用されることになります。

  2. 01 の間のピクセル値を正規化します。

function X = preprocessMiniBatch(data)    
    % Extract image data from cell and concatenate
    X = cat(4,data{:});
    
    % Normalize the images.
    X = X/255;
end

入力引数

すべて折りたたむ

この引数は、次のいずれかを表すことができます。

  • カスタム学習ループのネットワーク。dlnetwork オブジェクトとして指定します。

  • カスタム枝刈りループのネットワーク。TaylorPrunableNetwork オブジェクトとして指定します。

深層ニューラル ネットワークの枝刈りを行うには、Deep Learning Toolbox™ Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。

入力データ。書式化された dlarray として指定します。dlarray の形式に関する詳細については、dlarray の入力引数 fmt を参照してください。

出力の抽出元の層。層の名前を含む string 配列、または層の名前を含む文字ベクトルの cell 配列として指定します。

  • layerNames(i) が 1 つの出力をもつ層に対応する場合、layerNames(i) は層の名前です。

  • layerNames(i) が複数の出力をもつ層に対応する場合、layerNames(i) はまず層の名前、その後に文字 "/"、さらに層出力の名前が続きます ('layerName/outputName')。

パフォーマンスの最適化。'Acceleration' と次のいずれかで構成されるコンマ区切りのペアとして指定します。

  • 'auto' — 入力ネットワークとハードウェア リソースに適した最適化の回数を自動的に適用します。

  • 'mex' — MEX 関数をコンパイルして実行します。このオプションは GPU の使用時にのみ利用できます。入力データ、またはネットワークの学習可能なパラメーターは、gpuArray オブジェクトとして格納しなければなりません。GPU を使用するには Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。Parallel Computing Toolbox または適切な GPU が利用できない場合、エラーが返されます。

  • 'none' — すべての高速化を無効にします。

既定のオプションは 'auto' です。'auto' が指定されている場合、MATLAB® は互換性のある最適化を複数適用します。'auto' オプションを使用すると、MATLAB は MEX 関数を生成しません。

'Acceleration' オプション 'auto' および 'mex' を使用すると、パフォーマンス上のメリットが得られますが、初期実行時間が長くなります。互換性のあるパラメーターを使用した後続の呼び出しは、より高速になります。新しい入力データを使用して関数を複数回呼び出す場合は、パフォーマンスの最適化を使用してください。

'mex' オプションは、関数の呼び出しに使用されたネットワークとパラメーターに基づいて MEX 関数を生成し、実行します。複数の MEX 関数を一度に 1 つのネットワークに関連付けることができます。ネットワークの変数をクリアすると、そのネットワークに関連付けられている MEX 関数もクリアされます。

'mex' オプションは、GPU の使用時にのみ利用できます。C/C++ コンパイラがインストールされ、GPU Coder™ Interface for Deep Learning Libraries サポート パッケージがなければなりません。MATLAB でアドオン エクスプローラーを使用してサポート パッケージをインストールします。設定手順については、MEX の設定 (GPU Coder)を参照してください。GPU Coder は不要です。

'mex' オプションには以下の制限があります。

  • 出力引数 state はサポートされていません。

  • single の精度のみがサポートされています。入力データ、またはネットワークの学習可能なパラメーターは、基となる型が single でなければなりません。

  • 入力層に接続されていない入力が存在するネットワークはサポートされていません。

  • トレースされた dlarray オブジェクトはサポートされていません。これは、dlfeval の呼び出し内では 'mex' オプションがサポートされていないことを意味します。

  • 一部の層はサポートされていません。サポートされている層の一覧については、サポートされている層 (GPU Coder)を参照してください。

  • 'mex' オプションを使用した場合、MATLAB Compiler™ を使用してネットワークを展開することはできません。

例: 'Acceleration','mex'

出力引数

すべて折りたたむ

出力データ。書式化された dlarray として返されます。dlarray の形式に関する詳細については、dlarray の入力引数 fmt を参照してください。

更新されたネットワークの状態。table として返されます。

ネットワークの状態は、次の 3 つの列をもつ table です。

  • Layer – 層の名前。string スカラーとして指定します。

  • Parameter – 状態パラメーターの名前。string スカラーとして指定します。

  • Value – 状態パラメーターの値。dlarray オブジェクトとして指定します。

層の状態には、層処理中に計算された情報が格納されます。この情報は、層の後続のフォワード パスで使用するために保持されます。たとえば、LSTM 層のセル状態と隠れ状態、またはバッチ正規化層の実行中の統計が格納されます。

LSTM 層などの再帰層の場合、HasStateInputs プロパティを 1 (true) に設定すると、その層の状態に関するエントリはステート table に格納されません。

State プロパティを使用して dlnetwork の状態を更新します。

拡張機能

バージョン履歴

R2019b で導入

すべて展開する