ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

カスタム ミニバッチ データストアの開発

"ミニバッチ データストア" とは、バッチ単位でのデータの読み取りをサポートするデータストアの実装です。ミニバッチ データストアは、Deep Learning Toolbox™ を使用する深層学習アプリケーションの学習データセット、検証データセット、テスト データセット、および予測データセットのソースとして使用できます。

組み込みミニバッチ データストアを使用して、メモリ外のデータを読み取るか、データのバッチを読み取る際に特定の演算を実行できます。たとえば、augmentedImageDatastore は、サイズ変更、回転、反転、せん断、および平行移動の変換のランダムな組み合わせを適用してミニバッチを前処理します。組み込みミニバッチ データストアとそれらの典型的な用途の一覧については、高度なイメージ前処理を参照してください。

十分な柔軟性を持ってイメージやシーケンス データを前処理するには、ここで説明するフレームワークを使用して独自のミニバッチ データストアを構築します。オプションで、学習中のシャッフル、並列学習やマルチ GPU での学習、バックグラウンド ディスパッチなどの機能のサポートを追加できます。

シーケンス データのカスタム ミニバッチ データストアを作成する方法を示す例については、メモリ外のシーケンス データを使用したネットワークの学習を参照してください。

概要

カスタム データストアのクラスおよびオブジェクトを使用して、カスタム データストア インターフェイスを構築します。次に、カスタム データストアを使用してデータを MATLAB® に読み込みます。

カスタム ミニバッチ データストアの設計には、matlab.io.Datastore および matlab.io.datastore.MiniBatchable クラスからの継承や、必要なプロパティおよびメソッドの実装が含まれます。オプションで、処理のニーズを満たすために、任意の組み合わせの追加クラスから継承できます。

処理のニーズ

クラス

Deep Learning Toolbox での学習データセット、検証データセット、テスト データセット、および予測データセット用のミニバッチ データストア

matlab.io.Datastore および matlab.io.datastore.MiniBatchable

MiniBatchable データストアの実装を参照してください。

学習中のシャッフルをサポートするミニバッチ データストア

DatastoreMiniBatchable および matlab.io.datastore.Shuffleable

シャッフルのサポートの追加を参照してください。

並列学習やマルチ GPU での学習をサポートするミニバッチ データストア (Parallel Computing Toolbox™ が必要)

長短期記憶ネットワークの学習では、1 つの CPU と GPU での学習のみがサポートされます。

DatastoreMiniBatchable および PartitionableByIndex

並列学習およびマルチ GPU での学習のサポートの追加を参照してください。

学習、予測、分類、および検証中のバックグラウンド ディスパッチ (事前取得) をサポートするミニバッチ データストア (Parallel Computing Toolbox が必要)

DatastoreMiniBatchable および BackgroundDispatchable

バックグラウンド ディスパッチのサポートの追加を参照してください。

例については、超解像ネットワーク用のカスタム ミニバッチ データストアの定義を参照してください。この例では、学習中のシャッフルをサポートし、入力イメージのバッチと目的のネットワーク応答を生成するカスタム ミニバッチ データストアを定義します。

MiniBatchable データストアの実装

MyDatastore という名前のカスタム ミニバッチ データストアを実装するには、スクリプト MyDatastore.m を作成します。このスクリプトは MATLAB パス上になければならず、適切なクラスから継承し、必要なメソッドを定義するコードを含んでいる必要があります。Deep Learning Toolbox での学習データセット、検証データセット、テスト データセット、および予測データセット用のミニバッチ データストアを作成するコードは以下でなければなりません。

これらの手順に加えて、データの処理および解析に必要なその他のプロパティやメソッドを定義できます。

メモ

ネットワークに学習させていて trainingOptions を以下のように指定する場合の各要件は次のとおりです。

この例では、2 つのイメージ データストアの同期を維持するカスタム ミニバッチ データストア、いわゆる関連付けられたイメージ データストアの作成について説明します。一方のデータストアの各イメージは、他方のデータストアの特定のイメージとペアになります。スクリプトを associatedImageDatastore.m という名前のファイルに保存します。

手順実装

 

  1. クラスの定義を開始します。基底クラス Datastore および matlab.io.datastore.MiniBatchable クラスから継承します。

     

  2. プロパティを定義します。

    • MiniBatchSize および NumObservations のプロパティを再定義します。オプションで、追加のプロパティ属性をどちらかのプロパティに割り当てることができます。詳細は、プロパティの属性 (MATLAB)を参照してください。

    • カスタム ミニバッチ データストアに固有のプロパティを定義することもできます。

     

  3. メソッドを定義します。

    • カスタム ミニバッチ データストア コンストラクターを実装します。

    • hasdata メソッドを実装します。

    • read メソッドを実装します。このメソッドは、1 番目の列が予測子、2 番目の列が応答である table としてデータを返さなければなりません。

      • イメージ データの場合、予測子は h x w x c のイメージでなければなりません。h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。

      • シーケンス データの場合、シーケンスはサイズが D 行 S 列の行列でなければなりません。D は特徴の数、S はシーケンス長です。S の値はミニバッチ間で異なる場合があります。

    • reset メソッドを実装します。

    • progress メソッドを実装します。

    • カスタム ミニバッチ データストアに固有のメソッドを定義することもできます。

     

  4. classdef セクションを終了します。

