最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

カスタム回帰出力層の定義

ヒント

平均二乗誤差損失を含む回帰出力層を作成するには、regressionLayer を使用します。回帰問題に別の損失関数を使用する場合は、この例を指針として使用してカスタム回帰出力層を定義できます。

この例では、平均絶対誤差 (MAE) 損失を含むカスタム回帰出力層を作成する方法を説明します。

カスタム回帰出力層を定義するために、この例で提供するテンプレートを使用できます。この例では、次のステップで説明を進めます。

  1. 層の命名 – MATLAB® で使用できるように層に名前を付けます。

  2. 層のプロパティの宣言 – 層のプロパティを指定します。

  3. コンストラクター関数の作成 (オプション) – 層の構築とそのプロパティ初期化の方法を指定します。コンストラクター関数を指定しない場合、プロパティは作成時に '' で初期化されます。

  4. 順方向損失関数の作成 – 予測と学習ターゲットの間の損失を指定します。

  5. 逆方向損失関数の作成 (オプション) – 予測についての損失の微分を指定します。逆方向損失関数を指定しない場合、順方向損失関数は dlarray オブジェクトをサポートしなければなりません。

回帰 MAE 層は、回帰問題の平均絶対誤差損失を計算します。MAE 損失は、2 つの連続確率変数間の誤差測定です。予測 Y と学習ターゲット T について、Y と T の間の MAE 損失は次で与えられます。

L=1Nn=1N(1Ri=1R|YniTni|),

ここで、N は観測値の数、R は応答の数です。

回帰出力層テンプレート

回帰出力層のテンプレートを MATLAB の新しいファイルにコピーします。このテンプレートは、回帰出力層の構造の概要を示しており、層の動作を定義する関数が含まれます。

classdef myRegressionLayer < nnet.layer.RegressionLayer
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myRegressionLayer()           
            % (Optional) Create a myRegressionLayer.

            % Layer constructor function goes here.
        end

        function loss = forwardLoss(layer, Y, T)
            % Return the loss between the predictions Y and the training
            % targets T.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         loss  - Loss between Y and T

            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer, Y, T)
            % (Optional) Backward propagate the derivative of the loss 
            % function.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         dLdY  - Derivative of the loss with respect to the 
            %                 predictions Y        

            % Layer backward loss function goes here.
        end
    end
end

層の命名

まず、層に名前を付けます。クラス ファイルの最初の行で、既存の名前 myRegressionLayermaeRegressionLayer に置き換えます。

classdef maeRegressionLayer < nnet.layer.RegressionLayer
    ...
end

次に、コンストラクター関数 myRegressionLayer (methods セクションの最初の関数) の名前を層と同じ名前に変更します。

    methods
        function layer = maeRegressionLayer()           
            ...
        end

        ...
     end

層の保存

層のクラス ファイルを maeRegressionLayer.m という名前の新しいファイルに保存します。このファイル名は層の名前に一致しなければなりません。この層を使用するには、このファイルを現在のフォルダーまたは MATLAB パス上のフォルダーに保存しなければなりません。

層のプロパティの宣言

層のプロパティを properties セクションで宣言します。

既定では、カスタム出力層には次のプロパティがあります。

  • Name層の名前。文字ベクトルまたは string スカラーとして指定します。層グラフに層を含めるには、空ではない一意の層の名前を指定しなければなりません。この層が含まれる系列ネットワークに学習させて Name'' に設定すると、学習時に層に名前が自動的に割り当てられます。

  • Description – 層についての 1 行の説明。文字ベクトルまたは string スカラーとして指定します。この説明は、層が Layer 配列に表示されるときに表示されます。層の説明を指定しない場合、"Classification Output" または "Regression Output" が表示されます。

  • Type – 層のタイプ。文字ベクトルまたは string スカラーとして指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。層のタイプを指定しない場合、層のクラス名が表示されます。

カスタム分類層には次のプロパティもあります。

  • Classes出力層のクラス。categorical ベクトル、string 配列、文字ベクトルの cell 配列、または 'auto' として指定します。Classes'auto' の場合、学習時にクラスが自動的に設定されます。string 配列または文字ベクトルの cell 配列 str を指定すると、出力層のクラスが categorical(str,str) に設定されます。既定値は 'auto' です。

カスタム回帰層には次のプロパティもあります。

  • ResponseNames応答の名前。文字ベクトルの cell 配列または string 配列として指定します。学習時に、学習データに従って応答名が自動的に設定されます。既定値は {} です。

層にその他のプロパティがない場合は、properties セクションを省略できます。

この層には追加のプロパティが必要ないため、properties セクションは削除できます。

コンストラクター関数の作成

層を構築する関数を作成し、層のプロパティを初期化します。層を作成するために必要な変数をコンストラクター関数への入力として指定します。

