Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

深層学習ネットワークの学習時の出力のカスタマイズ

この例では、深層学習ニューラル ネットワークの学習中に各反復で実行される出力関数を定義する方法を説明します。trainingOptions の名前と値のペアの引数 'OutputFcn' を使用して出力関数を指定する場合、trainNetwork は、学習の開始前に 1 回、学習の各反復後、学習の終了後に 1 回、これらの関数を呼び出します。出力関数が呼び出されるたびに、trainNetwork は、現在の反復回数、損失、精度などの情報を含む構造体を渡します。出力関数を使用して、進行状況を表示またはプロットするか、学習を停止できます。学習を早期に停止するには、出力関数が true を返すようにします。いずれかの出力関数から true が返されると、学習が終了し、 trainNetwork から最新のネットワークが返されます。

検証セットに対する損失が減少しなくなった場合に学習を停止するには、trainingOptions の名前と値のペアの引数 'ValidationData' および 'ValidationPatience' を使用して、検証データと検証の許容回数をそれぞれ指定します。検証の許容回数は、ネットワークの学習が停止するまでに、検証セットに対する損失が前の最小損失以上になることが許容される回数です。出力関数を使用して他の停止条件を追加できます。この例では、検証データに対する分類精度が改善されなくなった場合に学習を停止する出力関数を作成する方法を示します。出力関数の定義は、このスクリプトの終わりで行います。

5000 個の数字のイメージが格納されている学習データを読み込みます。ネットワークの検証用に 1000 個のイメージを残しておきます。

[XTrain,YTrain] = digitTrain4DArrayData;

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
YValidation = YTrain(idx);
YTrain(idx) = [];

数字のイメージ データを分類するネットワークを構築します。

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

ネットワーク学習のオプションを指定します。学習中に一定の間隔でネットワークを検証するための検証データを指定します。エポックごとに 1 回ネットワークが検証されるように、'ValidationFrequency' の値を選択します。

検証セットに対する分類精度が改善されなくなった場合に学習を停止するために、出力関数として stopIfAccuracyNotImproving を指定します。stopIfAccuracyNotImproving の 2 番目の入力引数は、ネットワークの学習が停止するまでに、検証セットに対する精度が前の最大精度以下になることが許容される回数です。学習を行う最大エポック数に、任意の大きな値を選択します。学習は自動的に停止するため、学習は最終エポックに達しません。

miniBatchSize = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',100, ...
    'MiniBatchSize',miniBatchSize, ...
    'VerboseFrequency',validationFrequency, ...
    'ValidationData',{XValidation,YValidation}, ...
    'ValidationFrequency',validationFrequency, ...
    'Plots','training-progress', ...
    'OutputFcn',@(info)stopIfAccuracyNotImproving(info,3));

ネットワークに学習をさせます。検証精度が向上しなくなると、学習は停止します。

net = trainNetwork(XTrain,YTrain,layers,options);
Training on single CPU.
Initializing input data normalization.
|======================================================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Validation  |  Mini-batch  |  Validation  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |   Accuracy   |     Loss     |     Loss     |      Rate       |
|======================================================================================================================|
|       1 |           1 |       00:00:02 |        7.81% |       12.70% |       2.7155 |       2.5169 |          0.0100 |
|       1 |          31 |       00:00:07 |       71.88% |       74.70% |       0.8805 |       0.8124 |          0.0100 |
|       2 |          62 |       00:00:12 |       87.50% |       88.00% |       0.3855 |       0.4426 |          0.0100 |
|       3 |          93 |       00:00:18 |       94.53% |       94.00% |       0.2198 |       0.2544 |          0.0100 |
|       4 |         124 |       00:00:23 |       96.09% |       96.40% |       0.1454 |       0.1754 |          0.0100 |
|       5 |         155 |       00:00:33 |       98.44% |       97.70% |       0.0982 |       0.1298 |          0.0100 |
|       6 |         186 |       00:00:42 |       99.22% |       97.90% |       0.0788 |       0.1132 |          0.0100 |
|       7 |         217 |       00:00:49 |      100.00% |       98.00% |       0.0554 |       0.0937 |          0.0100 |
|       8 |         248 |       00:00:53 |      100.00% |       97.90% |       0.0430 |       0.0863 |          0.0100 |
|       9 |         279 |       00:00:58 |      100.00% |       98.10% |       0.0336 |       0.0787 |          0.0100 |
|      10 |         310 |       00:01:01 |      100.00% |       98.40% |       0.0269 |       0.0685 |          0.0100 |
|      11 |         341 |       00:01:06 |      100.00% |       98.40% |       0.0233 |       0.0621 |          0.0100 |
|      12 |         372 |       00:01:09 |      100.00% |       98.70% |       0.0210 |       0.0572 |          0.0100 |
|      13 |         403 |       00:01:14 |      100.00% |       98.80% |       0.0185 |       0.0538 |          0.0100 |
|      14 |         434 |       00:01:18 |      100.00% |       98.90% |       0.0161 |       0.0512 |          0.0100 |
|      15 |         465 |       00:01:23 |      100.00% |       98.80% |       0.0140 |       0.0491 |          0.0100 |
|      16 |         496 |       00:01:27 |      100.00% |       98.70% |       0.0124 |       0.0466 |          0.0100 |
|      17 |         527 |       00:01:33 |      100.00% |       98.90% |       0.0110 |       0.0444 |          0.0100 |
|======================================================================================================================|
Training finished: Stopped by OutputFcn.

Figure Training Progress (27-Jul-2023 15:33:15) contains 2 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 8 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 8 objects of type patch, text, line.

出力関数の定義

連続 N 回のネットワーク検証で検証データに対する最良分類精度が改善されなかった場合にネットワークの学習を停止する出力関数 stopIfAccuracyNotImproving(info,N) を定義します。この条件は、検証損失を使用する組み込み停止条件と似ていますが、ここでは損失ではなく分類精度に適用されます。

function stop = stopIfAccuracyNotImproving(info,N)

stop = false;

% Keep track of the best validation accuracy and the number of validations for which
% there has not been an improvement of the accuracy.
persistent bestValAccuracy
persistent valLag

% Clear the variables when training starts.
if info.State == "start"
    bestValAccuracy = 0;
    valLag = 0;

elseif ~isempty(info.ValidationAccuracy)

    % Compare the current validation accuracy to the best accuracy so far,
    % and either set the best accuracy to the current accuracy, or increase
    % the number of validations for which there has not been an improvement.
    if info.ValidationAccuracy > bestValAccuracy
        valLag = 0;
        bestValAccuracy = info.ValidationAccuracy;
    else
        valLag = valLag + 1;
    end

    % If the validation lag is at least N, that is, the validation accuracy
    % has not improved for at least N validations, then return true and
    % stop training.
    if valLag >= N
        stop = true;
    end

end

end

参考

|

関連するトピック