Main Content

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

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

checkLayer(layer,layout)
layer は層のインスタンス、layout は層への入力に対して有効なサイズとデータ形式を指定する networkDataLayout オブジェクトです。複数の観測値をチェックするには、ObservationDimension オプションを使用します。コード生成の互換性チェックを実行するには、CheckCodegenCompatibility オプションを 1 (true) に設定します。入力サイズが大きい場合、勾配チェックの実行に時間がかかります。チェックを高速化するには、指定する有効な入力サイズを小さくします。

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

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

この例にサポート ファイルとして添付されているカスタム層 preluLayer は、入力データに PReLU 演算を適用します。この層にアクセスするには、この例をライブ スクリプトとして開きます。

層のインスタンスを作成します。

layer = preluLayer;

層への典型的な入力の 1 つの観測値に要求される入力サイズと形式を指定する networkDataLayout オブジェクトを作成します。有効な入力サイズとして [24 24 20] を指定します。ここで、各次元は、前の層の出力における高さ、幅、およびチャネル数に対応します。

validInputSize = [24 24 20];
layout = networkDataLayout(validInputSize,"SSC");

checkLayer を使用して、層の有効性をチェックします。ネットワークにデータを渡す場合、層には 4 次元配列を入力する必要があります。ここで、最初の 3 つの次元は前の層の出力における高さ、幅、およびチャネル数に対応し、4 番目の次元は観測値に対応します。

checkLayer(layer,layout)
Skipping multi-observation tests. To enable tests with multiple observations, specify a formatted networkDataLayout as the second argument or specify the ObservationDimension option.
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.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the CheckCodegenCompatibility and ObservationDimension options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ....
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 14 Passed, 0 Failed, 0 Incomplete, 20 Skipped.
	 Time elapsed: 0.16884 seconds.

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

複数の観測値のチェック

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

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

checkLayer(layer,layout,ObservationDimension=4)
Skipping GPU tests. No compatible GPU device found.
 
Skipping code generation compatibility tests. To check validity of the layer for code generation, specify the CheckCodegenCompatibility and ObservationDimension options.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... ..........
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 20 Passed, 0 Failed, 0 Incomplete, 14 Skipped.
	 Time elapsed: 0.091583 seconds.

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

テストの一覧

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

中間層

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

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

指定されている場合、関数 forward でエラーが発生しません。

forwardPredictAreConsistentInSize

forward が指定されている場合、forward および predict が同じサイズの値を出力します。

backwardDoesNotError指定されている場合、backward でエラーが発生しません。
backwardIsConsistentInSize

backward が指定されている場合、backward の出力のサイズが整合しています。

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

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

predictIsConsistentInType

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

forwardIsConsistentInType

forward が指定されている場合、forward の出力の型は、入力と整合性があります。

backwardIsConsistentInType

backward が指定されている場合、backward の出力の型は、入力と整合性があります。

gradientsAreNumericallyCorrectbackward が指定されている場合、backward で計算された勾配が数値勾配と整合します。
backwardPropagationDoesNotErrorbackward が指定されていない場合、自動微分を使用して微分を計算できます。
predictReturnsValidStates状態プロパティをもつ層において、関数 predict が有効な状態を返します。
forwardReturnsValidStates状態プロパティをもつ層において、関数 forward (指定されている場合) が有効な状態を返します。
resetStateDoesNotError状態プロパティをもつ層において、関数 resetState (指定されている場合) はエラーを発生させずに状態を有効な状態にリセットします。

formattableLayerPredictIsFormatted (R2023b 以降)

nnet.layer.Formattable クラスから継承する層の場合、関数 predict はチャネル次元をもつ書式付き dlarray を返します。

formattableLayerForwardIsFormatted (R2023b 以降)

nnet.layer.Formattable クラスから継承する層の場合、関数 forward (指定されている場合) はチャネル次元をもつ書式付き dlarray を返します。

initializeDoesNotChangeLearnableParametersWhenTheyAreNotEmpty (R2023b 以降)

1 つ以上の networkDataLayout オブジェクトを指定する場合、同じ networkDataLayout オブジェクトを入力として初期化を繰り返しても、層の学習可能パラメーターが変化することはありません。

initializeDoesNotChangeStatefulParametersWhenTheyAreNotEmpty (R2023b 以降)

