ドキュメンテーション

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

カスタム重み付き分類層の定義

ヒント

k 個の互いに排他的なクラスの交差エントロピー損失を含む分類出力層を構築するには、classificationLayer を使用します。分類問題に別の損失関数を使用する場合は、この例を指針として使用してカスタム分類出力層を定義できます。

この例では、重み付き交差エントロピー損失を含むカスタム重み付き分類出力層を定義し作成する方法を説明します。クラスの分布が不均衡な分類問題用の重み付き分類層を使用します。ネットワークで重み付き分類層を使用する方法を示す例については、深層学習を使用した音声コマンド認識を参照してください。

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

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

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

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

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

  5. 逆方向損失関数の作成 – 予測についての損失の微分を指定します。

重み付き分類層は、分類問題の重み付き交差エントロピー損失を計算します。 重み付き交差エントロピーは、2 つの連続確率変数間の誤差測定です。予測スコア Y と学習ターゲット T について、Y と T の間の重み付き交差エントロピー損失は次で与えられます。

L=1Nn=1Ni=1KwiTnilog(Yni),

ここで、N は観測値の数、K はクラスの数、w は各クラスの重みのベクトルです。

分類出力層テンプレート

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

classdef myClassificationLayer < nnet.layer.ClassificationLayer
        
    properties
        % (Optional) Layer properties.

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

            % 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)
            % 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

層の命名

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

classdef weightedClassificationLayer < nnet.layer.ClassificationLayer
    ...
end

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

    methods
        function layer = weightedClassificationLayer()           
            ...
        end

        ...
     end

層の保存

層のクラス ファイルを weightedClassificationLayer.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 セクションでプロパティ ClassWeights を指定します。

    properties
        % Vector of weights corresponding to the classes in the training
        % data
        ClassWeights
    end

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

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

ClassWeights プロパティに割り当てる入力引数 classWeights を指定します。作成時に Name プロパティに割り当てるオプションの入力引数 name も指定します。関数の構文を説明するコメントを関数の上部に追加します。

        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name.

            ...
        end

層のプロパティの初期化

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

層の Description プロパティを設定して、層に 1 行の説明を指定します。Name プロパティにオプションの入力引数 name を設定します。

        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name. 

            % Set class weights
            layer.ClassWeights = classWeights;

            % Set layer name
            if nargin == 2
                layer.Name = name;
            end

            % Set layer description
            layer.Description = 'Weighted cross entropy';
        end

順方向損失関数の作成

ネットワークで行った予測と学習ターゲットの間の重み付き交差エントロピー損失を返す、forwardLoss という名前の関数を作成します。forwardLoss の構文は loss = forwardLoss(layer, Y, T) です。ここで、Y は前の層の出力であり、T は学習ターゲットを表します。

分類問題の場合、T の次元は問題のタイプによって異なります。

分類タスク層入力の次元
イメージ分類サイズ 1 x 1 x K x N の 4 次元配列。K はクラスの数、N はミニバッチ サイズです。
sequence-to-label 分類サイズ K 行 N 列の行列。K はクラスの数、N はミニバッチ サイズです。
sequence-to-sequence 分類サイズ K x N x S の 3 次元配列。K はクラスの数、N はミニバッチ サイズ、S はシーケンス長です。

Y のサイズは前の層の出力によって異なります。YT と同じサイズになるように、正しいサイズを出力する層を出力層の前に含めなければなりません。たとえば、Y を必ず K 個のクラスの予測スコアを持つ 4 次元配列にするために、サイズが K の全結合層を含め、その後にソフトマックス層、出力層の順に配置することができます。

重み付き分類層は、分類問題の重み付き交差エントロピー損失を計算します。 重み付き交差エントロピーは、2 つの連続確率変数間の誤差測定です。予測スコア Y と学習ターゲット T について、Y と T の間の重み付き交差エントロピー損失は次で与えられます。

L=1Nn=1Ni=1KwiTnilog(Yni),

ここで、N は観測値の数、K はクラスの数、w は各クラスの重みのベクトルです。