作成時に Name プロパティを初期化するには、入力引数 name を指定します。関数の構文を説明するコメントを関数の上部に追加します。

        function layer = maeRegressionLayer(name)
            % layer = maeRegressionLayer(name) creates a
            % mean-absolute-error regression layer and specifies the layer
            % name.

            ...
        end

層のプロパティの初期化

コメント % Layer constructor function goes here を、層のプロパティを初期化するコードに置き換えます。

層の Description プロパティを設定して、層に 1 行の説明を指定します。Name プロパティを入力引数 name に設定します。層のタイプとサイズの説明を設定します。

        function layer = maeRegressionLayer(name)
            % layer = maeRegressionLayer(name) creates a
            % mean-absolute-error regression layer and specifies the layer
            % name.
			
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Mean absolute error';
        end

順方向損失関数の作成

ネットワークで行った予測と学習ターゲットの間の MAE 損失を返す、forwardLoss という名前の関数を作成します。forwardLoss の構文は loss = forwardLoss(layer, Y, T) です。ここで、Y は前の層の出力であり、T は学習ターゲットを含んでいます。

回帰問題の場合、T の次元も問題のタイプによって異なります。

回帰タスク入力サイズ観察値の次元
2 次元イメージ回帰1 x 1 x R x N。ここで、R は応答の数、N は観測値の数です。4
2 次元 image-to-image 回帰h x w x c x N。ここで、h、w、および c は、それぞれ出力の高さ、幅、およびチャネル数、N は観測値の数です。4
3 次元イメージ回帰1 x 1 x 1 x R x N。ここで、R は応答の数、N は観測値の数です。5
3 次元 image-to-image 回帰h x w x d x c x N。ここで、h、w、d、および c は、それぞれ出力の高さ、幅、深さ、およびチャネル数、N は観測値の数です。5
sequence-to-one 回帰R 行 N 列。ここで、R は応答の数、N は観測値の数です。2
sequence-to-sequence 回帰R x N x S。ここで、R は応答の数、N は観測値の数、S はシーケンス長です。2

たとえば、ネットワークで応答が 1 つのイメージ回帰ネットワークを定義していてミニバッチのサイズが 50 の場合、T はサイズ 1 x 1 x 1 x 50 の 4 次元配列です。

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、R 個の応答があるイメージ回帰の場合、Y を必ず正しいサイズの 4 次元配列にするために、出力層の前にサイズが R の全結合層を含めることができます。

回帰 MAE 層は、回帰問題の平均絶対誤差損失を計算します。MAE 損失は、2 つの連続確率変数間の誤差測定です。予測 Y と学習ターゲット T について、Y と T の間の MAE 損失は次で与えられます。

L=1Nn=1N(1Ri=1R|YniTni|),

ここで、N は観測値の数、R は応答の数です。

入力 Y および T は、この方程式の Y および T にそれぞれ対応しています。出力 loss は L に対応します。loss が必ずスカラーになるように、ミニバッチに対する平均損失を出力します。関数の構文を説明するコメントを関数の上部に追加します。

        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the MAE loss between
            % the predictions Y and the training targets T.

            % Calculate MAE.
            R = size(Y,3);
            meanAbsoluteError = sum(abs(Y-T),3)/R;
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(meanAbsoluteError)/N;
        end

関数 forwardLossdlarray オブジェクトをサポートする関数のみを使用するため、関数 backwardLoss の定義はオプションです。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

完成した層

完成した回帰出力層のクラス ファイルを表示します。

classdef maeRegressionLayer < nnet.layer.RegressionLayer
    % Example custom regression layer with mean-absolute-error loss.
    
    methods
        function layer = maeRegressionLayer(name)
            % layer = maeRegressionLayer(name) creates a
            % mean-absolute-error regression layer and specifies the layer
            % name.
			
            % Set layer name.
            layer.Name = name;

            % Set layer description.
            layer.Description = 'Mean absolute error';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the MAE loss between
            % the predictions Y and the training targets T.

            % Calculate MAE.
            R = size(Y,3);
            meanAbsoluteError = sum(abs(Y-T),3)/R;
    
            % Take mean over mini-batch.
            N = size(Y,4);
            loss = sum(meanAbsoluteError)/N;
        end
    end
end

GPU 互換性

層の順方向関数が dlarray オブジェクトを完全にサポートしている場合、層は GPU 互換です。そうでない場合、GPU 互換にするには、層関数が入力をサポートし、gpuArray 型の出力を返さなければなりません。

多くの MATLAB 組み込み関数が入力引数 gpuArray および dlarray をサポートしています。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU も必要です。MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。

maeRegressionLayerforwardLoss で使用する MATLAB 関数はすべて、dlarray オブジェクトをサポートしているため、層は GPU 互換です。

出力層の有効性のチェック

カスタム分類出力層 maeRegressionLayer について層の有効性をチェックします。

カスタム平均絶対誤差回帰層を定義します。この層を作成するには、ファイル maeRegressionLayer.m を現在のフォルダーに保存します。層のインスタンスを作成します。

