ドキュメンテーション

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

カスタム層の有効性のチェック

カスタム深層学習層を作成する場合、関数 checkLayer を使用して、層が有効であることをチェックできます。この関数は、層について有効性、GPU 互換性、勾配定義の正しさをチェックします。層が有効であることをチェックするには、次のコマンドを実行します。

checkLayer(layer,validInputSize,'ObservationDimension',dim)
ここで、layer は層のインスタンス、validInputSize は層に有効な入力サイズを指定するベクトルまたは cell 配列であり、dim は層の入力データにおける観測値の次元を指定します。入力サイズが大きい場合、勾配チェックの実行に時間がかかります。テストを高速化するには、指定する有効な入力サイズを小さくします。

層の有効性のチェック

例のカスタム層 preluLayer の有効性をチェックします。

カスタム PReLU 層を定義します。この層を作成するには、ファイル preluLayer.m を現在のフォルダーに保存します。

層のインスタンスを作成し、checkLayer を使用して、それが有効であることをチェックします。有効な入力サイズを、層への 1 つの観測値入力の典型的なサイズに設定します。単一入力の場合、層にはサイズ h x w x c の観測値が必要です。hw、および c は、それぞれ前の層の出力の高さ、幅、およびチャネル数です。

validInputSize を入力配列の典型的なサイズとして指定します。

layer = preluLayer(20,'prelu');
validInputSize = [5 5 20];
checkLayer(layer,validInputSize)
Skipping multi-observation tests. To enable tests with multiple observations, specify the 'ObservationDimension' option in checkLayer.
For 2-D image data, set 'ObservationDimension' to 4.
For 3-D image data, set 'ObservationDimension' to 5.
For sequence data, set 'ObservationDimension' to 2.
 
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.TestCase
.......... ...
Done nnet.checklayer.TestCase
__________

Test Summary:
	 13 Passed, 0 Failed, 0 Incomplete, 11 Skipped.
	 Time elapsed: 3.5903 seconds.

この結果は、パスしたテスト、失敗したテスト、およびスキップされたテストの数を示しています。'ObservationsDimension' オプションを指定しない場合、または GPU がない場合、この関数は対応するテストをスキップします。

複数の観測値のチェック

複数観測値入力の場合、層にはサイズ h x w x c x N の観測値の配列が必要です。hw、および c は、それぞれ高さ、幅、およびチャネル数、N は観測値の数です。

複数の観測値について層の有効性をチェックするには、観測値の典型的なサイズを指定し、'ObservationDimension' を 4 に設定します。

layer = preluLayer(20,'prelu');
validInputSize = [5 5 20];
checkLayer(layer,validInputSize,'ObservationDimension',4)
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.TestCase
.......... ........
Done nnet.checklayer.TestCase
__________

Test Summary:
	 18 Passed, 0 Failed, 0 Incomplete, 6 Skipped.
	 Time elapsed: 3.3846 seconds.

この場合、関数で層に関する問題はまったく検出されていません。

テストの一覧

関数 checkLayer は、一連のテストを実行して、カスタム層の有効性をチェックします。

中間層

関数 checkLayer は、以下のテストを使用してカスタム中間層 (タイプ nnet.layer.Layer の層) の有効性をチェックします。

テスト説明
methodSignaturesAreCorrect層関数の構文が正しく定義されています。
predictDoesNotErrorpredict でエラーが発生しません。
forwardDoesNotError

forward でエラーが発生しません。

forwardPredictAreConsistentInSize

forward および predict が同じサイズの値を出力します。

backwardDoesNotErrorbackward でエラーが発生しません。
backwardIsConsistentInSize

backward の出力のサイズが整合しています。

  • 各入力についての微分が、対応する入力と同じサイズです。

  • それぞれの学習可能なパラメーターについての微分が、対応する学習可能なパラメーターと同じサイズです。

predictIsConsistentInType

predict の出力の型は、入力と整合性があります。

forwardIsConsistentInType

forward の出力の型は、入力と整合性があります。

backwardIsConsistentInType

backward の出力の型は、入力と整合性があります。

gradientsAreNumericallyCorrectbackward で計算された勾配が数値勾配と整合します。

テスト predictIsConsistentInTypeforwardIsConsistentInType、および backwardIsConsistentInType は、GPU 互換性もチェックします。層関数を GPU で実行するには、これらの関数が、基となるデータ型が single である gpuArray 型の入力と出力をサポートしていなければなりません。