1 つ以上の networkDataLayout オブジェクトを指定する場合、同じ networkDataLayout オブジェクトを入力として初期化を繰り返しても、層の状態パラメーターが変化することはありません。
codegenPragmaDefinedInClassDefコード生成のプラグマ "%#codegen" は、クラス ファイルで指定されます。
layerPropertiesSupportCodegen層のプロパティによってコード生成がサポートされます。
predictSupportsCodegenpredict はコード生成に対して有効です。
doesNotHaveStatePropertiesコード生成において、層が状態プロパティをもちません。
functionLayerSupportsCodegenコード生成では、層関数はパス上の名前付き関数でなければならず、Formattable プロパティを 0 (false) に設定しなければなりません。

テストによっては複数回実行されます。これらのテストでは、各種のデータ型と GPU の互換性もチェックされます。

  • predictIsConsistentInType

  • forwardIsConsistentInType

  • backwardIsConsistentInType

層関数を GPU で実行するには、これらの関数が、基となるデータ型が single である gpuArray 型の入力と出力をサポートしていなければなりません。

出力層

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

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

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

backwardLossIsConsistentInType

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

gradientsAreNumericallyCorrectbackwardLoss が指定されている場合、backwardLoss で計算された勾配が数値的に正しいものです。
backwardPropagationDoesNotErrorbackwardLoss が指定されていない場合、自動微分を使用して微分を計算できます。

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

生成されたデータ

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

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

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

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

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

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

診断

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

関数の構文

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

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

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

関数 predict の構文は、層のタイプによって異なります。

  • Z = predict(layer,X) は、層を介して入力データ X を転送し、結果 Z を出力します。この場合、layer は、1 つの入力と 1 つの出力をもちます。

  • [Z,state] = predict(layer,X) は、更新された状態パラメーター state も出力します。この場合、layer は 1 つの状態パラメーターをもちます。

複数の入力、複数の出力、または複数の状態パラメーターを使用して、層の構文を調整できます。

  • 複数の入力をもつ層の場合、XX1,...,XN に置き換えます。ここで、N は入力の数です。NumInputs プロパティは N と一致しなければなりません。

  • 複数の出力をもつ層の場合、ZZ1,...,ZM に置き換えます。ここで、M は出力の数です。NumOutputs プロパティは M と一致しなければなりません。

  • 複数の状態パラメーターをもつ層の場合、statestate1,...,stateK に置き換えます。ここで、K は状態パラメーターの数です。

ヒント

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

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

ヒント

学習可能なパラメーターの dlnetwork オブジェクトがカスタム層にある場合、カスタム層の関数 predict 内で、dlnetwork の関数 predict を使用します。これを行うと、dlnetwork オブジェクトの関数 predict は適切な層処理を使用して予測を行います。dlnetwork に状態パラメーターがある場合、ネットワークの状態も返します。

Incorrect number of output arguments for 'predict' in Layer関数 predict の構文が、層出力の数と整合していません。
Incorrect number of input arguments for 'forward' in Layerオプションの関数 forward の構文が、層入力の数と整合していません。

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

関数 forward の構文は、層のタイプによって異なります。

  • Z = forward(layer,X) は、層を介して入力データ X を転送し、結果 Z を出力します。この場合、layer は、1 つの入力と 1 つの出力をもちます。

  • [Z,state] = forward(layer,X) は、更新された状態パラメーター state も出力します。この場合、layer は 1 つの状態パラメーターをもちます。

  • [__,memory] = forward(layer,X) は、前述の構文のいずれかを使用して、カスタム関数 backward のメモリ値も返します。カスタム関数 forward とカスタム関数 backward の両方が層に存在する場合、順方向関数によってメモリ値が返されなければなりません。

複数の入力、複数の出力、または複数の状態パラメーターを使用して、層の構文を調整できます。

  • 複数の入力をもつ層の場合、XX1,...,XN に置き換えます。ここで、N は入力の数です。NumInputs プロパティは N と一致しなければなりません。

  • 複数の出力をもつ層の場合、ZZ1,...,ZM に置き換えます。ここで、M は出力の数です。NumOutputs プロパティは M と一致しなければなりません。

  • 複数の状態パラメーターをもつ層の場合、statestate1,...,stateK に置き換えます。ここで、K は状態パラメーターの数です。

ヒント

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

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

ヒント

学習可能なパラメーターの dlnetwork オブジェクトがカスタム層にある場合、カスタム層の関数 forward 内で、dlnetwork オブジェクトの関数 forward を使用します。これを行うと、dlnetwork オブジェクトの関数 forward は適切な層処理を使用して学習を行います。

