Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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

データストアの選択

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

データストア説明追加で必要になるツールボックス
ImageDatastoreイメージ データ用のデータストアなし
AugmentedImageDatastore

学習イメージのサイズ変更および拡張を行うためのデータストア

データストアは非確定的

なし
PixelLabelDatastore (Computer Vision Toolbox)

ピクセル ラベル データのデータストア

Computer Vision Toolbox™

boxLabelDatastore (Computer Vision Toolbox)

境界ボックス ラベル データ用のデータストア

Computer Vision Toolbox

RandomPatchExtractionDatastore (Image Processing Toolbox)

イメージベースのデータからランダム パッチを抽出するためのデータストア

データストアは非確定的

Image Processing Toolbox™

blockedImageDatastore (Image Processing Toolbox)メモリに収まらない大きなイメージを含む、イメージ データのブロック単位の読み取りと処理のためのデータストアImage Processing Toolbox
blockedPointCloudDatastore (Lidar Toolbox)メモリに収まらない大きな点群を含む、点群データのブロック単位の読み取りと処理のためのデータストアLidar Toolbox™
DenoisingImageDatastore (Image Processing Toolbox)

イメージ ノイズ除去の深層ニューラル ネットワークに学習させるためのデータストア

データストアは非確定的

Image Processing Toolbox

audioDatastore (Audio Toolbox)オーディオ データ用のデータストアAudio Toolbox™
signalDatastore (Signal Processing Toolbox)信号データ用のデータストアSignal Processing Toolbox™

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

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

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

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

学習と検証

関数 trainnet または trainNetwork を使用して学習させる場合、学習データのソースとしてイメージ データストアまたは他のタイプのデータストアを使用できます。データストアを検証に使用するには、関数 trainingOptions で名前と値の引数 ValidationData を使用します。

学習または検証に有効な入力であるには、データストアの関数 read が cell 配列または table としてデータを返さなければなりません (数値配列を出力できる ImageDatastore オブジェクトと、table を出力しなければならないカスタム ミニバッチ データストアは除く)。

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

複数の入力層があるネットワークにデータストアを使用するには、関数 combine および transform を使用して、列数が (numInputs + 1) の cell 配列を出力するデータストアを作成します。ここで、numInputs はネットワーク入力の数です。この場合、最初の numInputs 列は各入力の予測子を指定し、最後の列は応答を指定します。入力の順序は、層グラフ layersInputNames プロパティによって指定します。

以下の表に、データストア ds に対して関数 read を呼び出した場合の出力の例を示します。

ニューラル ネットワーク アーキテクチャデータストア出力出力の例
単入力層

2 列の table または cell 配列。

最初の列と 2 番目の列は、それぞれ予測子とターゲットを指定します。

table の要素は、スカラー、行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。

カスタム ミニバッチ データストアは、table を出力しなければなりません。

1 つの入力と 1 つの出力があるニューラル ネットワークの table:

data = read(ds)
data =

  4×2 table

        Predictors        Response
    __________________    ________

    {224×224×3 double}       2    
    {224×224×3 double}       7    
    {224×224×3 double}       9    
    {224×224×3 double}       9  

1 つの入力と 1 つの出力があるニューラル ネットワークの cell 配列:

data = read(ds)
data =

  4×2 cell array

    {224×224×3 double}    {[2]}
    {224×224×3 double}    {[7]}
    {224×224×3 double}    {[9]}
    {224×224×3 double}    {[9]}

多入力層

(numInputs + 1) 列の cell 配列。numInputs はニューラル ネットワーク入力の数です。

最初の numInputs 個の列は各入力の予測子を指定し、最後の列はターゲットを指定します。

入力の順序は、層グラフ layersInputNames プロパティによって指定します。

2 つの入力と 1 つの出力があるニューラル ネットワークの cell 配列。

data = read(ds)
data =

  4×3 cell array

    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[2]}
    {224×224×3 double}    {128×128×3 double}    {[9]}
    {224×224×3 double}    {128×128×3 double}    {[9]}

予測子の形式は、データのタイプによって異なります。

データ予測子の形式
2 次元イメージ

h x w x c の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。

3 次元イメージ

h x w x d x c の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。

ベクトル シーケンス

c 行 s 列の行列。ここで、c はシーケンスの特徴の数、s はシーケンス長です。

1 次元イメージ シーケンス

h x c x s の配列。ここで、h および c はそれぞれイメージの高さおよびチャネル数に対応します。s はシーケンス長です。

ミニバッチ内の各シーケンスは、同じシーケンス長でなければなりません。

2 次元イメージ シーケンス

h x w x c x s の配列。ここで、h、w、および c はそれぞれイメージの高さ、幅、およびチャネル数に対応します。s はシーケンス長です。

ミニバッチ内の各シーケンスは、同じシーケンス長でなければなりません。

3 次元イメージ シーケンス

h x w x d x c x s の配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数に対応します。s はシーケンス長です。

ミニバッチ内の各シーケンスは、同じシーケンス長でなければなりません。

特徴