forward を実装していない場合、checkLayerforwardDoesNotErrorforwardPredictAreConsistentInSize、および forwardIsConsistentInType テストを実行しません。

出力層

関数 checkLayer は、以下のテストを使用してカスタム出力層 (タイプ nnet.layer.ClassificationLayer または nnet.layer.RegressionLayer の層) の有効性をチェックします。

テスト説明
forwardLossDoesNotErrorforwardLoss でエラーが発生しません。
backwardLossDoesNotErrorbackwardLoss でエラーが発生しません。
forwardLossIsScalarforwardLoss の出力がスカラーです。
backwardLossIsConsistentInSizebackwardLoss の出力がサイズにおいて次に整合します。dLdY は予測 Y と同じサイズです。
forwardLossIsConsistentInType

forwardLoss の出力が型において次に整合します。loss は予測 Y と同じ型です。

backwardLossIsConsistentInType

backwardLoss の出力が型において次に整合します。dLdY は予測 Y と同じ型でなければなりません。

gradientsAreNumericallyCorrectbackwardLoss で計算された勾配が数値的に正しいものです。

forwardLossIsConsistentInType および backwardLossIsConsistentInType テストは、GPU 互換性もチェックします。層関数を GPU で実行するには、これらの関数が、基となるデータ型が single である gpuArray 型の入力と出力をサポートしていなければなりません。

生成されたデータ

層の有効性をチェックするために、関数 checkLayer は、層のタイプに応じてデータを生成します。

層のタイプ生成されるデータの説明
中間[-1,1] の範囲の値
回帰出力[-1,1] の範囲の値を持つ予測とターゲット
分類出力

[0,1] の範囲の値を持つ予測。

'ObservationDimension' オプションを指定した場合、ターゲットは one-hot 符号化されたベクトル (1 を 1 つ含み、それ以外は 0 のベクトル) です。

'ObservationDimension' オプションを指定しない場合、ターゲットは [0,1] の範囲の値です。

複数の観測値についてチェックするには、名前と値のペア 'ObservationDimension' を使用して観測値の次元を指定します。観測値の次元を指定した場合、関数 checkLayer は、サイズ 1 および 2 のミニバッチで生成されたデータを使用して、層関数が有効であることをチェックします。この名前と値のペアを指定しない場合、関数は、複数の観測値について層関数が有効であることをチェックするテストをスキップします。

診断

checkLayer を使用してテストに失敗した場合、この関数はテスト診断とフレームワーク診断を表示します。テスト診断は、層で見つかった問題を示します。フレームワーク診断は、より詳細な情報を提供します。

関数の構文

テスト methodSignaturesAreCorrect は、層関数の構文が正しく定義されているかをチェックします。

テスト診断説明考えられる解決策
Incorrect number of input arguments for 'predict' in Layer.predict の構文が、層入力の数と整合していません。

predict に正しい数の入力引数と出力引数を指定します。

predict の構文は、以下のとおりです。

[Z1,…,Zm] = predict(layer,X1,…,Xn)
ここで、X1,…,Xnn 個の層入力、Z1,…,Zmm 個の層出力です。値 n および m は、層の NumInputs プロパティおよび NumOutputs プロパティに対応しなければなりません。

ヒント

predict への入力の数が変化する可能性がある場合、X1,…,Xn ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、varargin{i}Xi に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、varargout{j}Zj に対応します。

Incorrect number of output arguments for 'predict' in Layerpredict の構文が、層出力の数と整合していません。
Incorrect number of input arguments for 'forward' in Layerforward の構文が、層入力の数と整合していません。

forward に正しい数の入力引数と出力引数を指定します。

forward の構文は、以下のとおりです。

[Z1,…,Zm,memory] = forward(layer,X1,…,Xn)
ここで、X1,…,Xnn 個の層入力、Z1,…,Zmm 個の層出力、memory は層のメモリです。

ヒント

forward への入力の数が変化する可能性がある場合、X1,…,Xn ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、varargin{i}Xi に対応します。出力の数が変化する可能性がある場合、Z1,…,Zm ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、j=1,…,NumOutputs について varargout{j}Zj に対応し、varargout{NumOutputs+1}memory に対応します。