Incorrect number of output arguments for 'forward' in Layerオプションの関数 forward の構文が、層出力の数と整合していません。
Incorrect number of input arguments for 'backward' in Layerオプションの関数 backward の構文が、層入力および層出力の数と整合していません。

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

関数 backward の構文は、層のタイプによって異なります。

  • dLdX = backward(layer,X,Z,dLdZ,memory) は、層入力についての損失の微分 dLdX を返します。この場合、layer は 1 つの入力と 1 つの出力をもちます。Z は順方向関数の出力に対応し、dLdZZ についての損失の微分に対応します。関数の入力 memory は、順方向関数のメモリ出力に対応します。

  • [dLdX,dLdW] = backward(layer,X,Z,dLdZ,memory) は、学習可能なパラメーターについての損失の微分 dLdW も返します。この場合、layer は 1 つの学習可能なパラメーターをもちます。

  • [dLdX,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) は、状態入力についての損失の微分 dLdSin も返します。この場合、layer は 1 つの状態パラメーターをもちます。dLdSout は層の状態出力についての損失の微分に対応します。

  • [dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) は、学習可能なパラメーターについての損失の微分 dLdW、および層の状態入力についての損失の微分 dLdSin も返します。この場合、layer は 1 つの状態パラメーターと 1 つの学習可能なパラメーターをもちます。

複数の入力、複数の出力、複数の学習可能なパラメーター、または複数の状態パラメーターを使用して、層の構文を調整できます。

  • 複数の入力をもつ層の場合、XdLdX をそれぞれ X1,...,XNdLdX1,...,dLdXN に置き換えます。ここで、N は入力の数です。

  • 複数の出力をもつ層の場合、ZdLdZ をそれぞれ Z1,...,ZMdLdZ1,...,dLdZM に置き換えます。ここで、M は出力の数です。

  • 複数の学習可能なパラメーターをもつ層の場合、dLdWdLdW1,...,dLdWP に置き換えます。ここで、P は学習可能なパラメーターの数です。

  • 複数の状態パラメーターをもつ層の場合、dLdSindLdSout をそれぞれ dLdSin1,...,dLdSinKdLdSout1,...,dLdSoutK に置き換えます。ここで、K は状態パラメーターの数です。

フォワード パスとバックワード パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。

ヒント

backward への入力の数が変化する可能性がある場合、layer の後に入力引数ではなく varargin を使用します。この場合、varargin は入力の cell 配列になります。ここで、最初の N 個の要素は N 個の層入力に対応し、その次の M 個の要素は M 個の層出力に対応し、その次の M 個の要素は M 個の層出力についての損失の微分に対応し、その次の K 個の要素は K 個の状態出力についての損失に関する K 個の微分に対応し、最後の要素は memory に対応します。

出力の数が変化する可能性がある場合、出力引数ではなく varargout を使用します。この場合、varargout は出力の cell 配列になります。ここで、最初の N 個の要素は N 個の層入力についての損失に関する N 個の微分に対応し、その次の P 個の要素は P 個の学習可能なパラメーターについての損失の微分に対応し、その次の K 個の要素は K 個の状態入力についての損失の微分に対応します。

ヒント

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、関数 backward を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

Incorrect number of output arguments for 'backward' in Layerオプションの関数 backward の構文が、層出力の数と整合していません。

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

複数の観測値

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

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

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

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

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

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

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

テスト診断説明考えられる解決策
The function 'predict' threw an error:layout で定義されたサイズのデータを渡したときに、関数 predict でエラーが発生しました。

Framework Diagnostic セクションに記載されているエラーに対処します。

ヒント

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、関数 backward を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

The function 'forward' threw an error:layout で定義されたサイズのデータを渡したときに、オプションの関数 forward でエラーが発生しました。
The function 'backward' threw an error:predict の出力を渡したときにオプションの関数 backward でエラーが発生しました。

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

テスト診断説明考えられる解決策
The function 'forwardLoss' threw an error:layout で定義されたサイズのデータを渡したときに、関数 forwardLoss でエラーが発生しました。

Framework Diagnostic セクションに記載されているエラーに対処します。

ヒント

関数 forwardLossdlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されるため、関数 backwardLoss を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

The function 'backwardLoss' threw an error:layout で定義されたサイズのデータを渡したときに、オプションの関数 backwardLoss でエラーが発生しました。

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

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

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

