深層学習用のデータストア
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
を使用して学習させる場合、学習データのソースとしてイメージ データストアまたは他のタイプのデータストアを使用できます。データストアを検証に使用するには、関数 trainingOptions
で名前と値の引数
を使用します。ValidationData
ほとんどの組み込みのデータストアは、ネットワークで必要とされるレイアウトでデータを出力します。関数 trainnet
を使用してネットワークに学習させる際、データのレイアウトがネットワークで必要とされるレイアウトと異なる場合、関数 trainingOptions
の InputDataFormats
オプションを使用して、データのレイアウトが異なることを示します。通常、入力データを前処理するよりも、InputDataFormats
オプションを調整する方が簡単です。
学習または検証に有効な入力であるには、データストアの関数 read
が cell 配列または table としてデータを返さなければなりません (数値配列を出力できる ImageDatastore
オブジェクトと、table を出力しなければならないカスタム ミニバッチ データストアは除く)。
単一の入力があるネットワークの場合、データストアによって返される table または cell 配列に 2 つの列がなければなりません。データの最初の列はネットワークへの入力を表し、データの 2 列目は応答を表します。データの各列は個別の観測を表します。ImageDatastore
の場合のみ、trainnet
および trainingOptions
は整数配列および整数配列の 1 列の cell 配列として返されるデータをサポートします。
複数の入力層または複数の出力をもつネットワークにデータストアを使用するには、関数 combine
および関数 transform
を使用して、列数が (numInputs
+ numOutputs
) の cell 配列を出力するデータストアを作成します。ここで、numInputs
はネットワーク入力の数、numOutputs
はネットワーク出力の数です。この場合、最初の numInputs
列は各入力の予測子を指定し、最後の numOutputs
列は応答を指定します。入力と出力の順序は、ニューラル ネットワークの InputNames
プロパティと OutputNames
プロパティによってそれぞれ指定されます。
以下の表に、データストア ds
に対して関数 read
を呼び出した場合の出力の例を示します。
ニューラル ネットワーク アーキテクチャ | データストア出力 | 出力の例 |
---|---|---|
1 つの入力層と 1 つの出力 | 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]} | ||
複数の入力層と複数の出力 | ( 最初の 入力と出力の順序は、ニューラル ネットワークの | 2 つの入力と 2 つの出力があるニューラル ネットワークの cell 配列。 data = read(ds) data = 4×4 cell array {224×224×3 double} {128×128×3 double} {[2]} {[-42]} {224×224×3 double} {128×128×3 double} {[2]} {[-15]} {224×224×3 double} {128×128×3 double} {[9]} {[-24]} {224×224×3 double} {128×128×3 double} {[9]} {[-44]} |
予測子の形式は、データのタイプによって異なります。
データ | 予測子の形式 |
---|---|
2 次元イメージ | h x w x c の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。 |
3 次元イメージ | h x w x d x c の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。 |
ベクトル シーケンス | s 行 c 列の行列。ここで、s はシーケンス長、c はシーケンスの特徴の数です。 |
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 配列が要素に含まれていなければなりません。
関数 trainnet
を使用したネットワークの学習時に使用できるほとんどの損失関数は、ターゲットに応じて次のデータ レイアウトを必要とします。
ターゲット | ターゲットのレイアウト |
---|---|
カテゴリカル ラベル | categorical スカラー。 |
カテゴリカル ラベルのシーケンス | t 行 1 列の categorical ベクトル。ここで、t はタイム ステップ数です。 |
バイナリ ラベル (単一のラベル) | 数値スカラー |
バイナリ ラベル (複数のラベル) | 1 行 c 列のベクトル。ここで、c はそれぞれクラスの数です。 |
数値スカラー | 数値スカラー |
数値ベクトル | 1 行 R 列のベクトル。ここで、R は応答の数です。 |
2 次元イメージ | h x w x c の数値配列。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数です。 |
3 次元イメージ | h x w x d x c の数値配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数です。 |
スカラーの数値シーケンス | t 行 1 列のベクトル。ここで、t はタイム ステップ数です。 |
ベクトルの数値シーケンス | t 行 c 列の配列。ここで、t と c はそれぞれタイム ステップ数とチャネル数です。 |
1 次元イメージのシーケンス | h×c×t 列の配列。ここで、h、c、および t は、それぞれシーケンスの高さ、チャネル数、およびタイム ステップ数です。 |
2 次元イメージのシーケンス | h×w×c×t 列の配列。ここで、h、w、c、および t は、それぞれシーケンスの高さ、幅、チャネル数、およびタイム ステップ数です。 |
2 次元イメージのシーケンス | h×w×d×c×t の配列。ここで、h、w、d、c、および t は、それぞれシーケンスの高さ、幅、深さ、チャネル数、およびタイム ステップ数です。 |
詳細については、Deep Learning Data Formatsを参照してください。
table で返される応答の場合、要素は、categorical スカラー、数値行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。
予測
関数 minibatchpredict
を使用する推論の場合、予測子に対応する列を得るためにのみデータストアが必要です。推論関数は最初の NumInputs
個の列を使用し、後続の層を無視します。ここで、NumInputs
はネットワーク入力層の数です。
読み取りサイズとミニバッチ サイズの指定
read
を呼び出すたびに、データストアが任意の行数 (観測値) を返すことがあります。データストアを使用でき、MiniBatchSize
の指定をサポートする trainnet
および minibatchpredict
などの関数は、データの完全なミニバッチの形成に必要な回数だけ read
を呼び出します。これらの関数がミニバッチを形成する際には、メモリの内部キューを使用して読み取りデータを格納します。たとえば、read
の呼び出しごとにデータストアが一貫して 64 行を返し、MiniBatchSize
が 128
である場合、データの各ミニバッチを形成するには read
を 2 回呼び出す必要があります。
最良のランタイム パフォーマンスを得るには、read
によって返される観測値の数が MiniBatchSize
に等しくなるようにデータストアを構成することをお勧めします。ReadSize
プロパティがあるデータストアの場合、ReadSize
を設定して、read
を呼び出すたびにデータストアによって返される観測値の数を変更します。
データストアの変換と統合
深層学習では、データがネットワークへの入力に適した形式になる前にデータの前処理と拡張が必要になることがよくあります。データストアの関数 transform
および combine
は、ネットワークに渡されるデータの準備に役立ちます。
複数の入力層または複数の出力をもつネットワークにデータストアを使用するには、関数 combine
および関数 transform
を使用して、列数が (numInputs
+ numOutputs
) の cell 配列を出力するデータストアを作成します。ここで、numInputs
はネットワーク入力の数、numOutputs
はネットワーク出力の数です。この場合、最初の numInputs
列は各入力の予測子を指定し、最後の numOutputs
列は応答を指定します。入力と出力の順序は、ニューラル ネットワークの InputNames
プロパティと OutputNames
プロパティによってそれぞれ指定されます。
データストアの変換
変換されたデータストアは、データを読み取るときに、特定のデータ変換を基となるデータストアに適用します。変換されたデータストアを作成するには、関数 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 学習が既にサポートされています。関数 transform
と combine
を組み込みデータストアと共に使用すると、一般的には並列学習とマルチ GPU 学習のサポートが維持されます。
並列学習またはマルチ GPU 学習をサポートするカスタム データストアを作成する必要がある場合、データストアは matlab.io.datastore.Subsettable
クラスを実装しなければなりません。
データストアを並列学習またはマルチ GPU 学習に使用するには、そのデータストアのサブセット化または分割が可能でなければなりません。データストアのサブセット化または分割が可能かどうかを判定するには、関数 isSubsettable
または isPartitionable
をそれぞれ使用します。
並列学習の場合、データストアで trainingOptions
の名前と値の引数 Shuffle
を "never"
として指定することはサポートされていません。
バックグラウンドまたは並列でのデータの前処理
学習を高速化するには、学習中にデータストアから学習データをバックグラウンドまたは並列で取得し、前処理します。
次の図に示すように、取得、前処理、および学習計算を逐次実行すると、GPU (または他のハードウェア) の使用率が低い場合にダウンタイムが発生する可能性があります。GPU が現在のバッチを処理している間に、バックグラウンド プールまたは並列ワーカーを使用して学習データの次のバッチを取得し、前処理させることで、ハードウェアの使用率が向上し、学習を高速化できる可能性があります。大きなイメージを操作する場合など、学習データに大幅な前処理が必要な場合は、バックグラウンドまたは並列での前処理を使用します。
バックグラウンドまたは並列でデータを前処理するには、次のいずれかを行います。
組み込み学習では、関数
trainingOptions
を使用して、PreprocessingEnvironment
オプションを"background"
または"parallel"
に設定する。カスタム学習ループでは、
minibatchqueue
のPreprocessingEnvironment
プロパティを"background"
または"parallel"
に設定する。
PreprocessingEnvironment
オプションを "parallel"
に設定することは、ローカル並列プールでのみサポートされており、Parallel Computing Toolbox が必要になります。
"background"
オプションまたは "parallel"
オプションを使用するには、入力データストアがサブセット化可能または分割可能でなければなりません。カスタム データストアには matlab.io.datastore.Subsettable
クラスが実装されていなければなりません。
参考
transform
| combine
| read
| trainnet
| trainingOptions
| dlnetwork