Incorrect number of output arguments for 'forward' in Layerforward の構文が、層出力の数と整合していません。
Incorrect number of input arguments for 'backward' in Layerbackward の構文が、層入力および層出力の数と整合していません。

backward に正しい数の入力引数と出力引数を指定します。

backward の構文は、以下のとおりです。

[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory)
ここで、X1,…,Xnn 個の層入力、Z1,…,Zmforwardm 個の出力、dLdZ1,…,dLdZm は次の層から逆伝播された勾配、memoryforward のメモリ出力です。出力において、dLdX1,…,dLdXn は層入力についての損失の微分で、dLdW1,…,dLdWkk 個の学習可能なパラメーターについての損失の微分です。順方向パスと逆方向パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。

ヒント

backward への入力の数が変化する可能性がある場合、layer の後に入力引数ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、i=1,…,NumInputs について varargin{i}Xi に対応し、j=1,…,NumOutputs について varargin{NumInputs+j} および varargin{NumInputs+NumOutputs+j} はそれぞれ Zj および dLdZj に対応し、varargin{end}memory に対応します。

出力の数が変化する可能性がある場合、出力引数ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、i=1,…,NumInputs について varargout{i}dLdXit=1,…,k について varargout{NumInputs+t}dLdWt に対応します。k は学習可能なパラメーターの数です。

Incorrect number of output arguments for 'backward' in Layerbackward の構文が、層出力の数と整合していません。

複数の入力または出力がある層の場合、層プロパティ NumInputs (または InputNames) および NumOutputs (または OutputNames) の値を層のコンストラクター関数にそれぞれ設定しなければなりません。

複数の観測値

関数 checkLayer は、1 つの観測値または複数の観測値について層関数が有効であることをチェックします。複数の観測値についてチェックするには、名前と値のペア 'ObservationDimension' を使用して観測値の次元を指定します。観測値の次元を指定した場合、関数 checkLayer は、サイズ 1 および 2 のミニバッチで生成されたデータを使用して、層関数が有効であることをチェックします。この名前と値のペアを指定しない場合、関数は、複数の観測値について層関数が有効であることをチェックするテストをスキップします。

テスト診断説明考えられる解決策
Skipping multi-observation tests. To enable checks with multiple observations, specify the 'ObservationDimension' parameter in checkLayer.checkLayer'ObservationDimension' パラメーターを指定しない場合、この関数は、複数の観測値のあるデータをチェックするテストをスキップします。

コマンド checkLayer(layer,validInputSize,'ObservationDimension',dim) を使用します。ここで、layer はカスタム層のインスタンス、validInputSize は層に有効な入力サイズを指定するベクトルであり、dim は層の入力における観測値の次元を指定します。

詳細については、Layer Input Sizesを参照してください。

関数でエラーが発生しない

以下のテストは、有効なサイズの入力データを渡した場合に層でエラーが発生しないかをチェックします。

中間層-  テスト predictDoesNotErrorforwardDoesNotError、および backwardDoesNotError は、有効なサイズの入力を渡した場合に層関数でエラーが発生しないかをチェックします。観測値の次元を指定している場合、関数は、観測値が 1 つと複数の両方の場合について層をチェックします。

テスト診断説明考えられる解決策
The function 'predict' threw an error:サイズ validInputSize のデータを渡したときに関数 predict でエラーが発生しました。Framework Diagnostic セクションに記載されているエラーに対処します。
The function 'forward' threw an error:サイズ validInputSize のデータを渡したときに関数 forward でエラーが発生しました。
The function 'backward' threw an error:predict の出力を渡したときに関数 backward でエラーが発生しました。

出力層-  テスト forwardLossDoesNotError および backwardLossDoesNotError は、有効なサイズの入力を渡した場合に層関数でエラーが発生しないかをチェックします。観測値の次元を指定している場合、関数は、観測値が 1 つと複数の両方の場合について層をチェックします。

テスト診断説明考えられる解決策
The function 'forwardLoss' threw an error:サイズ validInputSize のデータを渡したときに関数 forwardLoss でエラーが発生しました。Framework Diagnostic セクションに記載されているエラーに対処します。
The function 'backwardLoss' threw an error:サイズ validInputSize のデータを渡したときに関数 backwardLoss でエラーが発生しました。

出力のサイズが整合している