関数 backward の構文は、層のタイプによって異なります。

  • dLdX = backward(layer,X,Z,dLdZ,memory) は、層入力についての損失の微分 dLdX を返します。この場合、layer は 1 つの入力と 1 つの出力をもちます。Z は順方向関数の出力に対応し、dLdZZ についての損失の微分に対応します。関数の入力 memory は、順方向関数のメモリ出力に対応します。

  • [dLdX,dLdW] = backward(layer,X,Z,dLdZ,memory) は、学習可能なパラメーターについての損失の微分 dLdW も返します。この場合、layer は 1 つの学習可能なパラメーターをもちます。

  • [dLdX,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) は、状態入力についての損失の微分 dLdSin も返します。この場合、layer は 1 つの状態パラメーターをもちます。dLdSout は層の状態出力についての損失の微分に対応します。

  • [dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory) は、学習可能なパラメーターについての損失の微分 dLdW、および層の状態入力についての損失の微分 dLdSin も返します。この場合、layer は 1 つの状態パラメーターと 1 つの学習可能なパラメーターをもちます。

複数の入力、複数の出力、複数の学習可能なパラメーター、または複数の状態パラメーターを使用して、層の構文を調整できます。

  • 複数の入力をもつ層の場合、XdLdX をそれぞれ X1,...,XNdLdX1,...,dLdXN に置き換えます。ここで、N は入力の数です。

  • 複数の出力をもつ層の場合、ZdLdZ をそれぞれ Z1,...,ZMdLdZ1,...,dLdZM に置き換えます。ここで、M は出力の数です。

  • 複数の学習可能なパラメーターをもつ層の場合、dLdWdLdW1,...,dLdWP に置き換えます。ここで、P は学習可能なパラメーターの数です。

  • 複数の状態パラメーターをもつ層の場合、dLdSindLdSout をそれぞれ dLdSin1,...,dLdSinKdLdSout1,...,dLdSoutK に置き換えます。ここで、K は状態パラメーターの数です。

フォワード パスとバックワード パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。

ヒント

backward への入力の数が変化する可能性がある場合、layer の後に入力引数ではなく varargin を使用します。この場合、varargin は入力の cell 配列になります。ここで、最初の N 個の要素は N 個の層入力に対応し、その次の M 個の要素は M 個の層出力に対応し、その次の M 個の要素は M 個の層出力についての損失の微分に対応し、その次の K 個の要素は K 個の状態出力についての損失に関する K 個の微分に対応し、最後の要素は memory に対応します。

出力の数が変化する可能性がある場合、出力引数ではなく varargout を使用します。この場合、varargout は出力の cell 配列になります。ここで、最初の N 個の要素は N 個の層入力についての損失に関する N 個の微分に対応し、その次の P 個の要素は P 個の学習可能なパラメーターについての損失の微分に対応し、その次の K 個の要素は 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 を返します。

ヒント

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、関数 backward を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

出力層.  テスト forwardLossIsScalar は、関数 forwardLoss の出力がスカラーであるかをチェックします。関数 backwardLoss が指定されている場合、テスト backwardLossIsConsistentInSizeforwardLoss および backwardLoss の出力のサイズが正しいかをチェックします。

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

関数 forwardLossdlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されるため、関数 backwardLoss を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

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'.backwardLoss が指定されている場合、層入力についての損失の微分は、層入力と同じサイズでなければなりません。

層入力 Y と同じサイズの微分 dLdY を返します。

関数 forwardLossdlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されるため、関数 backwardLoss を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

出力が書式付き

R2023b 以降

以下のテストでは、層関数の出力が予期した形式であるかチェックします。

中間層.  テスト formattableLayerPredictIsFormatted および formattableLayerForwardIsFormatted は、層関数の出力がチャネル次元をもつ dlarray オブジェクトであるかチェックします。

テスト診断説明考えられる解決策
The layer output returned from 'predict' must be a formatted dlarray.関数 predict が書式付き dlarray を返さない

関数 predict の出力を書式付き dlarray として返します。

The layer output returned from 'forward' must be a formatted dlarray.オプションの関数 forward が書式付き dlarray を返さない

オプションの関数 forward の出力を書式付き dlarray として返します。

初期化

R2023b 以降

これらのテストでは、空でないパラメーターが初期化によって上書きされていないかチェックします。

中間層.  テスト initializeDoesNotChangeLearnableParametersWhenTheyAreNotEmptyinitializeDoesNotChangeStatefulParametersWhenTheyAreNotEmpty は、空でない学習可能パラメーターとステートフル パラメーターがカスタム関数 initialize によって上書きされていないかチェックします。

