このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
forward
学習用の深層学習ネットワーク出力の計算
構文
説明
深層学習層によっては学習時と推論時 (予測時) の動作が異なる場合があります。たとえば、学習時には過適合を防ぐためにドロップアウト層によって入力要素がランダムに 0 に設定されますが、推論時にはドロップアウト層によって入力が変更されることはありません。
学習用のネットワーク出力を計算するには、関数 forward
を使用します。推論用のネットワーク出力を計算するには、関数 predict
を使用します。
[Y1,...,YN] = forward(___)
は、前述のいずれかの構文を使用して、N
個の出力をもつネットワークについて、N
個の学習時の出力 Y1
, …, YN
を返します。
[Y1,...,YK] = forward(___,'Outputs',
は、前述のいずれかの構文を使用して、指定された層について、学習時の出力 layerNames
)Y1
, …, YK
を返します。
[___] = forward(___,'Acceleration',
は、前述の構文の入力引数に加え、学習時に使用するパフォーマンスの最適化も指定します。 acceleration
)
[___,
は、更新されたネットワークの状態も返します。state
] = forward(___)
[___,
は、枝刈り層の活性化の cell 配列も返します。この構文は、state
,pruningActivations
] = forward(___)net
が TaylorPrunableNetwork
オブジェクトである場合にのみ適用できます。
深層ニューラル ネットワークの枝刈りを行うには、Deep Learning Toolbox™ Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。
例
カスタム学習ループを使用したネットワークの学習
この例では、カスタム学習率スケジュールで手書きの数字を分類するネットワークに学習させる方法を示します。
ほとんどのタイプのニューラル ネットワークは、関数trainnet
と関数trainingOptions
を使用して学習させることができます。必要なオプション (たとえば、カスタム学習率スケジュール) が関数 trainingOptions
に用意されていない場合、自動微分のために dlarray
オブジェクトと dlnetwork
オブジェクトを使用して独自のカスタム学習ループを定義できます。関数 trainnet
を使用して事前学習済みの深層学習ネットワークに再学習させる方法を示す例については、Retrain Neural Network to Classify New Imagesを参照してください。
深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 と見なすことにより (ここで、 はネットワーク入力、 は学習可能なパラメーターのセット)、 を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 と対応するターゲット に対して、予測 と の間の誤差が最小になるように、学習可能なパラメーター を最適化します。
使用される損失関数は、タスクのタイプによって異なります。次に例を示します。
分類タスクの場合、予測とターゲットの間のクロス エントロピー誤差を最小化できます。
回帰タスクの場合、予測とターゲットの間の平均二乗誤差を最小化できます。
勾配降下法を使用して目的を最適化できます。勾配降下法では、学習可能なパラメーターについての損失の勾配を使用して最小化に向けてステップを実行することで、学習可能なパラメーター を反復的に更新することにより、損失 を最小化します。勾配降下法アルゴリズムは通常、 の形式の更新ステップのバリアントを使用して、学習可能なパラメーターを更新します。ここで、 は反復回数、 は学習率、 は勾配 (学習可能なパラメーターについての損失の微分) を表します。
この例では、"時間ベースの減衰" 学習率スケジュールで手書きの数字を分類するようにネットワークに学習させます。各反復で、ソルバーは によって与えられる学習率を使用します。ここで、t は反復回数、 は初期学習率、k は減衰です。
学習データの読み込み
関数 imageDatastore
を使用して数字データをイメージ データストアとして読み込み、イメージ データが格納されているフォルダーを指定します。
unzip("DigitsData.zip") imds = imageDatastore("DigitsData", ... IncludeSubfolders=true, ... LabelSource="foldernames");
データを学習セットと検証セットに分割します。関数 splitEachLabel
を使用して、データの 10% を検証用に残しておきます。
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.9,"randomize");
この例で使用されるネットワークには、サイズが 28 x 28 x 1 の入力イメージが必要です。学習イメージのサイズを自動的に変更するには、拡張イメージ データストアを使用します。学習イメージに対して実行する追加の拡張演算として、イメージを水平軸方向および垂直軸方向に最大 5 ピクセルだけランダムに平行移動させる演算を指定します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。
inputSize = [28 28 1]; pixelRange = [-5 5]; imageAugmenter = imageDataAugmenter( ... RandXTranslation=pixelRange, ... RandYTranslation=pixelRange); augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain,DataAugmentation=imageAugmenter);
他のデータ拡張を実行せずに検証イメージのサイズを自動的に変更するには、追加の前処理演算を指定せずに拡張イメージ データストアを使用します。
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
学習データ内のクラスの数を決定します。
classes = categories(imdsTrain.Labels); numClasses = numel(classes);
ネットワークの定義
イメージ分類のネットワークを定義します。
イメージ入力用に、学習データと一致する入力サイズのイメージ入力層を指定します。
イメージ入力は正規化せず、入力層の
Normalization
オプションを"none"
に設定します。convolution-batchnorm-ReLU ブロックを 3 つ指定します。
Padding
オプションを"same"
に設定して、出力が同じサイズになるように畳み込み層に入力をパディングします。最初の畳み込み層には、サイズ 5 のフィルターを 20 個指定します。残りの畳み込み層には、サイズ 3 のフィルターを 20 個指定します。
分類用に、クラスの数と一致するサイズの全結合層を指定します。
出力を確率にマッピングするために、ソフトマックス層を含めます。
カスタム学習ループを使用してネットワークに学習させる場合、出力層は含めません。
layers = [ imageInputLayer(inputSize,Normalization="none") convolution2dLayer(5,20,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,20,Padding="same") batchNormalizationLayer reluLayer convolution2dLayer(3,20,Padding="same") batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer];
層配列から dlnetwork
オブジェクトを作成します。
net = dlnetwork(layers)
net = dlnetwork with properties: Layers: [12×1 nnet.cnn.layer.Layer] Connections: [11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'imageinput'} OutputNames: {'softmax'} Initialized: 1 View summary with summary.
モデル損失関数の定義
深層ニューラル ネットワークの学習は最適化タスクです。ニューラル ネットワークを関数 と見なすことにより (ここで、 はネットワーク入力、 は学習可能なパラメーターのセット)、 を最適化して学習データに基づく損失値を最小化できます。たとえば、与えらえた入力 と対応するターゲット に対して、予測 と の間の誤差が最小になるように、学習可能なパラメーター を最適化します。
例のモデル損失関数の節にリストされている関数 modelLoss
を作成します。この関数は、dlnetwork
オブジェクト、入力データのミニバッチと対応するターゲットを入力として受け取り、学習可能なパラメーターについての損失と損失の勾配、およびネットワークの状態を返します。
学習オプションの指定
ミニバッチ サイズを 128 として 10 エポック学習させます。
numEpochs = 10; miniBatchSize = 128;
SGDM 最適化のオプションを指定します。減衰 0.01 の初期学習率 0.01、およびモーメンタム 0.9 を指定します。
initialLearnRate = 0.01; decay = 0.01; momentum = 0.9;
モデルの学習
学習中にイメージのミニバッチを処理および管理するminibatchqueue
オブジェクトを作成します。各ミニバッチで次を行います。
カスタム ミニバッチ前処理関数
preprocessMiniBatch
(この例の最後に定義) を使用して、ラベルを one-hot 符号化変数に変換します。イメージ データを次元ラベル
"SSCB"
(spatial、spatial、channel、batch) で形式を整えます。既定では、minibatchqueue
オブジェクトは、基となる型がsingle
のdlarray
オブジェクトにデータを変換します。クラス ラベルの形式は整えません。部分的なミニバッチは破棄します。
GPU が利用できる場合、GPU で学習を行います。既定では、
minibatchqueue
オブジェクトは、GPU が利用可能な場合、各出力をgpuArray
に変換します。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
mbq = minibatchqueue(augimdsTrain,... MiniBatchSize=miniBatchSize,... MiniBatchFcn=@preprocessMiniBatch,... MiniBatchFormat=["SSCB" ""], ... PartialMiniBatch="discard");
SGDM ソルバーの速度パラメーターを初期化します。
velocity = [];
学習の進行状況モニター用に合計反復回数を計算します。
numObservationsTrain = numel(imdsTrain.Files); numIterationsPerEpoch = floor(numObservationsTrain / miniBatchSize); numIterations = numEpochs * numIterationsPerEpoch;
TrainingProgressMonitor
オブジェクトを初期化します。monitor オブジェクトを作成するとタイマーが開始されるため、学習ループに近いところでオブジェクトを作成するようにしてください。
monitor = trainingProgressMonitor( ... Metrics="Loss", ... Info=["Epoch" "LearnRate"], ... XLabel="Iteration");
カスタム学習ループを使用してネットワークに学習させます。各エポックについて、データをシャッフルしてデータのミニバッチをループで回します。各ミニバッチで次を行います。
関数
dlfeval
と関数modelLoss
を使用してモデルの損失、勾配、および状態を評価し、ネットワークの状態を更新します。時間ベースの減衰学習率スケジュールの学習率を決定します。
関数
sgdmupdate
を使用してネットワーク パラメーターを更新します。学習の進行状況モニターで、損失、学習率、およびエポックの値を更新します。
Stop プロパティが true の場合は停止します。[停止] ボタンをクリックすると、
TrainingProgressMonitor
オブジェクトの Stop プロパティ値が true に変わります。
epoch = 0; iteration = 0; % Loop over epochs. while epoch < numEpochs && ~monitor.Stop epoch = epoch + 1; % Shuffle data. shuffle(mbq); % Loop over mini-batches. while hasdata(mbq) && ~monitor.Stop iteration = iteration + 1; % Read mini-batch of data. [X,T] = next(mbq); % Evaluate the model gradients, state, and loss using dlfeval and the % modelLoss function and update the network state. [loss,gradients,state] = dlfeval(@modelLoss,net,X,T); net.State = state; % Determine learning rate for time-based decay learning rate schedule. learnRate = initialLearnRate/(1 + decay*iteration); % Update the network parameters using the SGDM optimizer. [net,velocity] = sgdmupdate(net,gradients,velocity,learnRate,momentum); % Update the training progress monitor. recordMetrics(monitor,iteration,Loss=loss); updateInfo(monitor,Epoch=epoch,LearnRate=learnRate); monitor.Progress = 100 * iteration/numIterations; end end
モデルのテスト
真のラベルをもつ検証セットで予測を比較し、モデルの分類精度をテストします。
学習後に新しいデータについて予測を行う際、ラベルは必要ありません。テスト データの予測子のみを含む minibatchqueue
オブジェクトを作成します。
テスト用のラベルを無視するには、ミニバッチ キューの出力数を 1 に設定します。
学習に使用されるサイズと同じミニバッチ サイズを指定します。
例の最後にリストされている関数
preprocessMiniBatchPredictors
を使用して予測子を前処理します。データストアの単一の出力では、ミニバッチの形式
"SSCB"
(spatial、spatial、channel、batch) を指定します。
numOutputs = 1; mbqTest = minibatchqueue(augimdsValidation,numOutputs, ... MiniBatchSize=miniBatchSize, ... MiniBatchFcn=@preprocessMiniBatchPredictors, ... MiniBatchFormat="SSCB");
例の最後にリストされている関数 modelPredictions
を使用して、ミニバッチをループ処理し、イメージを分類します。
YTest = modelPredictions(net,mbqTest,classes);
分類精度を評価します。
TTest = imdsValidation.Labels; accuracy = mean(TTest == YTest)
accuracy = 0.9220
混同チャートで予測を可視化します。
figure confusionchart(TTest,YTest)
対角線上の大きな値は、対応するクラスに対する正確な予測を示しています。対角線外の大きな値は、対応するクラス間での強い混同を示しています。
サポート関数
モデル損失関数
関数 modelLoss
は、dlnetwork
オブジェクト net
、入力データのミニバッチ X
とそれに対応するターゲット T
を受け取り、net
内の学習可能パラメーターについての損失と損失の勾配、およびネットワークの状態を返します。勾配を自動的に計算するには、関数 dlgradient
を使用します。
function [loss,gradients,state] = modelLoss(net,X,T) % Forward data through network. [Y,state] = forward(net,X); % Calculate cross-entropy loss. loss = crossentropy(Y,T); % Calculate gradients of loss with respect to learnable parameters. gradients = dlgradient(loss,net.Learnables); end
モデル予測関数
関数 modelPredictions
は、dlnetwork
オブジェクト net
、入力データの minibatchqueue
オブジェクト mbq
、およびネットワーク クラスを受け取り、minibatchqueue
オブジェクトに含まれるすべてのデータを反復処理することによってモデル予測を計算します。この関数は、関数 onehotdecode
を使用して、スコアが最も高い予測されたクラスを見つけます。
function Y = modelPredictions(net,mbq,classes) Y = []; % Loop over mini-batches. while hasdata(mbq) X = next(mbq); % Make prediction. scores = predict(net,X); % Decode labels and append to output. labels = onehotdecode(scores,classes,1)'; Y = [Y; labels]; end end
ミニ バッチ前処理関数
関数 preprocessMiniBatch
は、次の手順を使用して予測子とラベルのミニバッチを前処理します。
関数
preprocessMiniBatchPredictors
を使用してイメージを前処理します。入力 cell 配列からラベル データを抽出し、2 番目の次元に沿って categorical 配列に連結します。
カテゴリカル ラベルを数値配列に one-hot 符号化します。最初の次元への符号化は、ネットワーク出力の形状と一致する符号化された配列を生成します。
function [X,T] = preprocessMiniBatch(dataX,dataT) % Preprocess predictors. X = preprocessMiniBatchPredictors(dataX); % Extract label data from cell and concatenate. T = cat(2,dataT{1:end}); % One-hot encode labels. T = onehotencode(T,1); end
ミニバッチ予測子前処理関数
関数 preprocessMiniBatchPredictors
は、入力 cell 配列からイメージ データを抽出することで予測子のミニバッチを前処理し、数値配列に連結します。グレースケール入力では、4 番目の次元で連結することにより、3 番目の次元が各イメージに追加されます。この次元は、シングルトン チャネル次元として使用されることになります。
function X = preprocessMiniBatchPredictors(dataX) % Concatenate. X = cat(4,dataX{1:end}); end
入力引数
net
— カスタム学習ループまたはカスタム枝刈りループのためのネットワーク
dlnetwork
オブジェクト | TaylorPrunableNetwork
オブジェクト
この引数は、次のいずれかを表すことができます。
カスタム学習ループのネットワーク。
dlnetwork
オブジェクトとして指定します。カスタム枝刈りループのネットワーク。
TaylorPrunableNetwork
オブジェクトとして指定します。
深層ニューラル ネットワークの枝刈りを行うには、Deep Learning Toolbox Model Quantization Library サポート パッケージが必要です。このサポート パッケージは無料のアドオンで、アドオン エクスプローラーを使用してダウンロードできます。または、Deep Learning Toolbox Model Quantization Library を参照してください。
layerNames
— 出力の抽出元の層
string 配列 | 文字ベクトルの cell 配列
出力の抽出元の層。層の名前を含む string 配列、または層の名前を含む文字ベクトルの cell 配列として指定します。
layerNames(i)
が 1 つの出力をもつ層に対応する場合、layerNames(i)
は層の名前です。layerNames(i)
が複数の出力をもつ層に対応する場合、layerNames(i)
はまず層の名前、その後に文字/
、さらに層出力の名前が続きます ("layerName/outputName"
)。
acceleration
— パフォーマンスの最適化
'auto'
(既定値) | 'none'
パフォーマンスの最適化。次のいずれかとして指定します。
'auto'
— 入力ネットワークとハードウェア リソースに適した最適化の回数を自動的に適用します。'none'
— すべての高速化を無効にします。
既定のオプションは 'auto'
です。
'auto'
高速化オプションを使用すると、パフォーマンス上のメリットが得られますが、初期実行時間が長くなります。互換性のあるパラメーターを使用した後続の呼び出しは、より高速になります。サイズと形状が同じである異なる入力データを使用して関数を複数回呼び出す場合は、パフォーマンスの最適化を使用してください。
出力引数
state
— 更新されたネットワークの状態
table
更新されたネットワークの状態。table として返されます。
ネットワークの状態は、次の 3 つの列をもつ table です。
Layer
– 層の名前。string スカラーとして指定します。Parameter
– 状態パラメーターの名前。string スカラーとして指定します。Value
– 状態パラメーターの値。dlarray
オブジェクトとして指定します。
層の状態には、層処理中に計算された情報が格納されます。この情報は、層の後続のフォワード パスで使用するために保持されます。たとえば、LSTM 層のセル状態と隠れ状態、またはバッチ正規化層の実行中の統計が格納されます。
LSTM 層などの再帰層の場合、HasStateInputs
プロパティを 1
(true
) に設定すると、その層の状態に関するエントリはステート テーブルに格納されません。
pruningActivations
— 枝刈り層の活性化
dlarray
オブジェクトを含む cell 配列
枝刈り層の活性化の cell 配列 (入力ネットワークが TaylorPrunableNetwork
オブジェクトの場合)。
拡張機能
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
使用上の注意および制限:
次のいずれかまたは両方の条件が満たされる場合、この関数は GPU で実行されます。
net.Learnables.Value
に含まれるネットワークの学習可能なパラメーター値のいずれかが、gpuArray
型の基になるデータをもつdlarray
オブジェクトである入力引数
X
がgpuArray
型の基になるデータをもつdlarray
である
詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2019b で導入R2021a: forward
は dlarray
オブジェクトとして状態値を返す
dlnetwork
オブジェクトの場合、関数 forward
によって返される出力引数 state
は、ネットワーク内の各層に関する状態パラメーターの名前と値が格納された table になります。
R2021a 以降、状態値は dlarray
オブジェクトになっています。この変更によって、AcceleratedFunction
オブジェクトを使用する際のサポートが強化されています。頻繁に変更される入力値 (ネットワークの状態を含む入力など) をもつ深層学習関数を高速化するには、頻繁に変更される値を dlarray
オブジェクトとして指定しなければなりません。
以前のバージョンでは、状態値が数値配列になっています。
多くの場合、コードを更新する必要はありません。状態値を数値配列にする必要があるコードの場合、以前の動作を再現するには、関数 extractdata
と関数 dlupdate
を併用して状態値からデータを手動で抽出します。
state = dlupdate(@extractdata,net.State);
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)