Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

回帰用の深層学習実験の作成

この例では、実験マネージャーを使用して回帰用の深層学習ネットワークに学習させる方法を説明します。この例では、回帰モデルを使用して手書きの数字の回転角度を予測します。カスタム メトリクス関数によって、真の角度から許容誤差限界内にある予測角度の割合が判定されます。回帰モデルの使用の詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。

実験を開く

まず、例を開きます。実験マネージャーによって、検証と実行が可能な事前構成済みの実験を含むプロジェクトが読み込まれます。実験を開くには、[実験ブラウザー] ペインで、実験の名前 (RegressionExperiment) をダブルクリックします。

組み込みの学習実験は、説明、ハイパーパラメーターのテーブル、セットアップ関数、および実験の結果を評価するためのメトリクス関数の集合で構成されます。詳細については、組み込み学習実験の構成を参照してください。

[説明] フィールドには、実験を説明するテキストが表示されます。この例の説明は次のようになります。

Regression model to predict angles of rotation of digits, using hyperparameters to specify:
* the number of filters used by the convolution layers
* the probability of the dropout layer in the network

[ハイパーパラメーター] セクションでは、実験で使用する手法 (Exhaustive Sweep) とハイパーパラメーター値を指定します。実験を実行すると、実験マネージャーは、ハイパーパラメーター テーブルで指定されたハイパーパラメーター値のすべての組み合わせを使用してネットワークに学習させます。この例では、以下の 2 つのハイパーパラメーターを使用します。

  • Probability は、ニューラル ネットワークのドロップアウト層の確率を設定します。既定では、このハイパーパラメーターの値は [0.1 0.2] として指定されます。

  • Filters は、ニューラル ネットワークの最初の畳み込み層で使用されるフィルターの数を表します。それ以降の畳み込み層では、フィルターの数はこの値の倍数になります。既定では、このハイパーパラメーターの値は [4 6 8] として指定されます。

[セットアップ関数] は、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成します。セットアップ関数への入力は、ハイパーパラメーター テーブルのフィールドをもつ構造体です。このセットアップ関数は、イメージ回帰問題用のネットワークに学習させるために使用する 4 つの出力を返します。このセットアップ関数には 3 つのセクションがあります。

  • 学習データの読み込みでは、実験用の学習データと検証データを 4 次元配列として定義します。学習データセットと検証データセットには、それぞれ 0 ~ 9 の数字から成る 5000 個のイメージが格納されています。回帰値は、数字の回転角度に対応しています。

[XTrain,~,YTrain] = digitTrain4DArrayData;
[XValidation,~,YValidation] = digitTest4DArrayData;
  • ネットワーク アーキテクチャの定義では、回帰用の畳み込みニューラル ネットワークのアーキテクチャを定義します。