テスト診断説明考えられる解決策
The initialize function overwrites existing layer learnable parameters.関数 initialize が、空でない学習可能パラメーターを上書きしています。

空のパラメーターのみを初期化します。パラメーターが空かどうかをチェックするには、関数 isempty を使用します。たとえば、isempty(layer.Parameter) のようにします。

The initialize function overwrites existing layer state parameters.関数 initialize が、空でない状態パラメーターを上書きしています。

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

以下のテストは、層関数の出力の型が整合しているかと層関数が GPU 互換かをチェックします。

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

多くの MATLAB® 組み込み関数が入力引数 gpuArray (Parallel Computing Toolbox) および dlarray をサポートしています。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。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'.学習可能なパラメーターについての損失の微分の型は、対応する学習可能なパラメーターと整合性がなければなりません。

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

ヒント

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、関数 backward を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

出力層.  テスト 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 を返します。

ヒント

関数 forwardLossdlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されるため、関数 backwardLoss を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

正しい勾配

テスト gradientsAreNumericallyCorrect は、層関数で計算された勾配が数値的に正しいかをチェックします。テスト backwardPropagationDoesNotError は、自動微分を使用して微分を計算できるかをチェックします。

中間層.  オプションの関数 backward が指定されていない場合、テスト backwardPropagationDoesNotError は自動微分を使用して微分を計算できるかをチェックします。オプションの関数 backward が指定されている場合、テスト gradientsAreNumericallyCorrectbackward で計算された勾配が数値的に正しいかをテストします。

テスト診断説明考えられる解決策
Expected a dlarray with no dimension labels, but instead found labels.オプションの関数 backward が指定されていない場合、層の順方向関数は次元ラベルなしで dlarray オブジェクトを出力しなければなりません。層の順方向関数で作成された dlarray オブジェクトに次元ラベルが含まれないことを確認します。
Unable to backward propagate through the layer. Check that the 'forward' function fully supports automatic differentiation. Alternatively, implement the 'backward' function manually.

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

  • オプションの関数 backward が指定されていない場合、層の順方向関数が dlarray オブジェクトをサポートしていない。

  • オプションの関数 backward が指定されていない場合、順方向関数の入力 dlarray オブジェクトのトレースが破損している。たとえば、関数 extractdata を使用した場合です。

順関数が dlarray オブジェクトをサポートしていることを確認します。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

入力 dlarray オブジェクトの微分をトレースできることを確認します。dlarray オブジェクトの微分のトレースの詳細は、微分のトレースを参照してください。

または、backward という名前の関数を作成してカスタム逆方向関数を定義します。詳細については、カスタム層の逆方向関数の指定を参照してください。

Unable to backward propagate through the layer. Check that the 'predict' function fully supports automatic differentiation. Alternatively, implement the 'backward' function manually.
The derivative 'dLdX' for 'backward' is inconsistent with the numerical gradient.

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

  • オプションの関数 backward が指定されている場合、微分が正しく計算されていない

  • 順方向関数が一部の入力点で微分可能ではない

  • 許容誤差が小さすぎる

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、逆方向関数を省略できます。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

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.

ヒント

層の順方向関数が dlarray オブジェクトをサポートしている場合、逆方向関数が自動的に決定されるため、関数 backward を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

出力層.  オプションの関数 backwardLoss が指定されていない場合、テスト backwardPropagationDoesNotError は自動微分を使用して微分を計算できるかをチェックします。オプションの関数 backwardLoss が指定されている場合、テスト gradientsAreNumericallyCorrectbackwardLoss で計算された勾配が数値的に正しいかをテストします。

テスト診断説明考えられる解決策
Expected a dlarray with no dimension labels, but instead found labelsオプションの関数 backwardLoss が指定されていない場合、関数 forwardLoss は次元ラベルなしで dlarray オブジェクトを出力しなければなりません。関数 forwardLoss で作成された dlarray オブジェクトに次元ラベルが含まれないことを確認します。
Unable to backward propagate through the layer. Check that the 'forwardLoss' function fully supports automatic differentiation. Alternatively, implement the 'backwardLoss' function manually

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

  • オプションの関数 backwardLoss が指定されていない場合、層の関数 forwardLossdlarray オブジェクトをサポートしていない。

  • オプションの関数 backwardLoss が指定されていない場合、関数 forwardLoss の入力 dlarray オブジェクトのトレースが破損している。たとえば、関数 extractdata を使用した場合です。

