最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
カスタム深層学習層を作成する場合、関数 checkLayer
を使用して、層が有効であることをチェックできます。この関数は、層について有効性、GPU 互換性、勾配定義の正しさをチェックします。層が有効であることをチェックするには、次のコマンドを実行します。
checkLayer(layer,validInputSize,'ObservationDimension',dim)
layer
は層のインスタンス、validInputSize
は層に有効な入力サイズを指定するベクトルまたは cell 配列であり、dim
は層の入力データにおける観測値の次元を指定します。入力サイズが大きい場合、勾配チェックの実行に時間がかかります。テストを高速化するには、指定する有効な入力サイズを小さくします。例のカスタム層 preluLayer
の有効性をチェックします。
カスタム PReLU 層を定義します。この層を作成するには、ファイル preluLayer.m
を現在のフォルダーに保存します。
層のインスタンスを作成し、checkLayer
を使用して、それが有効であることをチェックします。有効な入力サイズを、層への 1 つの観測値入力の典型的なサイズに設定します。単一入力の場合、層にはサイズ h x w x c の観測値が必要です。h、w、および 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 の観測値の配列が必要です。h、w、および 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 | 層関数の構文が正しく定義されています。 |
predictDoesNotError | predict でエラーが発生しません。 |
forwardDoesNotError |
|
forwardPredictAreConsistentInSize |
|
backwardDoesNotError | backward でエラーが発生しません。 |
backwardIsConsistentInSize |
|
predictIsConsistentInType |
|
forwardIsConsistentInType |
|
backwardIsConsistentInType |
|
gradientsAreNumericallyCorrect | backward で計算された勾配が数値勾配と整合します。 |
テスト predictIsConsistentInType
、forwardIsConsistentInType
、および backwardIsConsistentInType
は、GPU 互換性もチェックします。層関数を GPU で実行するには、これらの関数が、基となるデータ型が single
である gpuArray
型の入力と出力をサポートしていなければなりません。
forward
を実装していない場合、checkLayer
は forwardDoesNotError
、forwardPredictAreConsistentInSize
、および forwardIsConsistentInType
テストを実行しません。
関数 checkLayer
は、以下のテストを使用してカスタム出力層 (タイプ nnet.layer.ClassificationLayer
または nnet.layer.RegressionLayer
の層) の有効性をチェックします。
テスト | 説明 |
---|---|
forwardLossDoesNotError | forwardLoss でエラーが発生しません。 |
backwardLossDoesNotError | backwardLoss でエラーが発生しません。 |
forwardLossIsScalar | forwardLoss の出力がスカラーです。 |
backwardLossIsConsistentInSize | backwardLoss の出力がサイズにおいて次に整合します。dLdY は予測 Y と同じサイズです。 |
forwardLossIsConsistentInType |
|
backwardLossIsConsistentInType |
|
gradientsAreNumericallyCorrect | backwardLoss で計算された勾配が数値的に正しいものです。 |
forwardLossIsConsistentInType
および backwardLossIsConsistentInType
テストは、GPU 互換性もチェックします。層関数を GPU で実行するには、これらの関数が、基となるデータ型が single
である gpuArray
型の入力と出力をサポートしていなければなりません。
層の有効性をチェックするために、関数 checkLayer
は、層のタイプに応じてデータを生成します。
層のタイプ | 生成されるデータの説明 |
---|---|
中間 | [-1,1] の範囲の値 |
回帰出力 | [-1,1] の範囲の値を持つ予測とターゲット |
分類出力 | [0,1] の範囲の値を持つ予測。
|
複数の観測値についてチェックするには、名前と値のペア 'ObservationDimension'
を使用して観測値の次元を指定します。観測値の次元を指定した場合、関数 checkLayer
は、サイズ 1 および 2 のミニバッチで生成されたデータを使用して、層関数が有効であることをチェックします。この名前と値のペアを指定しない場合、関数は、複数の観測値について層関数が有効であることをチェックするテストをスキップします。
checkLayer
を使用してテストに失敗した場合、この関数はテスト診断とフレームワーク診断を表示します。テスト診断は、層で見つかった問題を示します。フレームワーク診断は、より詳細な情報を提供します。
テスト methodSignaturesAreCorrect
は、層関数の構文が正しく定義されているかをチェックします。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
Incorrect number of input arguments for 'predict' in Layer . | predict の構文が、層入力の数と整合していません。 |
[Z1,…,Zm] = predict(layer,X1,…,Xn) X1,…,Xn は n 個の層入力、Z1,…,Zm は m 個の層出力です。値 n および m は、層の NumInputs プロパティおよび NumOutputs プロパティに対応しなければなりません。ヒント
|
Incorrect number of output arguments for 'predict' in Layer | predict の構文が、層出力の数と整合していません。 | |
Incorrect number of input arguments for 'forward' in Layer | forward の構文が、層入力の数と整合していません。 |
[Z1,…,Zm,memory] = forward(layer,X1,…,Xn) X1,…,Xn は n 個の層入力、Z1,…,Zm は m 個の層出力、memory は層のメモリです。ヒント
|
Incorrect number of output arguments for 'forward' in Layer | forward の構文が、層出力の数と整合していません。 | |
Incorrect number of input arguments for 'backward' in Layer | backward の構文が、層入力および層出力の数と整合していません。 |
[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory) X1,…,Xn は n 個の層入力、Z1,…,Zm は forward の m 個の出力、dLdZ1,…,dLdZm は次の層から逆伝播された勾配、memory は forward のメモリ出力です。出力において、dLdX1,…,dLdXn は層入力についての損失の微分で、dLdW1,…,dLdWk は k 個の学習可能なパラメーターについての損失の微分です。順方向パスと逆方向パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~ に置き換えます。ヒント
出力の数が変化する可能性がある場合、出力引数ではなく |
Incorrect number of output arguments for 'backward' in Layer | backward の構文が、層出力の数と整合していません。 |
複数の入力または出力がある層の場合、層プロパティ 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' パラメーターを指定しない場合、この関数は、複数の観測値のあるデータをチェックするテストをスキップします。 | コマンド 詳細については、Layer Input Sizesを参照してください。 |
以下のテストは、有効なサイズの入力データを渡した場合に層でエラーが発生しないかをチェックします。
中間層- テスト predictDoesNotError
、forwardDoesNotError
、および 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,…,Xn
は n
個の層入力、Z1,…,Zm
は forward
の m
個の出力、dLdZ1,…,dLdZm
は次の層から逆伝播された勾配、memory
は forward
のメモリ出力です。出力において、dLdX1,…,dLdXn
は層入力についての損失の微分で、dLdW1,…,dLdWk
は k
個の学習可能なパラメーターについての損失の微分です。順方向パスと逆方向パスの間に使用されない変数が保存されることを防いでメモリ使用量を削減するには、対応する入力引数を ~
に置き換えます。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}
は dLdXi
、t
=1,…,k
について varargout{NumInputs+t}
は dLdWt
に対応します。k
は学習可能なパラメーターの数です。
微分 dLdX1
, …, dLdXn
は、対応する層入力と同じサイズでなければならず、dLdW1,…,dLdWk
は、対応する学習可能なパラメーターと同じサイズでなければなりません。これらのサイズは、単一の観測値および複数の観測値をもつ入力データに対し、整合していなければなりません。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
Incorrect size of 'dLdX' for 'backward' . | 層入力についての損失の微分は、対応する層入力と同じサイズでなければなりません。 | 対応する層入力 |
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 の対応する出力と同じサイズでなければなりません。 |
|
Incorrect size of the derivative of the loss with respect to 'W' for 'backward' . | 学習可能なパラメーターについての損失の微分は、対応する学習可能なパラメーターと同じサイズでなければなりません。 | 対応する学習可能なパラメーター |
出力層- テスト forwardLossIsScalar
および backwardLossIsConsistentInSize
は forwardLoss
および backwardLoss
の出力のサイズが正しいかをチェックします。
forwardLoss
の構文は、loss = forwardLoss(layer, Y, T)
です。入力 Y
は、ネットワークで行った予測に対応します。これらの予測は前の層の出力です。入力 T
は学習ターゲットに対応します。出力 loss
は、指定された損失関数に従った Y
と T
の間の損失です。出力 loss
はスカラーでなければなりません。
backwardLoss
の構文は、dLdY = backwardLoss(layer, Y, T)
です。入力 Y
はネットワークで行った予測であり、T
は学習ターゲットです。出力 dLdY
は予測 Y
についての損失の微分です。出力 dLdY
は、層入力 Y
と同じサイズでなければなりません。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
Incorrect size of 'loss' for 'forwardLoss' . | forwardLoss の出力 loss はスカラーでなければなりません。 | 出力 |
Incorrect size of the derivative of loss 'dLdY' for 'backwardLoss' . | 層入力についての損失の微分は、層入力と同じサイズでなければなりません。 | 層入力 Y と同じサイズの微分 dLdY を返します。 |
以下のテストは、層関数の出力の型が整合しているかと層関数が 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)を参照してください。
中間層- テスト predictIsConsistentInType
、forwardIsConsistentInType
、および backwardIsConsistentInType
は、層関数が正しいデータ型の変数を出力するかをチェックします。これらのテストは、データ型 single
、double
の入力や、基となる型が single
または double
であるデータ型 gpuArray
の入力があったときに、層関数が整合性のあるデータ型を返すかをチェックします。
zeros
のような関数を使用して配列を事前に割り当てる場合、これらの配列のデータ型が層関数の入力と一致していることを確認しなければなりません。別の配列と同じデータ型のゼロの配列を作成するには、zeros
の 'like'
オプションを使用します。たとえば、配列 X
と同じデータ型でサイズが sz
のゼロの配列を初期化するには、Z = zeros(sz,'like',X)
を使用します。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
Incorrect type of 'Z' for 'predict' . | predict の出力 Z1,…,Zm の型は、入力 X1,…,Xn と整合性がなければなりません。 | 入力 |
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 と整合性がなければなりません。 | 入力 |
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
は、層関数が正しいデータ型の変数を出力するかをチェックします。これらのテストは、データ型 single
、double
の入力や、基となる型が single
または double
であるデータ型 gpuArray
の入力があったときに、層が整合性のあるデータ型を返すかをチェックします。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
Incorrect type of 'loss' for 'forwardLoss' . | forwardLoss の出力 loss の型は、入力 Y と整合性がなければなりません。 | 入力 |
Incorrect type of the derivative of loss 'dLdY' for 'backwardLoss' . | backwardLoss の出力 dLdY の型は、入力 Y と整合性がなければなりません。 | 入力 |
テスト gradientsAreNumericallyCorrect
は、層関数で計算された勾配が数値的に正しいかをチェックします。
中間層- テスト gradientsAreNumericallyCorrect
は、backward
で計算された勾配が数値的に正しいかをテストします。
テスト診断 | 説明 | 考えられる解決策 |
---|---|---|
The derivative 'dLdX' for 'backward' is inconsistent with the numerical gradient . | 次の 1 つ以上に該当しています。
|
微分が正しく計算されている場合、 絶対誤差と相対誤差が許容誤差限界内にある場合、このテスト診断を無視できます。 |
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 つ以上に該当しています。
|
微分が正しく計算されている場合、 絶対誤差と相対誤差が許容誤差限界内にある場合、このテスト診断を無視できます。 |