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

深層学習用のデータストア

MATLAB® のデータストアは、大きすぎて一度にメモリに収まらないデータの集合を処理および表現する便利な方法です。深層学習には大量のデータが必要となる場合がよくあるため、データストアは MATLAB における深層学習ワークフローの重要な部分です。

データストアの選択

多くの用途では、組み込みデータストアで開始するのが最も簡単な方法です。使用可能な組み込みデータストアの詳細は、ファイル形式またはアプリケーション用のデータ ストアの選択 (MATLAB)を参照してください。ただし、ネットワークの学習、検証、および推論のための入力として直接使用できるのは、一部のタイプの組み込みデータストアのみです。これらのデータストアは以下のとおりです。

その他の組み込みデータストアは深層学習の入力として使用できますが、これらのデータストアから読み取られたデータは、深層学習ネットワークに必要な形式になるように前処理しなければなりません。読み取りデータに必要な形式の詳細は、学習、検証、および推論用の入力データストアを参照してください。データストアから読み取られたデータを前処理する方法の詳細は、データストアの変換と組み合わせを参照してください。

用途によっては、データを当てはめる組み込みデータストア タイプが存在しないことがあります。これらの問題がある場合、カスタム データストアを作成できます。詳細については、カスタム データ ストアの開発 (MATLAB)を参照してください。カスタム データストアの関数 read が必要な形式でデータを返す限り、すべてのカスタム データストアが深層学習インターフェイスに対する入力として有効です。

学習、検証、および推論用の入力データストア

Deep Learning Toolbox™ のデータストアは、学習、検証、および推論に有効な入力です。

学習と検証

イメージ データストアを学習データのソースとして使用するには、trainNetwork の引数 imds を使用します。その他のすべてのタイプのデータストアを学習データのソースとして使用するには、trainNetwork の引数 ds を使用します。データストアを検証に使用するには、trainingOptions で名前と値のペアの引数 'ValidationData' を使用します。

学習または検証に有効な入力であるには、(ImageDatastore を除いて) データストアの関数 read が cell 配列または table としてデータを返さなければなりません。

単一の入力があるネットワークの場合、データストアによって返される table または cell 配列に 2 つの列がなければなりません。データの最初の列はネットワークへの入力を表し、データの 2 列目は応答を表します。データの各列は個別の観測を表します。ImageDatastore の場合のみ、trainNetwork および trainingOptions は整数配列および整数配列の 1 列の cell 配列として返されるデータをサポートします。

複数の入力があるネットワークの場合、データストアは、予測子と応答を含む列数が (numInputs+1) の cell 配列を返す、組み合わせまたは変換が行われたデータストアでなければなりません。ここで、numInputs はネットワーク入力の数、numResponses は応答の数です。inumInputs 以下の場合、cell 配列の i 番目の要素は入力 layers.InputNames(i) に対応します。ここで、layers はネットワーク アーキテクチャを定義する層グラフです。cell 配列の最後の列は応答に対応します。

次の表に、データストア ds に対して関数 read を呼び出した場合の出力のサンプルを示します。

ネットワークのタイプ読み取りデータの形式出力の例
単入力2 列の cell 配列
data = read(ds)
data =

  4×2 cell array

    {28×28 double}    {[7]}
    {28×28 double}    {[7]}
    {28×28 double}    {[9]}
    {28×28 double}    {[9]}
2 列の table
data = read(ds)
data =

  4×2 table

        input         response
    ______________    ________

    {28×28 double}       7    
    {28×28 double}       7    
    {28×28 double}       9    
    {28×28 double}       9  
多入力(numInputs+1) 列の cell 配列
data = read(ds)
data =

  4×3 cell array

    {28×28 double}    {128×128 double}    {[7]}
    {28×28 double}    {128×128 double}    {[7]}
    {28×28 double}    {128×128 double}    {[9]}
    {28×28 double}    {128×128 double}    {[9]}

推論

