回帰用の深層学習実験の作成
この例では、実験マネージャーを使用して回帰用の深層学習ネットワークに学習させる方法を示します。この例では、回帰モデルを使用して手書きの数字の回転角度を予測します。カスタム メトリクス関数は、真の角度から許容誤差限界内にある角度予測の割合を判定します。回帰モデルの使用に関する詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。
実験を開く
まず、例を開きます。実験マネージャーによって、事前構成済みの実験を含むプロジェクトが読み込まれます。これを検査したり実行したりできます。実験を開くには、[実験ブラウザー] ペインで [RegressionExperiment] をダブルクリックします。
組み込みの学習実験は、説明、ハイパーパラメーターのテーブル、セットアップ関数、および実験の結果を評価するためのメトリクス関数の集合で構成されます。詳細については、trainnet を使用したネットワークの学習、およびカスタム メトリクスの表示を参照してください。
[説明] フィールドには、実験を説明するテキストが表示されます。この例の説明は次のようになります。
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
[ハイパーパラメーター] セクションでは、実験で使用する手法とハイパーパラメーター値を指定します。実験を実行すると、実験マネージャーは、ハイパーパラメーター テーブルで指定されたハイパーパラメーター値のすべての組み合わせを使用してネットワークに学習させます。この例では、以下の 2 つのハイパーパラメーターを使用します。
Probability
は、ニューラル ネットワーク内のドロップアウト層の確率を設定します。既定では、このハイパーパラメーターの値は[0.1 0.2]
として指定されます。Filters
は、ニューラル ネットワークの最初の畳み込み層で使用されるフィルターの数を示します。後続の畳み込み層では、フィルターの数はこの値の倍数になります。既定では、このハイパーパラメーターの値は[4 6 8]
として指定されます。
[セットアップ関数] セクションでは、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成する関数を指定します。この関数を MATLAB® エディターで開くには、[編集] をクリックします。この関数のコードは、セットアップ関数にも示されています。セットアップ関数への入力は、ハイパーパラメーター テーブルのフィールドをもつ構造体です。関数は、イメージ回帰問題用のネットワークに学習させるために使用する 4 つの出力を返します。この例のセットアップ関数には、以下のセクションが含まれています。
「学習データの読み込み」では、実験の学習データと検証データを 4 次元配列として定義します。学習データ セットと検証データ セットには、それぞれ 0 から 9 までの数字のイメージが 5,000 枚含まれています。回帰の値は数字の回転角度に対応します。
[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 エポックごとに 10 分の 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);
[メトリクス] セクションでは、実験の結果を評価するオプションの機能を指定します。実験マネージャーは、ネットワークの学習が終了するたびにこれらの関数を評価します。この例には、真の角度から許容誤差限界内にある角度予測の割合を判定するメトリクス関数 Accuracy
が含まれています。既定では、この関数は 10 度のしきい値を使用します。この関数を MATLAB エディターで開くには、メトリクス関数の名前を選択して [編集] をクリックします。この関数のコードは、回帰モデルの精度の計算にも示されています。
実験の実行
実験を実行すると、実験マネージャーはセットアップ関数で定義されたネットワークに 6 回学習させます。試行ごとに、ハイパーパラメーター値の異なる組み合わせが使用されます。既定では、実験マネージャーは一度に 1 つの試行を実行します。Parallel Computing Toolbox™ を使用している場合は、複数の試行を同時に実行したり、クラスター内のバッチ ジョブとして実験をオフロードしたりできます。
実験を一度に 1 つずつ実行するには、[実験マネージャー] ツールストリップで [モード] を
[Sequential]
に設定し、[実行] をクリックします。複数の試行を同時に実行するには、[モード] を
[Simultaneous]
に設定し、[実行] をクリックします。現在の並列プールがない場合、実験マネージャーは既定のクラスター プロファイルを使用して並列プールを起動します。その後、実験マネージャーは並列プールにあるワーカーと同じ数の同時試行を実行します。最良の結果を得るには、実験を実行する前に、GPU と同じ数のワーカーで並列プールを起動します。詳細については、Run Experiments in ParallelおよびGPU 計算の要件 (Parallel Computing Toolbox)を参照してください。実験をバッチ ジョブとしてオフロードするには、[モード] を
[Batch Sequential]
または[Batch Simultaneous]
に設定し、クラスターとプールのサイズを指定して、[実行] をクリックします。詳細については、Offload Experiments as Batch Jobs to a Clusterを参照してください。
結果テーブルに、各試行の RMSE と損失が表示されます。このテーブルには、カスタム メトリクス関数 Accuracy
によって判定された試行の精度も表示されます。
実験の実行中に学習プロットを表示して各試行の進行状況を追跡するには、[結果の確認] で [学習プロット] をクリックします。
結果の評価
実験で得られた最良の結果を見つけるには、結果テーブルを精度の順に並べ替えます。
[精度] 列をポイントします。
三角形のアイコンをクリックします。
[降順に並べ替え] を選択します。
精度の最も高い試行が、結果テーブルの一番上に表示されます。
個々の試行のパフォーマンスをテストするには、学習済みネットワークをエクスポートし、各数字クラスの残差の箱ひげ図を表示します。
精度の最も高い試行を選択します。
実験マネージャーのツールストリップで、[エクスポート]、[学習済みネットワーク] をクリックします。
ダイアログ ウィンドウで、エクスポートされたネットワークのワークスペース変数の名前を入力します。既定の名前は
trainedNetwork
です。MATLAB コマンド ウィンドウで、エクスポートされたネットワークを関数
plotResiduals
への入力として使用します。
plotResiduals(trainedNetwork)
この関数のコードを表示するには、各数字の残差の箱ひげ図の表示を参照してください。この関数は、各数字の残差の箱ひげ図を作成します。精度の最も高い数字クラスは、平均がゼロに近く、分散がほとんどありません。
実験結果に関する観測結果を記録するには、注釈を追加します。
結果テーブルで、最適な結果が得られた試行の [精度] セルを右クリックします。
[注釈の追加] を選択します。
[注釈] ペインで、テキスト ボックスに観測結果を入力します。
実験を閉じる
[実験ブラウザー] ペインで [DigitRegressionWithAccuracyProject] を右クリックし、[プロジェクトを閉じる] を選択します。実験マネージャーによって、プロジェクトに含まれる実験と結果が閉じられます。
セットアップ関数
この関数は、実験用の学習データ、ネットワーク アーキテクチャ、および学習オプションを構成します。この関数への入力は、ハイパーパラメーター テーブルのフィールドをもつ構造体です。関数は、イメージ回帰問題用のネットワークに学習させるために使用する 4 つの出力を返します。
function [XTrain,YTrain,layers,options] = RegressionExperiment_setup(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
回帰モデルの精度の計算
このメトリクス関数は、真の角度から許容誤差限界内にある予測の数を計算します。
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
各数字の残差の箱ひげ図の表示
この関数は、各数字の残差の箱ひげ図を作成します。
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