c 行 1 列の列ベクトル。c は特徴の数です。

予測子が table で返される場合、数値スカラーまたは数値行ベクトルが要素に含まれているか、数値配列が格納された 1 行 1 列の cell 配列が要素に含まれていなければなりません。

関数 trainNetwork は、複数のシーケンス入力層をもつネットワークをサポートしていません。

応答の形式は、タスクのタイプによって異なります。

タスク応答の形式
分類categorical スカラー
回帰

  • スカラー

  • 数値ベクトル

  • イメージを表す 3 次元数値配列

sequence-to-sequence 分類

カテゴリカル ラベルの 1 行 s 列のシーケンス。ここで、s は対応する予測子シーケンスのシーケンス長です。

sequence-to-sequence 回帰

R 行 s 列の行列。ここで、R は応答の数、s は対応する予測子シーケンスのシーケンス長です。

table で返される応答の場合、要素は、categorical スカラー、数値行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。

予測

predictclassify、および activations を使用する推論の場合、予測子に対応する列を得るためにのみデータストアが必要です。推論関数は最初の NumInputs 個の列を使用し、後続の層を無視します。ここで、NumInputs はネットワーク入力層の数です。

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

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

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

データストアの変換と統合

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

複数の入力層があるネットワークにデータストアを使用するには、関数 combine および transform を使用して、列数が (numInputs + 1) の cell 配列を出力するデータストアを作成します。ここで、numInputs はネットワーク入力の数です。この場合、最初の numInputs 列は各入力の予測子を指定し、最後の列は応答を指定します。入力の順序は、層グラフ layersInputNames プロパティによって指定します。

データストアの変換

変換されたデータストアは、データを読み取るときに、特定のデータ変換を基となるデータストアに適用します。変換されたデータストアを作成するには、関数 transform を使用して、基となるデータストアおよび変換処理について指定します。

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

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

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

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

データストアの統合

関数 combine は、複数のデータストアを関連付けます。結果の CombinedDatastore に対してデータストアのリセットなどの操作を行うと、基になるすべてのデータストアに対して同じ操作が実行されます。結合されたデータストアの関数 read を呼び出すと、基になる N 個の基になるデータストアすべてからデータのバッチ 1 つが読み取られます。返される観測値の数は同じでなければなりません。結合されたデータストアから読み取りを行うと、学習と検証に適した N 列の cell 配列で、結果が水平方向に連結されて返されます。結合されたデータストアをシャッフルすると、基になるデータストア内のファイルも同一のランダムな順序になります。

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

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

  CombinedDatastore with properties:

    UnderlyingDatastores: {1×2 cell}

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

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

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

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

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

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

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

並列学習

trainingOptions の名前と値の引数 ExecutionEnvironment を使用して、並列学習またはマルチ GPU 学習を指定します。並列学習や、単一 GPU または複数 GPU での学習を行うには、Parallel Computing Toolbox™ が必要です。

多くの組み込みデータストアでは、並列学習とマルチ GPU 学習が既にサポートされています。関数 transformcombine を組み込みデータストアと共に使用すると、一般的には並列学習とマルチ GPU 学習のサポートが維持されます。

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

データストアを並列学習またはマルチ GPU 学習に使用するには、そのデータストアのサブセット化または分割が可能でなければなりません。データストアのサブセット化または分割が可能かどうかを判定するには、関数 isSubsettable または isPartitionable をそれぞれ使用します。

並列学習の場合、データストアで trainingOptions の名前と値の引数 Shuffle"never" として指定することはサポートされていません。

バックグラウンド ディスパッチ

バックグラウンド ディスパッチでは、並列ワーカーを使用して、学習の際にデータストアから学習データを取得し、前処理します。次の図に示すように、取得、前処理、および学習計算を逐次実行すると、GPU (または他のハードウェア) の使用率が低い場合にダウンタイムが発生する可能性があります。GPU が現在のバッチを処理している間に、並列ワーカーを使用して学習データの次のバッチを取得して前処理させることで、ハードウェアの使用率が向上し、学習を高速化できる可能性があります。大きなイメージを操作する場合など、学習データに大幅な前処理が必要な場合は、バックグラウンド ディスパッチを使用します。

Schematic diagram comparing the GPU utilization when training a network with and without using background dispatching when significant preprocessing of the training data is required. Without background dispatch, the GPU is utilized sporadically and with background dispatch the GPU is utilized more consistently.

バックグラウンド ディスパッチを使用するには、次のいずれかを実行します。

  • 組み込み学習では、関数 trainingOptions を使用して DispatchInBackground オプションを true に設定する。

  • カスタム学習ループでは、minibatchqueueDispatchInBackground プロパティを true に設定する。

バックグラウンド ディスパッチは Parallel Computing Toolbox が必要です。

サブセット化または分割が可能なデータストアは、バックグラウンド ディスパッチを使用した学習データの読み取りをサポートします。バックグラウンド ディスパッチは、ローカル並列プールでのみサポートされます。

参考

| | | |

関連する例

詳細