predictclassify、および activations を使用する推論の場合、予測子に対応する列を得るためにのみデータストアが必要です。推論関数は、データの 1 列目より後の追加の列を無視します。

読み取りサイズとミニバッチ サイズの指定

read を呼び出すたびに、データストアが任意の行数 (観測値) を返すことがあります。データストアを使用でき、'MiniBatchSize' の指定をサポートする trainNetworkpredictclassifyactivations などの関数は、データの完全なミニバッチの形成に必要な回数だけ read を呼び出します。これらの関数がミニバッチを形成する際には、メモリの内部キューを使用して読み取りデータを格納します。たとえば、read の呼び出しごとにデータストアが一貫して 64 行を返し、MiniBatchSize128 である場合、データの各ミニバッチを形成するには read を 2 回呼び出す必要があります。

最良のランタイム パフォーマンスを得るには、read によって返される観測値の数が 'MiniBatchSize' に等しくなるようにデータストアを構成することをお勧めします。'ReadSize' プロパティがあるデータストアの場合、'ReadSize' を設定して、read を呼び出すたびにデータストアによって返される観測値の数を変更します。

データストアの変換と組み合わせ

深層学習では、データがネットワークへの入力に適した形式になる前にデータの前処理と拡張が必要になることがよくあります。データストアの関数 transform および combine は、ネットワークに渡されるデータの準備に役立ちます。

複数の入力があるネットワークの場合、組み合わせが行われたデータストアを使用して、データの複数のデータ ソースを組み合わせます。

データストアの変換

関数 transform は、"基になるデータストア" と呼ばれるデータストアによって読み取られたデータを変換し、基になるデータストアの変更された形式を作成します。

  • 複数の前処理演算を伴う複雑な変換の場合、独自の関数に変換の完全なセットを定義します。次に、関数のハンドルを transform の引数 @fcn として指定します。詳細については、関数のファイルでの作成 (MATLAB)を参照してください。

  • 1 行のコードで表現できる単純な変換の場合、無名関数のハンドルを transform の引数 @fcn として指定できます。詳細については、無名関数 (MATLAB)を参照してください。

transform に指定された関数ハンドルは、基になるデータストアの関数 read によって返される形式と同じ形式の入力データを受け入れなければなりません。

例: 数字分類ネットワークに学習させるためのイメージ ストアの変換

この例では、関数 transform を使用して、イメージ データストア内の各イメージにランダムな 90 度の回転が追加される学習セットを作成します。結果の TransformedDatastoretrainNetwork に渡して、簡単な数字分類ネットワークに学習させます。

数字イメージを含むイメージ データストアを作成します。

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

ミニバッチ サイズがイメージ データストアの ReadSize に等しくなるように設定します。

miniBatchSize = 128;
imds.ReadSize = miniBatchSize;

ランダムな 90 度の回転を追加してイメージ データストア内のイメージを変換します。変換関数 preprocessForTraining の定義は、この例の終わりで行います。

dsTrain = transform(imds,@preprocessForTraining,'IncludeInfo',true)
dsTrain = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1×1 matlab.io.datastore.ImageDatastore]
             Transforms: {@preprocessForTraining}
            IncludeInfo: 1

ネットワークの層および学習オプションを指定し、変換が行われたデータストア dsTrain をデータのソースとして使用してネットワークに学習させます。

layers = [ ...
    imageInputLayer([28 28 1],'Normalization','none')
    convolution2dLayer(5,20)
    reluLayer()
    maxPooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10);
    softmaxLayer()
    classificationLayer()];
 
options = trainingOptions('adam', ...
    'Plots','training-progress', ...
    'MiniBatchSize',miniBatchSize);
 
net = trainNetwork(dsTrain,layers,options);

基になるデータストアから読み取られたデータ data に対して目的の変換を実行する関数を定義します。この関数は各読み取りイメージをループ処理し、ランダムな回転を実行して、変換後のイメージと対応するラベルを trainNetwork で期待される cell 配列として返します。

function [dataOut,info] = preprocessForTraining(data,info)
 