以下のテストは、層関数の出力のサイズが整合しているかをチェックします。

中間層-  テスト backwardIsConsistentInSize は、関数 backward が正しいサイズの微分を出力するかをチェックします。

backward の構文は、以下のとおりです。

[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory)
ここで、X1,…,Xnn 個の層入力、Z1,…,Zmforwardm 個の出力、dLdZ1,…,dLdZm は次の層から逆伝播された勾配、memoryforward のメモリ出力です。出力において、dLdX1,…,dLdXn は層入力についての損失の微分で、dLdW1,…,dLdWkk 個の学習可能なパラメーターについての損失の微分です。順方向パスと逆方向パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。

ヒント

backward への入力の数が変化する可能性がある場合、layer の後に入力引数ではなく varargin を使用します。この場合、varargin は入力の cell 配列です。ここで、i=1,…,NumInputs について varargin{i}Xi に対応し、j=1,…,NumOutputs について varargin{NumInputs+j} および varargin{NumInputs+NumOutputs+j} はそれぞれ Zj および dLdZj に対応し、varargin{end}memory に対応します。

出力の数が変化する可能性がある場合、出力引数ではなく varargout を使用します。この場合、varargout は出力の cell 配列です。ここで、i=1,…,NumInputs について varargout{i}dLdXit=1,…,k について varargout{NumInputs+t}dLdWt に対応します。k は学習可能なパラメーターの数です。

微分 dLdX1, …, dLdXn は、対応する層入力と同じサイズでなければならず、dLdW1,…,dLdWk は、対応する学習可能なパラメーターと同じサイズでなければなりません。これらのサイズは、単一の観測値および複数の観測値をもつ入力データに対し、整合していなければなりません。

テスト診断説明考えられる解決策
Incorrect size of 'dLdX' for 'backward'.層入力についての損失の微分は、対応する層入力と同じサイズでなければなりません。

対応する層入力 X1,…,Xn と同じサイズの微分 dLdX1,…,dLdXn を返します。

Incorrect size of the derivative of the loss with respect to the input 'in1' for 'backward'
The size of 'Z' returned from 'forward' must be the same as for 'predict'.predict の出力は、forward の対応する出力と同じサイズでなければなりません。

forward の対応する出力 Z1,…,Zm と同じサイズの predict の出力 Z1,…,Zm を返します。

Incorrect size of the derivative of the loss with respect to 'W' for 'backward'.学習可能なパラメーターについての損失の微分は、対応する学習可能なパラメーターと同じサイズでなければなりません。

対応する学習可能なパラメーター W1,…,Wk と同じサイズの微分 dLdW1,…,dLdWk を返します。

出力層-  テスト forwardLossIsScalar および backwardLossIsConsistentInSizeforwardLoss および backwardLoss の出力のサイズが正しいかをチェックします。

forwardLoss の構文は、loss = forwardLoss(layer, Y, T) です。入力 Y は、ネットワークで行った予測に対応します。これらの予測は前の層の出力です。入力 T は学習ターゲットに対応します。出力 loss は、指定された損失関数に従った YT の間の損失です。出力 loss はスカラーでなければなりません。

backwardLoss の構文は、dLdY = backwardLoss(layer, Y, T) です。入力 Y はネットワークで行った予測であり、T は学習ターゲットです。出力 dLdY は予測 Y についての損失の微分です。出力 dLdY は、層入力 Y と同じサイズでなければなりません。

テスト診断説明考えられる解決策
Incorrect size of 'loss' for 'forwardLoss'.forwardLoss の出力 loss はスカラーでなければなりません。

出力 loss をスカラーとして返します。たとえば、損失に複数の値がある場合、mean または sum を使用できます。

Incorrect size of the derivative of loss 'dLdY' for 'backwardLoss'.層入力についての損失の微分は、層入力と同じサイズでなければなりません。層入力 Y と同じサイズの微分 dLdY を返します。

データ型の整合性と GPU 互換性

以下のテストは、層関数の出力の型が整合しているかと層関数が 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)を参照してください。

中間層-  テスト predictIsConsistentInTypeforwardIsConsistentInType、および backwardIsConsistentInType は、層関数が正しいデータ型の変数を出力するかをチェックします。これらのテストは、データ型 singledouble の入力や、基となる型が single または double であるデータ型 gpuArray の入力があったときに、層関数が整合性のあるデータ型を返すかをチェックします。