関数 forwardLossdlarray オブジェクトをサポートしていることを確認します。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

入力 dlarray オブジェクトの微分をトレースできることを確認します。dlarray オブジェクトの微分のトレースの詳細は、微分のトレースを参照してください。

または、backwardLoss という名前の関数を作成してカスタム逆方向損失関数を定義します。詳細については、カスタム出力層の逆方向損失関数の指定を参照してください。

The derivative 'dLdY' for 'backwardLoss' is inconsistent with the numerical gradient.

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

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

  • 関数が一部の入力点で微分可能ではない

  • 許容誤差が小さすぎる

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

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

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

ヒント

関数 forwardLossdlarray オブジェクトをサポートしている場合、逆方向損失関数が自動的に決定されるため、関数 backwardLoss を指定する必要はありません。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

有効な状態

テスト predictReturnsValidStates は、状態プロパティをもつ層について、予測関数が有効な状態を返すかどうかをチェックします。forward が指定されている場合、テスト forwardReturnsValidStates は、順方向関数が有効な状態を返すかどうかをチェックします。テスト resetStateDoesNotError は、関数 resetState が有効な状態プロパティをもつ層を返すかどうかをチェックします。

テスト診断説明考えられる解決策
Error using 'predict' in Layer. 'State' must be real-values numeric array or unformatted dlarray object.状態出力は、実数値の数値配列または書式なしの dlarray オブジェクトでなければなりません。Framework Diagnostic で検出された状態が、実数値の数値配列または書式なしの dlarray オブジェクトであることを確認してください。
Error using 'resetState' in Layer. 'State' must be real-values numeric array or unformatted dlarray object返された層の状態プロパティは、実数値の数値配列または書式なしの dlarray オブジェクトでなければなりません。

コード生成の互換性

CheckCodegenCompatibility オプションを 1 (true) に設定すると、関数 checkLayer は、コード生成の互換性について層をチェックします。

テスト codegenPragmaDefinedInClassDef は、層の定義にコード生成プラグマ %#codegen が含まれていることをチェックします。テスト layerPropertiesSupportCodegen は、層のプロパティによってコード生成がサポートされていることをチェックします。テスト predictSupportsCodegen は、predict の出力の次元およびバッチ サイズに整合性があることをチェックします。

コード生成では、2 次元イメージ入力または特徴入力のみで中間層がサポートされます。コード生成は、状態プロパティ (属性が State であるプロパティ) をもつ層をサポートしません。

関数 checkLayer は、層で使用されている関数がコード生成と互換性があるかどうかをチェックしません。カスタム層で使用されている関数もコード生成をサポートしているかどうかをチェックするには、まずコード生成の準備状態アプリを使用します。詳細については、コード生成の準備状態ツールを使ったコードのチェック (MATLAB Coder)を参照してください。

テスト診断説明考えられる解決策
Specify '%#codegen' in the class definition of custom layer層の定義には、コード生成用のプラグマ "%#codegen" が含まれません。

この層のコードを生成することを示すため、層の定義に %#codegen 命令 (プラグマ) を追加します。この命令は、MATLAB コード アナライザーに対し、コード生成時のエラーの原因となる違反を診断して修正するのに役立つ情報を提供するよう指示します。

Nonscalar layer properties must be type single or double or character array for custom layer層には、single 配列、double 配列、または文字配列以外の型の、非スカラーのプロパティが含まれます。

非スカラーのプロパティを変換して、型が single 配列、double 配列、または文字配列の表現を使用します。

たとえば、categorical 配列を、カテゴリを表す double 型の整数の配列に変換します。

Scalar layer properties must be numeric, logical, or string for custom layer層には、数値、logical、または string 以外の型の、スカラーのプロパティが含まれます。

スカラーのプロパティを変換して、数値表現、または型が logical か string の表現を使用します。

たとえば、categorical スカラーを、カテゴリを表す double 型の整数に変換します。

For code generation, 'Z' must have the same number of dimensions as the layer input.

predict の出力 Z の次元数は、層入力の次元数と一致しません。

関数 predict で、層入力と同じ次元数の出力を返します。

For code generation, 'Z' must have the same batch size as the layer input.

predict の出力 Z のバッチ サイズは、層入力のバッチ サイズと一致しません。

関数 predict で、層入力と同じバッチ サイズの出力を返します。

参考

|

関連するトピック