メインコンテンツ

checkLayer

カスタム層または関数層の有効性のチェック

説明

checkLayer(layer,layout1,...,layoutN) は、指定された networkDataLayout オブジェクトを使用して層の有効性をチェックします。ここで、N は層入力の数であり、layoutK は入力 layer.InputNames(K) に対応します。 (R2023b 以降)

checkLayer(layer,validInputSize) は、validInputSize のサイズの生成データを使用して、カスタム層または関数層の有効性をチェックします。1 つの入力をもつ層の場合、validInputSize を層に対する入力の典型的なサイズに設定します。複数の入力をもつ層の場合、validInputSize を典型的なサイズの cell 配列に設定します。ここで、各要素は層入力 1 つに対応します。この構文は、nnet.layer.Formattable クラスから継承する層をサポートしません。

checkLayer(___,Name=Value) は、1 つ以上の名前と値の引数を使用して追加オプションを指定します。

すべて折りたたむ

層入力に flatten 関数を適用する関数層オブジェクトを作成します。flatten 関数は、この例の終わりに定義されており、入力 dlarray の空間次元を折りたたんでチャネルの次元にします。

customFlattenLayer = functionLayer(@(X) flatten(X),Formattable=true)
customFlattenLayer = 
  FunctionLayer with properties:

             Name: ''
       PredictFcn: @(X)flatten(X)
      Formattable: 1
    Acceleratable: 0

   Learnable Parameters
    No properties.

   State Parameters
    No properties.

  Show all properties

networkDataLayout オブジェクトを使用して、層への入力のサイズと次元を指定します。

layout = networkDataLayout([227 227 3 NaN],"SSCB")
layout = 
  networkDataLayout with properties:

      Size: [227 227 3 NaN]
    Format: 'SSCB'

checkLayer 関数を使用して、層が有効であることをチェックします。

checkLayer(customFlattenLayer,layout)
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.25745 seconds.

この場合、関数は層に関する問題を検出していません。

Flatten 関数

flatten 関数は、形式を整えた dlarray を入力として受け取り、入力 dlarray の空間次元を折りたたんでチャネルの次元にします。入力 dlarray には、時間 ("T") または指定なし ("U") の次元を含めてはなりません。

function Y = flatten(X)
% Find spatial, channel, and batch dimensions.
idxS = finddim(X,"S");
idxC = finddim(X,"C");
idxB = finddim(X,"B");

% Determine size of spatial and channel dimensions.
sizeS = size(X,idxS);
sizeC = size(X,idxC);

if ~isempty(idxB)
    % If the input has a batch dimension, determine the size of the output
    % channel dimension.
    numChannels = sizeC*prod(sizeS,"all");
    sizeB = size(X,idxB);

    % Reshape and format output in "CB" format.
    X = reshape(X,[numChannels sizeB]);
    Y = dlarray(X,"CB");
else
    % If the input does not have a batch dimension, reshape and output in
    % "CU" format.
    X = X(:);
    Y = dlarray(X,"CU");
end

end

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

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

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

layer = sreluLayer;

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

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

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

checkLayer(layer,layout)
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.076363 seconds.

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

入力にソフトサイン演算を適用する関数層オブジェクトを作成します。ソフトサイン演算は、関数 f(x)=x1+|x| で表されます。

layer = functionLayer(@(X) X./(1 + abs(X)))
layer = 
  FunctionLayer with properties:

             Name: ''
       PredictFcn: @(X)X./(1+abs(X))
      Formattable: 0
    Acceleratable: 0

   Learnable Parameters
    No properties.

   State Parameters
    No properties.

  Show all properties

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

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

validInputSize = [5 5 20];
checkLayer(layer,validInputSize)
Skipping initialization tests. To run initialization tests specify a networkDataLayout object.
 
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:
	 12 Passed, 0 Failed, 0 Incomplete, 22 Skipped.
	 Time elapsed: 0.12033 seconds.

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

複数の観測値のチェック

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

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

layer = functionLayer(@(X) X./(1 + abs(X)));
validInputSize = [5 5 20];
checkLayer(layer,validInputSize,ObservationDimension=4)
Skipping initialization tests. To run initialization tests specify a networkDataLayout object.
 
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:
	 18 Passed, 0 Failed, 0 Incomplete, 16 Skipped.
	 Time elapsed: 0.040378 seconds.

この場合、関数は層に関する問題を検出していません。

カスタム層 codegenSReLULayer について、コード生成の互換性をチェックします。

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

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

layer = codegenSReLULayer;

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

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

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

checkLayer(layer,layout,CheckCodegenCompatibility=true)
Skipping GPU tests. No compatible GPU device found.
 