classdef associatedImageDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable
    
    properties
        MiniBatchSize
    end
    
    properties(SetAccess = protected)
        NumObservations
    end

    properties(Access = private)
        % This property is inherited from Datastore
        CurrentFileIndex
        % These custom properties store copies of the two ImageDatastores
        InputImds
        OutputImds
    end


    methods
        
        function ds = associatedImageDatastore(inputImds,outputImds,miniBatchSize)
            % Construct an associatedImageDatastore object
            ds.InputImds = copy(inputImds);
            ds.OutputImds = copy(outputImds);
            ds.InputImds.ReadSize = miniBatchSize;
            ds.OutputImds.ReadSize = miniBatchSize;
            ds.NumObservations = length(inputImds.Files);
            ds.MiniBatchSize = miniBatchSize;
            ds.CurrentFileIndex = 1;
        end

        function tf = hasdata(ds)
            % Return true if more data is available
            tf = hasdata(ds.InputImds);
        end

        function [data,info] = read(ds)            
            % Read one batch of data
            inputImageData = read(ds.InputImds);
            outputImageData = read(ds.OutputImds);
            data = table(inputImageData,outputImageData);
            info.batchSize = size(data,1);
            ds.CurrentFileIndex = ds.CurrentFileIndex + info.batchSize;
            info.currentFileIndex = ds.CurrentFileIndex;  
        end

        function reset(ds)
            % Reset to the start of the data
            reset(ds.InputImds);
            reset(ds.OutputImds);
            ds.CurrentFileIndex = 1;
        end
        
    end 

    methods (Hidden = true)

        function frac = progress(ds)
            % Determine percentage of data read from datastore
            frac = (ds.CurrentFileIndex-1)/ds.NumObservations;
        end

    end

end % end class definition

シャッフルのサポートの追加

シャッフルのサポートを追加するには、まず、MiniBatchable データストアの実装の手順に従います。次に MyDatastore.m の実装コードを次のように更新します。

この例のコードでは、シャッフルのサポートを associatedImageDatastore クラスに追加します。縦並びの省略記号は、associatedImageDatastore の実装からコードをコピーする必要がある場所を示します。

手順実装

 

  1. クラス定義を更新して、matlab.io.datastore.Shuffleable クラスからも継承します。

     

  2. shuffle の定義を既存の methods セクションに追加します。

classdef associatedImageDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable & ...
                       matlab.io.datastore.Shuffleable
   
   % previously defined properties 
   .
   .
   . 


   methods

        % previously defined methods
        .
        .
        . 
   
        function dsnew = shuffle(ds)
            dsnew = copy(ds);
            shuffledIndexOrder = randperm(ds.NumObservations);
            dsnew.InputImds.Files = dsnew.InputImds.Files(shuffledIndexOrder);
            dsnew.OutputImds.Files = dsnew.OutputImds.Files(shuffledIndexOrder);
        end

     end

end
  

並列学習およびマルチ GPU での学習のサポートの追加

Parallel Computing Toolbox による並列処理のサポートを追加するには、まず、MiniBatchable データストアの実装の手順に従います。次に MyDatastore.m の実装コードを次のように更新します。

この例のコードでは、並列処理のサポートを associatedImageDatastore クラスに追加します。縦並びの省略記号は、associatedImageDatastore の実装からコードをコピーする必要がある場所を示します。

LSTM ネットワークなどの再帰型ネットワークは、並列学習やマルチ GPU での学習をサポートしていません。

手順実装

 

  1. クラス定義を更新して、PartitionableByIndex クラスからも継承します。

     

  2. partitionByIndex の定義を既存の methods セクションに追加します。

classdef associatedImageDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable & ...
                       matlab.io.datastore.PartitionableByIndex

   % previously defined properties 
   .
   .
   . 


   methods

        % previously defined methods
        .
        .
        . 
   
        function dsnew = partitionByIndex(ds,indices)  
           dsnew = copy(ds);
           dsnew.InputImds.Files = dsnew.InputImds.Files(indices);
           dsnew.OutputImds.Files = dsnew.OutputImds.Files(indices);
        end

     end

end
  

長短期記憶ネットワークの学習では、1 つの CPU と GPU での学習のみがサポートされます。

バックグラウンド ディスパッチのサポートの追加

学習、予測、分類、および検証中のバックグラウンド ディスパッチ (事前取得) のサポートを追加するには、まず、MiniBatchable データストアの実装の手順に従います。次に MyDatastore.m の実装コードを次のように更新します。

サンプル実装については、以下の手順に従います。この例のコードでは、事前取得のサポートを associatedImageDatastore クラスに追加します。縦並びの省略記号は、associatedImageDatastore の実装からコードをコピーする必要がある場所を示します。

LSTM ネットワークなどの再帰型ネットワークは、バックグラウンド ディスパッチをサポートしていません。

手順実装

 

  1. クラス定義を更新して、BackgroundDispatchable クラスからも継承します。

     

  2. readByIndex の定義を既存の methods セクションに追加します。

classdef associatedImageDatastore < matlab.io.Datastore & ...
                       matlab.io.datastore.MiniBatchable & ...
                       matlab.io.datastore.BackgroundDispatchable

   % previously defined properties 
   .
   .
   . 


   methods

        % previously defined methods
        .
        .
        . 
   
        function [data,info] = readByIndex(ds,indices)
            inputImdsNew = copy(ds.InputImds);
            outputImdsNew = copy(ds.OutputImds);
            inputImdsNew.Files = inputImdsNew.Files(indices);
            outputImdsNew.Files = outputImdsNew.Files(indices);
            X = readall(inputImdsNew);
            Y = readall(outputImdsNew);

            data = table(X,Y);
            info.CurrentReadIndices = indices;
        end

     end

end
  

カスタム ミニバッチ データストアの検証

ここに記載したすべての手順に従うと、カスタム ミニバッチ データストアの実装が完了します。このデータストアを使用する前に、カスタム データ ストアのテストのガイドライン (MATLAB)に記載されているガイドラインを使用して、データストアが適切か確認します。

参考

| | | | |

関連するトピック