layer = maeRegressionLayer('mae');

checkLayer を使用して層が有効であることをチェックします。層への典型的な入力における 1 つの観測値のサイズになるように有効な入力サイズを指定します。層には 1 x 1 x R x N の配列を入力する必要があります。R は応答の数、N はミニバッチ内の観測値の数です。

validInputSize = [1 1 10];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Running nnet.checklayer.TestOutputLayerWithoutBackward
..........
Done nnet.checklayer.TestOutputLayerWithoutBackward
__________

Test Summary:
	 10 Passed, 0 Failed, 0 Incomplete, 0 Skipped.
	 Time elapsed: 0.088094 seconds.

テストの概要では、パスしたテスト、失敗したテスト、不完全なテスト、およびスキップされたテストの数が報告されます。

ネットワークにカスタム回帰出力層を含める

Deep Learning Toolbox では、カスタム出力層を他の出力層と同じように使用できます。この節では、前に作成したカスタム出力層を使用した回帰用ネットワークを作成し、学習させる方法を説明します。

この例では、畳み込みニューラル ネットワーク アーキテクチャを構築し、ネットワークの学習を行い、学習済みネットワークを使用して手書きの数字の回転角度を予測します。このような予測は、光学式文字認識に役立ちます。

例の学習データを読み込みます。

[XTrain,~,YTrain] = digitTrain4DArrayData;

回帰出力層 maeRegressionLayer を含む層配列を作成します。

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(1)
    maeRegressionLayer('mae')]
layers = 
  6x1 Layer array with layers:

     1   ''      Image Input           28x28x1 images with 'zerocenter' normalization
     2   ''      Convolution           20 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''      Batch Normalization   Batch normalization
     4   ''      ReLU                  ReLU
     5   ''      Fully Connected       1 fully connected layer
     6   'mae'   Regression Output     Mean absolute error

学習オプションを設定し、ネットワークに学習させます。

options = trainingOptions('sgdm');
net = trainNetwork(XTrain,YTrain,layers,options);
Training on single CPU.
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |     RMSE     |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |        28.28 |         25.1 |          0.0100 |
|       2 |          50 |       00:00:05 |        14.27 |         11.3 |          0.0100 |
|       3 |         100 |       00:00:09 |        14.30 |         11.5 |          0.0100 |
|       4 |         150 |       00:00:13 |        10.07 |          7.7 |          0.0100 |
|       6 |         200 |       00:00:17 |         9.81 |          7.5 |          0.0100 |
|       7 |         250 |       00:00:21 |        10.20 |          7.5 |          0.0100 |
|       8 |         300 |       00:00:25 |         9.57 |          7.2 |          0.0100 |
|       9 |         350 |       00:00:29 |         8.61 |          6.5 |          0.0100 |
|      11 |         400 |       00:00:33 |         9.45 |          6.8 |          0.0100 |
|      12 |         450 |       00:00:37 |         8.26 |          6.0 |          0.0100 |
|      13 |         500 |       00:00:41 |         9.51 |          6.1 |          0.0100 |
|      15 |         550 |       00:00:45 |        10.00 |          7.7 |          0.0100 |
|      16 |         600 |       00:00:49 |         8.60 |          6.1 |          0.0100 |
|      17 |         650 |       00:00:53 |         7.18 |          5.4 |          0.0100 |
|      18 |         700 |       00:00:56 |         8.89 |          6.3 |          0.0100 |
|      20 |         750 |       00:01:00 |         7.76 |          5.9 |          0.0100 |
|      21 |         800 |       00:01:04 |         8.07 |          6.0 |          0.0100 |
|      22 |         850 |       00:01:07 |         7.38 |          5.6 |          0.0100 |
|      24 |         900 |       00:01:10 |         7.51 |          5.5 |          0.0100 |
|      25 |         950 |       00:01:14 |         6.88 |          4.9 |          0.0100 |
|      26 |        1000 |       00:01:17 |         6.83 |          4.7 |          0.0100 |
|      27 |        1050 |       00:01:23 |         6.70 |          4.8 |          0.0100 |
|      29 |        1100 |       00:01:28 |         6.57 |          4.8 |          0.0100 |
|      30 |        1150 |       00:01:33 |         6.87 |          4.9 |          0.0100 |
|      30 |        1170 |       00:01:35 |         7.75 |          6.2 |          0.0100 |
|========================================================================================|

回転角度の予測値と実際の値との間の予測誤差を計算することによって、ネットワーク性能を評価します。

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);
predictionError = YTest - YPred;

真の角度から許容誤差限界内にある予測の数を計算します。しきい値を 10 度に設定し、このしきい値の範囲内にある予測の比率を計算します。

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numTestImages = size(XTest,4);
accuracy = numCorrect/numTestImages
accuracy = 0.7524

参考

| |

関連するトピック