このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
深層学習用のデータストア
MATLAB® のデータストアは、大きすぎて一度にメモリに収まらないデータの集合を処理および表現する便利な方法です。深層学習には大量のデータが必要となる場合がよくあるため、データストアは MATLAB における深層学習ワークフローの重要な部分です。
データストアの選択
多くの用途では、組み込みデータストアで開始するのが最も簡単な方法です。使用可能な組み込みデータストアの詳細は、ファイル形式またはアプリケーション用のデータ ストアの選択を参照してください。ただし、ネットワークの学習、検証、および推論のための入力として直接使用できるのは、一部のタイプの組み込みデータストアのみです。これらのデータストアは以下のとおりです。
データストア | 説明 | 追加で必要になるツールボックス |
---|---|---|
ImageDatastore | イメージ データ用のデータストア | なし |
AugmentedImageDatastore | 学習イメージのサイズ変更および拡張を行うためのデータストア データストアは非確定的 | なし |
PixelLabelDatastore (Computer Vision Toolbox) | ピクセル ラベル データのデータストア | Computer Vision Toolbox™ |
PixelLabelImageDatastore (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™ のデータストアは、学習、検証、および推論に有効な入力です。
学習と検証
関数 trainNetwork
を使用して学習させる場合、学習データのソースとしてイメージ データストアまたは他のタイプのデータストアを使用できます。データストアを検証に使用するには、trainingOptions
で名前と値のペアの引数 '
を使用します。ValidationData
'
学習または検証に有効な入力であるには、データストアの関数 read
が cell 配列または table としてデータを返さなければなりません (数値配列を出力できる ImageDatastore
オブジェクトと、table を出力しなければならないカスタム ミニバッチ データストアは除く)。
単一の入力があるネットワークの場合、データストアによって返される table または cell 配列に 2 つの列がなければなりません。データの最初の列はネットワークへの入力を表し、データの 2 列目は応答を表します。データの各列は個別の観測を表します。ImageDatastore
の場合のみ、trainNetwork
および trainingOptions
は整数配列および整数配列の 1 列の cell 配列として返されるデータをサポートします。
複数の入力層があるネットワークにデータストアを使用するには、関数 combine
および transform
を使用して、列数が (numInputs
+ 1) の cell 配列を出力するデータストアを作成します。ここで、numInputs
はネットワーク入力の数です。この場合、最初の numInputs
列は各入力の予測子を指定し、最後の列は応答を指定します。入力の順序は、層グラフ layers
の InputNames
プロパティによって指定します。
以下の表に、データストア 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]} | ||
多入力層 | ( 最初の 入力の順序は、層グラフ | 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 スカラー |
回帰 |
|
sequence-to-sequence 分類 | カテゴリカル ラベルの 1 行 s 列のシーケンス。ここで、s は対応する予測子シーケンスのシーケンス長です。 |
sequence-to-sequence 回帰 | R 行 s 列の行列。ここで、R は応答の数、s は対応する予測子シーケンスのシーケンス長です。 |
table で返される応答の場合、要素は、categorical スカラー、数値行ベクトルであるか、数値配列が格納された 1 行 1 列の cell 配列でなければなりません。
予測
predict
、classify
、および activations
を使用する推論の場合、予測子に対応する列を得るためにのみデータストアが必要です。推論関数は最初の NumInputs
個の列を使用し、後続の層を無視します。ここで、NumInputs
はネットワーク入力層の数です。
読み取りサイズとミニバッチ サイズの指定
read
を呼び出すたびに、データストアが任意の行数 (観測値) を返すことがあります。データストアを使用でき、'MiniBatchSize'
の指定をサポートする trainNetwork
、predict
、classify
、activations
などの関数は、データの完全なミニバッチの形成に必要な回数だけ read
を呼び出します。これらの関数がミニバッチを形成する際には、メモリの内部キューを使用して読み取りデータを格納します。たとえば、read
の呼び出しごとにデータストアが一貫して 64 行を返し、MiniBatchSize
が 128
である場合、データの各ミニバッチを形成するには read
を 2 回呼び出す必要があります。
最良のランタイム パフォーマンスを得るには、read
によって返される観測値の数が 'MiniBatchSize'
に等しくなるようにデータストアを構成することをお勧めします。'ReadSize'
プロパティがあるデータストアの場合、'ReadSize'
を設定して、read
を呼び出すたびにデータストアによって返される観測値の数を変更します。
データストアの変換と統合
深層学習では、データがネットワークへの入力に適した形式になる前にデータの前処理と拡張が必要になることがよくあります。データストアの関数 transform
および combine
は、ネットワークに渡されるデータの準備に役立ちます。
複数の入力層があるネットワークにデータストアを使用するには、関数 combine
および transform
を使用して、列数が (numInputs
+ 1) の cell 配列を出力するデータストアを作成します。ここで、numInputs
はネットワーク入力の数です。この場合、最初の numInputs
列は各入力の予測子を指定し、最後の列は応答を指定します。入力の順序は、層グラフ layers
の InputNames
プロパティによって指定します。
データストアの変換
変換されたデータストアは、データを読み取るときに、特定のデータ変換を基となるデータストアに適用します。変換されたデータストアを作成するには、関数 transform
を使用して、基となるデータストアおよび変換処理について指定します。
複数の前処理演算を伴う複雑な変換の場合、独自の関数に変換の完全なセットを定義します。次に、関数のハンドルを
transform
の引数@fcn
として指定します。詳細については、関数のファイルでの作成を参照してください。1 行のコードで表現できる単純な変換の場合、無名関数のハンドルを
transform
の引数@fcn
として指定できます。詳細については、無名関数を参照してください。
transform
に指定された関数ハンドルは、基になるデータストアの関数 read
によって返される形式と同じ形式の入力データを受け入れなければなりません。
例:数字分類ネットワークに学習させるためのイメージ データストアの変換
この例では、関数 transform
を使用して、イメージ データストア内の各イメージにランダムな 90 度の回転が追加される学習セットを作成します。結果の TransformedDatastore
を trainNetwork
に渡して、簡単な数字分類ネットワークに学習させます。
数字イメージを含むイメージ データストアを作成します。
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);
変換関数 preprocessForTraining
を定義します。関数への入力は、基になるデータストアから読み取られたデータのバッチ 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
は、複数のデータストアを関連付けます。結果の 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'
として指定することはサポートされていません。
バックグラウンド ディスパッチ
バックグラウンド ディスパッチは、MATLAB クライアント セッションおよび他の並列ワーカーがネットワークの学習を行っている間、並列ワーカーを使用してメモリからデータを読み取ります。trainingOptions
の名前と値のペアの引数 'DispatchInBackground'
を使用してバックグラウンド ディスパッチを指定します。バックグラウンド ディスパッチは Parallel Computing Toolbox が必要です。
サブセット化または分割が可能なデータストアは、バックグラウンド ディスパッチを使用した学習データの読み取りをサポートします。
参考
transform
| combine
| trainNetwork
| trainingOptions
| read