Running nnet.checklayer.TestLayerWithoutBackward
.......... .......... .....
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 25 Passed, 0 Failed, 0 Incomplete, 9 Skipped.
	 Time elapsed: 0.84524 seconds.

この関数によって層に関する問題は検出されていません。

入力引数

すべて折りたたむ

チェックする層。nnet.layer.Layer オブジェクトまたは FunctionLayer オブジェクトとして指定します。

layer を評価する前に初期化が必要な学習可能なパラメーターまたは状態パラメーターが層にある場合、または層にカスタム initialize 関数がある場合は、layout を指定するか、層を初期化しなければなりません。

独自のカスタム層を定義する方法の例については、学習可能なパラメーターを含むカスタム深層学習層の定義を参照してください。指定した関数を適用する層を作成するには、functionLayer を使用します。

R2023b 以降

層への各入力に対する有効なネットワーク データ レイアウト。networkDataLayout オブジェクトとして指定します。

  • 1 つの入力をもつ層の場合は、1 つの layout を指定します。

  • 複数の入力をもつ層の場合は、各入力に対して layout を指定します。たとえば、2 つの入力をもつ層の場合は、layout1,layout2 を指定します。ここで、layout1 は最初の入力の有効なネットワーク データ レイアウトに対応し、layout2 は 2 番目の入力の有効なネットワーク データ レイアウトに対応します。

層を nnet.layer.Formattable クラスから継承する場合は、層への各入力について networkDataLayout を指定しなければなりません。

入力サイズが大きい場合、勾配チェックの実行に時間がかかります。チェックを高速化するには、Size プロパティを使用して、より小さいサイズのネットワーク データ レイアウトを指定します。

層の有効な入力サイズ。正の整数のベクトルとして指定するか、正の整数のベクトルの cell 配列として指定します。

  • 1 つの入力をもつ層の場合は、validInputSize を入力データの次元に対応する整数のベクトルとして指定します。たとえば、[5 5 10] は、サイズが 5×5×10 の有効な入力データに対応します。

  • 複数の入力をもつ層の場合は、validInputSize をベクトルの cell 配列として指定します。各ベクトルは層入力に対応し、ベクトルの要素は対応する入力データの次元に対応します。たとえば、{[24 24 20],[24 24 10]} は 2 つの入力の有効な入力サイズに対応します。ここで、24×24×20 は最初の入力の有効な入力サイズであり、24×24×10 は 2 番目の入力の有効な入力サイズです。

詳細については、層入力サイズを参照してください。

入力サイズが大きい場合、勾配チェックの実行に時間がかかります。チェックを高速化するには、指定する有効な入力サイズを小さくします。

例: [5 5 10]

例: {[24 24 20],[24 24 10]}

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | cell

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: ObservationDimension=4 は観測次元を 4 に設定します。

観測次元。正の整数または正の整数の行ベクトルとして指定します。既定は、ネットワーク データ レイアウト layout1,...,layoutN のバッチ ("B") 次元の位置です。

観測次元は、層入力データのどの次元が観測値に対応するかを指定します。たとえば、層が想定する入力データのサイズが h×w×c×N である場合 (ここで、hwc はそれぞれ入力データの高さ、幅、チャネル数に対応し、N は観測値の数に対応する)、観測次元は 4 になります。詳細については、層入力サイズを参照してください。

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

例: 4

例: [4 4 2]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

コード生成テストを有効にするフラグ。0 (false) または 1 (true) として指定します。

CheckCodegenCompatibility1 (true) の場合、Format プロパティにバッチ ("B") 次元を含む layout を指定するか、ObservationDimension オプションを指定しなければなりません。

CheckCodegenCompatibility オプションでは、nnet.layer.Formattable から継承された層はサポートされません。代わりに、analyzeNetworkForCodegen (MATLAB Coder) 関数を使用してください。

さらに、サードパーティのライブラリを使用するコードを生成する場合は、次の点に注意してください。

  • コード生成では、2 次元イメージ入力または特徴入力のみをもつカスタム層がサポートされます。

  • 層の順方向関数の入力と出力は、同じバッチ サイズでなければなりません。

  • 非スカラーのプロパティは、single、double、または文字配列でなければなりません。

  • スカラーのプロパティは、数値型、logical 型、または string 型でなければなりません。

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

コード生成をサポートするカスタム層を定義する方法を示す例については、コード生成用のカスタム深層学習層の定義を参照してください。

データ型: logical

詳細

すべて折りたたむ

アルゴリズム

すべて折りたたむ

バージョン履歴

R2018a で導入

すべて展開する