入力 Y および T は、この方程式の Y および T にそれぞれ対応しています。出力 loss は L に対応します。関数の構文を説明するコメントを関数の上部に追加します。

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

            N = size(Y,4);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
    
            loss = -sum(W*(T.*log(Y)))/N;
        end

逆方向損失関数の作成

逆方向損失関数を作成します。

予測 Y についての重み付き交差エントロピー損失の微分を返す、backwardLoss という名前の関数を作成します。backwardLoss の構文は loss = backwardLoss(layer, Y, T) です。ここで、Y は前の層の出力であり、T は学習ターゲットを表します。

YT の次元は forwardLoss の入力と同じです。

予測 Y についての重み付き交差エントロピー損失の微分は次で与えられます。

δLδYi=1NwiTiYi,

ここで、N は観測値の数、w は各クラスの重みのベクトルです。関数の構文を説明するコメントを関数の上部に追加します。

        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the weighted cross entropy loss with respect to the
            % predictions Y.

            [~,~,K,N] = size(Y);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
			
            dLdY = -(W'.*T./Y)/N;
            dLdY = reshape(dLdY,[1 1 K N]);
        end

完成した層

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

classdef weightedClassificationLayer < nnet.layer.ClassificationLayer
               
    properties
        % Vector of weights corresponding to the classes in the training
        % data
        ClassWeights
    end

    methods
        function layer = weightedClassificationLayer(classWeights, name)
            % layer = weightedClassificationLayer(classWeights) creates a
            % weighted cross entropy loss layer. classWeights is a row
            % vector of weights corresponding to the classes in the order
            % that they appear in the training data.
            % 
            % layer = weightedClassificationLayer(classWeights, name)
            % additionally specifies the layer name. 

            % Set class weights
            layer.ClassWeights = classWeights;

            % Set layer name
            if nargin == 2
                layer.Name = name;
            end

            % Set layer description
            layer.Description = 'Weighted cross entropy';
        end
        
        function loss = forwardLoss(layer, Y, T)
            % loss = forwardLoss(layer, Y, T) returns the weighted cross
            % entropy loss between the predictions Y and the training
            % targets T.

            N = size(Y,4);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
    
            loss = -sum(W*(T.*log(Y)))/N;
        end
        
        function dLdY = backwardLoss(layer, Y, T)
            % dLdY = backwardLoss(layer, Y, T) returns the derivatives of
            % the weighted cross entropy loss with respect to the
            % predictions Y.

            [~,~,K,N] = size(Y);
            Y = squeeze(Y);
            T = squeeze(T);
            W = layer.ClassWeights;
			
            dLdY = -(W'.*T./Y)/N;
            dLdY = reshape(dLdY,[1 1 K N]);
        end
    end
end

GPU 互換性

GPU 互換性のために、層関数は gpuArray 型の入力をサポートし、この型の出力を返さなければなりません。層が使用する他の関数も同じ動作をしなければなりません。多くの MATLAB 組み込み関数が gpuArray 入力引数をサポートしています。これらの関数のいずれかを、1 つ以上の gpuArray 入力を指定して呼び出した場合、その関数は GPU で実行され、gpuArray 出力を返します。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU も必要です。 MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。

weightedClassificationLayerforwardLoss および backwardLoss で使用する MATLAB 関数はすべて、gpuArray 入力をサポートしているため、層は GPU 互換です。

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

カスタム分類出力層 weightedClassificationLayer の有効性をチェックします。

カスタム重み付き分類層を定義します。この層を作成するには、ファイル weightedClassificationLayer.m を現在のフォルダーに保存します。

層のインスタンスを作成します。クラスの重みは、3 つのクラスに対応する 3 つの要素を持つベクトルとして指定します。

classWeights = [0.1 0.7 0.2];
layer = weightedClassificationLayer(classWeights);

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

numClasses = numel(classWeights);
validInputSize = [1 1 numClasses];
checkLayer(layer,validInputSize,'ObservationDimension',4);
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.OutputLayerTestCase
.......... ...
Done nnet.checklayer.OutputLayerTestCase
__________

Test Summary:
	 13 Passed, 0 Failed, 0 Incomplete, 4 Skipped.
	 Time elapsed: 0.21924 seconds.

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

参考

| |

関連するトピック