ヒント

zeros のような関数を使用して配列を事前に割り当てる場合、これらの配列のデータ型が層関数の入力と一致していることを確認しなければなりません。別の配列と同じデータ型のゼロの配列を作成するには、zeros'like' オプションを使用します。たとえば、配列 X と同じデータ型でサイズが sz のゼロの配列を初期化するには、Z = zeros(sz,'like',X) を使用します。

テスト診断説明考えられる解決策
Incorrect type of 'Z' for 'predict'.predict の出力 Z1,…,Zm の型は、入力 X1,…,Xn と整合性がなければなりません。

入力 X1,…,Xn と同じ型の出力 Z1,…,Zm を返します。

Incorrect type of output 'out1' for 'predict'.
Incorrect type of 'Z' for 'forward'.forward の出力 Z1,…,Zm の型は、入力 X1,…,Xn と整合性がなければなりません。
Incorrect type of output 'out1' for 'forward'.
Incorrect type of 'dLdX' for 'backward'.backward の微分 dLdX1,…,dLdXn の型は、入力 X1,…,Xn と整合性がなければなりません。

入力 X1,…,Xn と同じ型の微分 dLdX1,…,dLdXn を返します。

Incorrect type of the derivative of the loss with respect to the input 'in1' for 'backward'.
Incorrect type of the derivative of loss with respect to 'W' for 'backward'.学習可能なパラメーターについての損失の微分の型は、対応する学習可能なパラメーターと整合性がなければなりません。

各学習可能なパラメーターについて、対応する学習可能なパラメーターと同じ型の微分を返します。

出力層-  テスト forwardLossIsConsistentInType および backwardLossIsConsistentInType は、層関数が正しいデータ型の変数を出力するかをチェックします。これらのテストは、データ型 singledouble の入力や、基となる型が single または double であるデータ型 gpuArray の入力があったときに、層が整合性のあるデータ型を返すかをチェックします。

テスト診断説明考えられる解決策
Incorrect type of 'loss' for 'forwardLoss'.forwardLoss の出力 loss の型は、入力 Y と整合性がなければなりません。

入力 Y と同じ型の loss を返します。

Incorrect type of the derivative of loss 'dLdY' for 'backwardLoss'.backwardLoss の出力 dLdY の型は、入力 Y と整合性がなければなりません。

入力 Y と同じ型の dLdY を返します。

勾配が数値的に正しい

テスト gradientsAreNumericallyCorrect は、層関数で計算された勾配が数値的に正しいかをチェックします。

中間層-  テスト gradientsAreNumericallyCorrect は、backward で計算された勾配が数値的に正しいかをテストします。

テスト診断説明考えられる解決策
The derivative 'dLdX' for 'backward' is inconsistent with the numerical gradient.

次の 1 つ以上に該当しています。

  • 指定された微分が正しく計算されていません

  • 関数が一部の入力点で微分可能ではありません

  • 許容誤差が小さすぎます

backward の微分が正しく計算されていることを確認します。

微分が正しく計算されている場合、Framework Diagnostic セクションで、微分の実際の値と期待される値の間で絶対誤差と相対誤差を手動で確認します。

絶対誤差と相対誤差が許容誤差限界内にある場合、このテスト診断を無視できます。

The derivative of the loss with respect to the input 'in1' for 'backward' is inconsistent with the numerical gradient.
The derivative of loss with respect to 'W' for 'backward' is inconsistent with the numerical gradient.

出力層-  テスト gradientsAreNumericallyCorrect は、backwardLoss で計算された勾配が数値的に正しいかをチェックします。

テスト診断説明考えられる解決策
The derivative 'dLdY' for 'backwardLoss' is inconsistent with the numerical gradient.

次の 1 つ以上に該当しています。

  • 予測 Y についての微分が正しく計算されていません

  • 関数が一部の入力点で微分可能ではありません

  • 許容誤差が小さすぎます

backwardLoss の微分が正しく計算されていることを確認します。

微分が正しく計算されている場合、Framework Diagnostic セクションで、微分の実際の値と期待される値の間で絶対誤差と相対誤差を手動で確認します。

絶対誤差と相対誤差が許容誤差限界内にある場合、このテスト診断を無視できます。

参考

|

関連するトピック