numRows = size(data,1);
dataOut = cell(numRows,2);
 
for idx = 1:numRows
    
    % Randomized 90 degree rotation
    imgOut = rot90(data{idx,1},randi(4)-1);
    
    % Return the label from info struct as the 
    % second column in dataOut.
    dataOut(idx,:) = {imgOut,info.Label(idx)};
    
end
end

データストアの組み合わせ

関数 combine は、同じ長さの 2 つのデータストアを関連付けて、期待される形式の学習および検証データを作成します。データストアの組み合わせではデータストア間のパリティが維持されます。結果の CombinedDatastore の関数 read を呼び出すたびに、基になるデータストアの対応する部分からデータが返されます。

たとえば、入力イメージと出力イメージを使用して回帰ネットワークに学習させる場合、2 つのイメージ データストアを組み合わせることによって学習データセットを作成できます。次のサンプル コードは、imdsX および imdsY という名前の 2 つのイメージ データストアの組み合わせを示します。これらのイメージ データストアはデータを cell 配列として返すため、組み合わせが行われたデータストア imdsTrain はデータを 2 列の cell 配列として返します。

imdsX = imageDatastore(___);
imdsY = imageDatastore(___);
imdsTrain = combine(imdsX,imdsY)
imdsTrain = 

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

Image Processing Toolbox がある場合、randomPatchExtractionDatastore によって別の解決策が提供されます。これは、ImageDatastorePixelLabelDatastore、および TransformedDatastore 内のイメージに基づくデータを、前述の 2 つのデータストアのいずれかの基となる型に関連付ける方法に代わる解決策です。randomPatchExtractionDatastore には、関数 combine を使用したデータの関連付けと比べて複数の利点があります。ランダム パッチ抽出データストアは、具体的に以下のことを行います。

  • transform および combine を使用したカスタムのトリミング操作の実装を必要とすることなく、2 次元および 3 次元の両方のデータからパッチを抽出する、簡単な方法を提供する

  • transform を使用したカスタム連結操作の定義を必要とすることなく、ミニバッチのイメージごとに複数のパッチを簡単に生成する方法を提供する

  • categorical データにイメージ変換を適用する際に、categorical データと数値データの間での効率的な変換をサポートする

  • 並列学習をサポートする

  • イメージをキャッシュすることによってパフォーマンスを改善する

並列学習およびバックグラウンド ディスパッチへのデータストアの使用

並列学習またはマルチ GPU 学習に使用されるデータストアは分割可能でなければなりません。trainingOptions の名前と値のペアの引数 'ExecutionEnvironment' を使用して、並列学習またはマルチ GPU 学習を指定します。

多くの組み込みデータストアは関数 partition をサポートしているため、既に分割可能になっています。基になるデータストアが分割可能な場合、変換後のデータストアは分割可能です。関数 transform を組み込みデータストアと共に使用すると、一般的には並列学習とマルチ GPU 学習のサポートが維持されます。

並列学習またはマルチ GPU 学習をサポートするカスタム データストアを作成する必要がある場合、データストアは matlab.io.datastore.Partitionable クラスを実装しなければなりません。

分割可能なデータストアは、バックグラウンド ディスパッチを使用した学習データの読み取りをサポートします。バックグラウンド ディスパッチでは、GPU の作動中にデータがメモリのキューに入れられます。trainingOptions の名前と値のペアの引数 'DispatchInBackground' を使用してバックグラウンド ディスパッチを指定します。バックグラウンド ディスパッチは Parallel Computing Toolbox™ が必要です。

並列学習、マルチ GPU 学習、およびバックグラウンド ディスパッチにデータストアを使用する場合には、いくつかの制限があります。

  • データストアでは、trainingOptions の名前と値のペアの引数 'Shuffle''none' に指定することはサポートされません。

  • 組み合わせが行われたデータストアは分割可能ではないため、並列学習、マルチ GPU 学習、またはバックグラウンド ディスパッチはサポートされません。

参考

| | | |

関連する例

詳細