inputSize = [28 28 1];
numFilters = params.Filters;
layers = [
    imageInputLayer(inputSize)
    convolution2dLayer(3,numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,2*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,4*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,4*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    dropoutLayer(params.Probability)
    fullyConnectedLayer(1)
    regressionLayer];
  • "学習オプションの指定" では、実験用のtrainingOptionsオブジェクトを定義します。この例では、ネットワークの学習を 30 エポック行います。最初の学習率は 0.001 であり、20 エポック後に 0.1 の係数で学習率を下げます。ソフトウェアは、学習データでネットワークに学習させ、学習中に一定の間隔で検証データに対して平方根平均二乗誤差 (RMSE) と損失を計算します。検証データは、ネットワークの重みの更新には使用されません。

miniBatchSize = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions("sgdm", ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=30, ...
    InitialLearnRate=1e-3, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropFactor=0.1, ...
    LearnRateDropPeriod=20, ...
    Shuffle="every-epoch", ...
    ValidationData={XValidation,YValidation}, ...
    ValidationFrequency=validationFrequency, ...
    Verbose=false);

セットアップ関数を検査するには、[セットアップ関数][編集] をクリックします。MATLAB® エディターでセットアップ関数が開きます。また、セットアップ関数のコードは、この例の最後の付録 1 にあります。

[メトリクス] セクションは、実験結果を評価するオプションの関数を指定します。ネットワークの学習が完了するたびに、実験マネージャーによってこれらの関数が評価されます。メトリクス関数を検査するには、メトリクス関数の名前を選択して [編集] をクリックします。MATLAB エディターでメトリクス関数が開きます。

この例には、真の角度から許容誤差限界内にある予測角度の割合を判定するメトリクス関数 Accuracy が含まれています。既定では、この関数は 10 度のしきい値を使用します。メトリクス関数のコードは、この例の最後の付録 2 にあります。

実験の実行

実験を実行すると、実験マネージャーはセットアップ関数で定義されたネットワークに 6 回学習させます。試行ごとに、ハイパーパラメーター値の異なる組み合わせが使用されます。既定では、実験マネージャーは一度に 1 つの試行を実行します。Parallel Computing Toolbox™ を使用している場合は、複数の試行を同時に実行したり、クラスター内のバッチ ジョブとして実験をオフロードしたりできます。

  • 一度に 1 つの実験を実行するには、実験マネージャー ツールストリップの [モード][Sequential] を選択し、[実行] をクリックします。

  • 複数の試行を同時に実行するには、[モード][Simultaneous] を選択し、[実行] をクリックします。現在の並列プールがない場合、実験マネージャーは既定のクラスター プロファイルを使用して並列プールを起動します。次に、実験マネージャーは、使用可能な並列ワーカーの数に応じて、複数の同時試行を実行します。最良の結果を得るには、実験を実行する前に、GPU と同じ数のワーカーで並列プールを起動します。詳細については、実験マネージャーを使用したネットワークの並列学習リリース別の GPU サポート (Parallel Computing Toolbox)を参照してください。

  • 実験をバッチ ジョブとしてオフロードするには、[モード][Batch Sequential] または [Batch Simultaneous] を選択し、[クラスター][Pool Size] を指定して、[実行] をクリックします。詳細については、Offload Experiments as Batch Jobs to Clusterを参照してください。

結果テーブルに、各試行の RMSE と損失が表示されます。この表には、カスタム メトリクス関数 Accuracy によって判定された試行の精度も表示されます。

実験の実行中に [学習プロット] をクリックすると、学習プロットが表示され、各試行の進行状況を追跡できます。

結果の評価

実験で得られた最良の結果を見つけるには、精度の順に結果テーブルを並べ替えます。

  1. [精度] 列をポイントします。

  2. 三角形のアイコンをクリックします。

  3. [降順に並べ替え] を選択します。

精度の最も高い試行が、結果テーブルの 1 番上に表示されます。

各試行の性能をテストするには、学習済みネットワークをエクスポートし、各数字クラスの残差を表す箱ひげ図を表示します。

  1. 精度が最も高い試行を選択します。

  2. [実験マネージャー] ツールストリップで、[エクスポート][学習済みネットワーク] をクリックします。

  3. ダイアログ ウィンドウで、エクスポートしたネットワークのワークスペース変数の名前を入力します。既定の名前は trainedNetwork です。

  4. エクスポートしたネットワークを関数 plotResiduals (この例の最後の付録 3 に掲載) への入力として使用します。たとえば、MATLAB コマンド ウィンドウで次のように入力します。

plotResiduals(trainedNetwork)

この関数は、各数字の残差の箱ひげ図を作成します。最も精度が高い数字クラスは、平均がゼロに近くなり、分散が小さくなります。

実験結果に関する観測結果を記録するには、注釈を追加します。

  1. 結果テーブルで、最適な結果が得られた試行の [精度] セルを右クリックします。

  2. [注釈の追加] を選択します。

  3. [注釈] ペインで、テキスト ボックスに観測結果を入力します。

詳細については、実験結果の並べ替え、フィルター処理、および注釈追加を参照してください。

実験を閉じる

[実験ブラウザー] ペインでプロジェクトの名前を右クリックし、[プロジェクトを閉じる] を選択します。実験マネージャーによって、プロジェクトに含まれるすべての実験と結果が閉じられます。

付録 1: セットアップ関数

この関数は、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成します。

入力

  • params は、実験マネージャーのハイパーパラメーター テーブルのフィールドをもつ構造体です。

出力

  • XTrain は、学習データを含む 4 次元配列です。

  • YTrain は、学習の回帰値を含む 1 次元配列です。

  • layers は、ニューラル ネットワーク アーキテクチャを定義する層グラフです。

  • optionstrainingOptions オブジェクトです。

function [XTrain,YTrain,layers,options] = RegressionExperiment_setup1(params)

[XTrain,~,YTrain] = digitTrain4DArrayData;
[XValidation,~,YValidation] = digitTest4DArrayData;

inputSize = [28 28 1];
numFilters = params.Filters;

layers = [
    imageInputLayer(inputSize)

    convolution2dLayer(3,numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    averagePooling2dLayer(2,Stride=2)

    convolution2dLayer(3,2*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    averagePooling2dLayer(2,Stride=2)
  
    convolution2dLayer(3,4*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    convolution2dLayer(3,4*numFilters,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    dropoutLayer(params.Probability)
    fullyConnectedLayer(1)
    regressionLayer];

miniBatchSize = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions("sgdm", ...
    MiniBatchSize=miniBatchSize, ...
    MaxEpochs=30, ...
    InitialLearnRate=1e-3, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropFactor=0.1, ...
    LearnRateDropPeriod=20, ...
    Shuffle="every-epoch", ...
    ValidationData={XValidation,YValidation}, ...
    ValidationFrequency=validationFrequency, ...
    Verbose=false);

end

付録 2: 回帰モデルの精度の計算

この関数は、真の角度から許容誤差限界内にある予測の数を計算します。

function metricOutput = Accuracy(trialInfo)

[XValidation,~,YValidation] = digitTest4DArrayData;
YPredicted = predict(trialInfo.trainedNetwork,XValidation);
predictionError = YValidation - YPredicted;

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numValidationImages = numel(YValidation);

metricOutput = 100*numCorrect/numValidationImages;

end

付録 3: 各数字の残差の箱ひげ図

この関数は、各数字の残差の箱ひげ図を作成します。

function plotResiduals(net)

[XValidation,~,YValidation] = digitTest4DArrayData;
YPredicted = predict(net,XValidation);
predictionError = YValidation - YPredicted;
residualMatrix = reshape(predictionError,500,10);

figure
boxplot(residualMatrix,...
    "Labels",["0","1","2","3","4","5","6","7","8","9"])
xlabel("Digit Class")
ylabel("Degrees Error")
title("Residuals")

end

参考

アプリ

関数

関連するトピック