Main Content

入れ子になった深層学習層の定義

目的の分類または回帰問題に必要な層が Deep Learning Toolbox™ に用意されていない場合、この例を指針として使用して独自のカスタム層を定義できます。組み込まれている層の一覧については、深層学習層の一覧を参照してください。

それ自体が層グラフを定義するカスタム層を作成するには、層定義の properties (Learnable) セクションで、学習可能パラメーターとして dlnetwork オブジェクトを宣言します。この手法は "ネットワーク構成" と呼ばれます。以下の場合にネットワーク構成を使用できます。

  • 学習可能な層のブロックを表す単一のカスタム層 (残差ブロックなど) の作成。

  • コントロール フローをもつネットワーク (入力データに応じて動的に変更できるセクションをもつネットワークなど) の作成。

  • ループをもつネットワーク (自分自身に出力をフィードバックするセクションをもつネットワークなど) の作成。

学習可能パラメーターと状態パラメーターの両方をもつ入れ子ネットワーク (たとえば、バッチ正規化層または LSTM 層をもつネットワークなど) の場合は、層定義の properties (Learnable, State) セクションでネットワークを宣言します。

詳細については、深層学習のネットワーク構成を参照してください。

この例では、残差ブロックを表すカスタム層を作成する方法を説明します。カスタム層 residualBlockLayer は、畳み込み層、グループ正規化層、ReLU 層、加算層から成る学習可能な層ブロックで構成され、スキップ接続も含んでいます。スキップ接続には、オプションとして畳み込み層とグループ正規化層が含まれることがあります。層には、各分岐への入力として 2 回使用される単一の入力があります。次の図に、残差ブロックの構造を示します。

Structure of residual block. It contains a convolution, a group normalization, a ReLU, a second convolution, a second group normalization, an addition, and a ReLU layer connected in series. There is a skip connection from the block input to the addition layer. There is also another convolution and group normalization layer connected in series that appears on the skip connection. The layers appearing on the skip connection are highlighted as optional.

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

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

  2. 層のプロパティの宣言 — 層のプロパティ (学習可能なパラメーターや状態パラメーターなど) を指定します。

  3. コンストラクター関数の作成 (オプション) — 層の構築とそのプロパティ初期化の方法を指定します。コンストラクター関数を指定しない場合、作成時に NameDescription、および Type の各プロパティは [] で初期化され、層の入力および出力の数は 1 に設定されます。

  4. 順方向関数の作成 — 予測時および学習時に層経由でデータを順方向にパス (順伝播) する方法を指定します。

  5. リセット ステート関数の作成 (オプション) — 状態パラメーターをリセットする方法を指定します。

  6. 逆方向関数の作成 (オプション) — 入力データおよび学習可能なパラメーターにおける損失の微分を指定します (逆伝播)。逆方向関数を指定しない場合、順方向関数は dlarray オブジェクトをサポートしなければなりません。

中間層テンプレート

中間層のテンプレートを MATLAB の新しいファイルにコピーします。このテンプレートは、中間層のクラス定義の構造を示しています。概要は次のとおりです。

  • 層のプロパティ、学習可能なパラメーター、状態パラメーターに関する、オプションの properties ブロック。

  • 層のコンストラクター関数。

  • 関数 predict とオプションの関数 forward

  • 状態プロパティをもつ層におけるオプションの関数 resetState

  • オプションの関数 backward

classdef myLayer < nnet.layer.Layer % ...
        % & nnet.layer.Formattable ... % (Optional) 
        % & nnet.layer.Acceleratable % (Optional)

    properties
        % (Optional) Layer properties.

        % Declare layer properties here.
    end

    properties (Learnable)
        % (Optional) Layer learnable parameters.

        % Declare learnable parameters here.
    end

    properties (State)
        % (Optional) Layer state parameters.

        % Declare state parameters here.
    end

    properties (Learnable, State)
        % (Optional) Nested dlnetwork objects with both learnable
        % parameters and state parameters.

        % Declare nested networks with learnable and state parameters here.
    end

    methods
        function layer = myLayer()
            % (Optional) Create a myLayer.
            % This function must have the same name as the class.

            % Define layer constructor function here.
        end

        function [Z,state] = predict(layer,X)
            % Forward input data through the layer at prediction time and
            % output the result and updated state.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Input data
            % Outputs:
            %         Z     - Output of layer forward function
            %         state - (Optional) Updated layer state
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Z with 
            %    Z1,...,ZM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer predict function here.
        end

        function [Z,state,memory] = forward(layer,X)
            % (Optional) Forward input data through the layer at training
            % time and output the result, the updated state, and a memory
            % value.
            %
            % Inputs:
            %         layer - Layer to forward propagate through 
            %         X     - Layer input data
            % Outputs:
            %         Z      - Output of layer forward function 
            %         state  - (Optional) Updated layer state 
            %         memory - (Optional) Memory value for custom backward
            %                  function
            %
            %  - For layers with multiple inputs, replace X with X1,...,XN, 
            %    where N is the number of inputs.
            %  - For layers with multiple outputs, replace Z with 
            %    Z1,...,ZM, where M is the number of outputs.
            %  - For layers with multiple state parameters, replace state 
            %    with state1,...,stateK, where K is the number of state 
            %    parameters.

            % Define layer forward function here.
        end

        function layer = resetState(layer)
            % (Optional) Reset layer state.

            % Define reset state function here.
        end

        function [dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)
            % (Optional) Backward propagate the derivative of the loss
            % function through the layer.
            %
            % Inputs:
            %         layer   - Layer to backward propagate through 
            %         X       - Layer input data 
            %         Z       - Layer output data 
            %         dLdZ    - Derivative of loss with respect to layer 
            %                   output
            %         dLdSout - (Optional) Derivative of loss with respect 
            %                   to state output
            %         memory  - Memory value from forward function
            % Outputs:
            %         dLdX   - Derivative of loss with respect to layer input
            %         dLdW   - (Optional) Derivative of loss with respect to
            %                  learnable parameter 
            %         dLdSin - (Optional) Derivative of loss with respect to 
            %                  state input
            %
            %  - For layers with state parameters, the backward syntax must
            %    include both dLdSout and dLdSin, or neither.
            %  - For layers with multiple inputs, replace X and dLdX with
            %    X1,...,XN and dLdX1,...,dLdXN, respectively, where N is
            %    the number of inputs.
            %  - For layers with multiple outputs, replace Z and dlZ with
            %    Z1,...,ZM and dLdZ,...,dLdZM, respectively, where M is the
            %    number of outputs.
            %  - For layers with multiple learnable parameters, replace 
            %    dLdW with dLdW1,...,dLdWP, where P is the number of 
            %    learnable parameters.
            %  - For layers with multiple state parameters, replace dLdSin
            %    and dLdSout with dLdSin1,...,dLdSinK and 
            %    dLdSout1,...,dldSoutK, respectively, where K is the number
            %    of state parameters.

            % Define layer backward function here.
        end
    end
end

層の命名とスーパークラスの指定

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

classdef residualBlockLayer < nnet.layer.Layer % ...
        % & nnet.layer.Formattable ... % (Optional) 
        % & nnet.layer.Acceleratable % (Optional)
    ...
end

逆方向関数を指定しない場合、既定では、層関数は "書式化されていない" dlarray オブジェクトを入力として受け取ります。層が、"書式化された" dlarray オブジェクトを入力として受け取り、さらに書式化された dlarray オブジェクトを出力するように指定するには、カスタム層の定義時に nnet.layer.Formattable クラスから継承します。

dlnetwork を使用してデータを渡すには、書式化された dlarray オブジェクトが必要です。層を有効にして、書式化された dlarray オブジェクトを入力として受け取れるようにするには、nnet.layer.Formattable から継承します。この層の関数は高速化をサポートするため、nnet.layer.Acceleratable からも継承します。カスタム層の関数の高速化に関する詳細については、Custom Layer Function Accelerationを参照してください。

classdef residualBlockLayer < nnet.layer.Layer ...
        & nnet.layer.Formattable ...
        & nnet.layer.Acceleratable

    ...
end

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

    methods
        function layer = residualBlockLayer()           
            ...
        end

        ...
     end

層の保存

層のクラス ファイルを residualBlockLayer.m という名前の新しいファイルに保存します。このファイル名は層の名前に一致しなければなりません。この層を使用するには、このファイルを現在のフォルダーまたは MATLAB パス上のフォルダーに保存しなければなりません。

プロパティおよび学習可能なパラメーターの宣言

層のプロパティを properties セクションで宣言し、学習可能なパラメーターを properties (Learnable) セクションにリストすることによって宣言します。

既定では、カスタム中間層に次のプロパティがあります。これらのプロパティを properties セクションで宣言しないでください。

Property説明
Name層の名前。文字ベクトルまたは string スカラーとして指定します。Layer 配列入力の場合、関数 trainNetworkassembleNetworklayerGraph、および dlnetwork は、名前が '' の層に自動的に名前を割り当てます。
Description

層についての 1 行の説明。string スカラーまたは文字ベクトルとして指定します。この説明は、層が Layer 配列に表示されるときに表示されます。

層の説明を指定しない場合、層のクラス名が表示されます。

Type

層のタイプ。文字ベクトルまたは string スカラーとして指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。

層のタイプを指定しない場合、層のクラス名が表示されます。

NumInputs層の入力の数。正の整数として指定します。この値を指定しない場合、NumInputsInputNames の名前の数に自動的に設定されます。既定値は 1 です。
InputNames層の入力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumInputs が 1 より大きい場合、InputNames{'in1',...,'inN'} に自動的に設定されます。ここで、N = NumInputs です。既定値は {'in'} です。
NumOutputs層の出力の数。正の整数として指定します。この値を指定しない場合、NumOutputsOutputNames の名前の数に自動的に設定されます。既定値は 1 です。
OutputNames層の出力の名前。文字ベクトルの cell 配列として指定します。この値を指定せず、NumOutputs が 1 より大きい場合、OutputNames{'out1',...,'outM'} に自動的に設定されます。ここで、M = NumOutputs です。既定値は {'out'} です。

層にその他のプロパティがない場合は、properties セクションを省略できます。

ヒント

複数の入力がある層を作成する場合、層のコンストラクターで NumInputsInputNames のいずれかのプロパティを設定しなければなりません。複数の出力がある層を作成している場合、層のコンストラクターで NumOutputsOutputNames のいずれかのプロパティを設定しなければなりません。例については、複数の入力があるカスタム深層学習層の定義を参照してください。

この残差ブロック層には追加のプロパティが必要ないため、properties セクションは削除できます。

このカスタム層で唯一の学習可能なパラメーターは、dlnetwork オブジェクトとして指定された残差ブロック自体です。この学習可能なパラメーターを properties (Learnable) セクションで宣言し、パラメーター Network を呼び出します。

    properties (Learnable)
        % Layer learnable parameters
    
        % Residual block.
        Network
    end

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

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

残差ブロック層のコンストラクター関数には、入力引数が 4 つ必要です。

  • 畳み込みフィルターの数

  • ストライド (オプション。ストライドの既定値は 1)

  • スキップ接続に畳み込み層を含めるためのフラグ (オプション。フラグの既定値は false)

  • 層の名前 (オプション。既定の名前は '')

コンストラクター関数 residualBlockLayer で、必須の入力引数 numFilters を指定し、オプションの引数を NameValueArgs という名前をもつ名前と値のペアとして指定します。関数の構文を説明するコメントを関数の上部に追加します。

        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')

            ...
        end

入力引数の解析

arguments ブロックを使用して入力引数を解析します。関数構文と同じ順序で引数をリストし、既定値を指定します。その後、入力 NameValueArgs から値を抽出します。

            % Parse input arguments.
            arguments
                numFilters                
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
            
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;

層のプロパティの初期化

コンストラクター関数で、層のプロパティ (dlnetwork オブジェクトなど) を初期化します。コメント % Layer constructor function goes here を、層のプロパティを初期化するコードに置き換えます。

Name プロパティを入力引数 name に設定します。

            % Set layer name.
            layer.Name = name;

層の Description プロパティを設定して、層に 1 行の説明を指定します。層とプロパティ (オプション) の説明を設定します。

            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;

Type プロパティを設定して層のタイプを指定します。Type の値は、層が Layer 配列に表示されるときに表示されます。

            % Set layer type.
            layer.Type = "Residual Block";

残差ブロックを定義します。残差ブロック層を、入力層を持たない未初期化の入れ子にされた dlnetwork オブジェクトとして作成し、学習時に学習可能パラメーターと状態パラメーターを自動的に初期化することができます。詳細については、学習可能な dlnetwork オブジェクトを学習で使用するための自動的な初期化を参照してください。

まず、ブロックの主要層を含む層配列を作成し、その配列を層グラフに変換します。

            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
                
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
            
            lgraph = layerGraph(layers);

次に、スキップ接続を追加します。includeSkipConvolution フラグが true の場合は、畳み込み層とグループ正規化層をスキップ接続に含めます。

            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
                
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2'); 
            end

入力層がないため、このネットワークには 2 つの未接続の入力があります。ネットワークにスキップ接続がない場合、'conv2' 層への入力と 'add' 層への 1 つの入力は未接続です。ネットワークにスキップ接続がある場合、未接続の入力は 'conv1' 層と 'convSkip' 層への入力です。

最後に、層グラフを dlnetwork オブジェクトに変換し、層の Network プロパティを設定します。未初期化の dlnetwork オブジェクトを作成します。dlnetwork オブジェクトの重みと学習可能パラメーターは、ネットワーク全体が学習用に組み立てられるときに自動的に初期化されます。

            % Convert to dlnetwork.
            net = dlnetwork(lgraph,'Initialize',false);
            
            % Set Network property.
            layer.Network = net;

完成したコンストラクター関数を表示します。

        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')
    
            % Parse input arguments.
            arguments
                numFilters
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
    
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;
    
            % Set layer name.
            layer.Name = name;
    
            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;
            
            % Set layer type.
            layer.Type = "Residual Block";
    
            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
    
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
    
            lgraph = layerGraph(layers);
    
            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
     
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2');  
            end 
    
            % Convert to dlnetwork.
            net = dlnetwork(lgraph,'Initialize',false);
    
            % Set Network property.
            layer.Network = net;
        end

このコンストラクター関数を使用すると、64 個のフィルターとストライド 2 をもち、スキップ接続内に畳み込み層をもつ 'res5' という名前の残差ブロック層が、コマンド residualBlockLayer(64,'Stride',2,'IncludeSkipConvolution',true,'Name','res5') によって作成されます。必要な重みのサイズとパラメーターのサイズは、ネットワーク全体が学習用に組み立てられるときに決定されます。

順方向関数の作成

予測時と学習時に使用する層の順方向関数を作成します。

"予測時" に層経由でデータを順伝播させて結果を出力する、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 は適切な層処理を使用して予測を行います。

残差ブロックの入力および出力はそれぞれ 1 つのみであるため、カスタム層の predict の構文は Z = predict(layer,X) となります。

既定では、層は学習時に predict を順方向関数として使用します。学習時に別の順方向関数を使用する、またはカスタム逆方向関数に必要な値を保持するには、forward という名前の関数も作成しなければなりません。

入力の次元は、データのタイプと結合層の出力によって異なります。

層入力入力サイズ観察値の次元
特徴ベクトルc 行 N 列。ここで、c はチャネル数に対応し、N は観測値の数です。2
2 次元イメージh×w×c×N。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。N は観測値の数です。4
3 次元イメージh×w×d×c×N。ここで、h、w、d、および c は、それぞれ 3 次元イメージの高さ、幅、深さ、およびチャネル数に対応します。N は観測値の数です。5
ベクトル シーケンスc×N×S。ここで、c はシーケンスの特徴の数、N は観測値の数、S はシーケンス長です。2
2 次元イメージ シーケンスh×w×c×N×S。ここで、h、w、および c は、それぞれイメージの高さ、幅、およびチャネル数に対応します。N は観測値の数、S はシーケンス長です。4
3 次元イメージ シーケンスh×w×d×c×N×S。ここで、h、w、d、および c は、それぞれ 3 次元イメージの高さ、幅、深さ、およびチャネル数に対応します。N は観測値の数、S はシーケンス長です。5

シーケンスを出力する層の場合、その層は、任意の長さのシーケンス、または時間次元をもたないデータを出力できます。関数 trainNetwork を使用して、シーケンスを出力するネットワークに学習させる場合は、入力シーケンスと出力シーケンスの長さが一致していなければならない点に注意してください。

残差ブロック層の場合、層のフォワード パスは単純に dlnetwork オブジェクトのフォワード パスになります。

この演算をカスタム層の関数 predict に実装します。予測用に dlnetwork のフォワード パスを実行するには、dlnetwork オブジェクトの関数 predict を使用します。この場合、残差ブロック層への入力は、dlnetwork オブジェクトへの両方の未接続入力への入力として使用されるため、dlnetwork オブジェクトの predict の構文は Z = predict(net,X,X) となります。

学習時の dlnetwork オブジェクトの動作は同じであり、残差ブロック層では学習にメモリまたは別の順方向関数が必要ないため、クラス ファイルから関数 forward を削除できます。

関数 predict を作成し、関数の構文を説明するコメントを関数の上部に追加します。

        function Z = predict(layer, X)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer - Layer to forward propagate through
            %         X     - Input data
            % Outputs:
            %         Z - Output of layer forward function

            % Predict using network.
            net = layer.Network;
            Z = predict(net,X,X);
            
        end

関数 predictdlarray オブジェクトをサポートする関数のみを使用するため、関数 backward の定義はオプションです。dlarray オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。

完成した層

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

classdef residualBlockLayer < nnet.layer.Layer ...
        & nnet.layer.Formattable ...
        & nnet.layer.Acceleratable
    % Example custom residual block layer.


    properties (Learnable)
        % Layer learnable parameters
    
        % Residual block.
        Network
    end
    
    methods
        function layer = residualBlockLayer(numFilters,NameValueArgs)
            % layer = residualBlockLayer(numFilters) creates a residual
            % block layer with the specified number of filters.
            %
            % layer = residualBlockLayer(numFilters,Name,Value) specifies
            % additional options using one or more name-value pair
            % arguments:
            % 
            %     'Stride'                 - Stride of convolution operation 
            %                                (default 1)
            %
            %     'IncludeSkipConvolution' - Flag to include convolution in
            %                                skip connection
            %                                (default false)
            %
            %     'Name'                   - Layer name
            %                                (default '')
    
            % Parse input arguments.
            arguments
                numFilters
                NameValueArgs.Stride = 1
                NameValueArgs.IncludeSkipConvolution = false
                NameValueArgs.Name = ''
            end
    
            stride = NameValueArgs.Stride;
            includeSkipConvolution = NameValueArgs.IncludeSkipConvolution;
            name = NameValueArgs.Name;
    
            % Set layer name.
            layer.Name = name;
    
            % Set layer description.
            description = "Residual block with " + numFilters + " filters, stride " + stride;
            if includeSkipConvolution
                description = description + ", and skip convolution";
            end
            layer.Description = description;
            
            % Set layer type.
            layer.Type = "Residual Block";
    
            % Define nested layer graph.
            layers = [
                convolution2dLayer(3,numFilters,'Padding','same','Stride',stride,'Name','conv1')
                groupNormalizationLayer('all-channels','Name','gn1')
                reluLayer('Name','relu1')
                convolution2dLayer(3,numFilters,'Padding','same','Name','conv2')
                groupNormalizationLayer('channel-wise','Name','gn2')
    
                additionLayer(2,'Name','add')
                reluLayer('Name','relu2')];
    
            lgraph = layerGraph(layers);
    
            % Add skip connection.
            if includeSkipConvolution
                layers = [
                    convolution2dLayer(1,numFilters,'Stride',stride,'Name','convSkip')
                    groupNormalizationLayer('all-channels','Name','gnSkip')];
     
                lgraph = addLayers(lgraph,layers);
                lgraph = connectLayers(lgraph,'gnSkip','add/in2');  
            end 
    
            % Convert to dlnetwork.
            net = dlnetwork(lgraph,'Initialize',false);
    
            % Set Network property.
            layer.Network = net;
        end
        
        function Z = predict(layer, X)
            % Forward input data through the layer at prediction time and
            % output the result.
            %
            % Inputs:
            %         layer - Layer to forward propagate through
            %         X     - Input data
            % Outputs:
            %         Z - Output of layer forward function

            % Predict using network.
            net = layer.Network;
            Z = predict(net,X,X);
            
        end
    end
end

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)を参照してください。

この例では、predict で使用される MATLAB 関数はすべて、dlarray オブジェクトをサポートしているため、層は GPU 互換です。

checkLayer を使用した層の有効性のチェック

関数 checkLayer を使用して、カスタム層 residualBlockLayer について層の有効性をチェックします。

残差ブロック層のインスタンスを作成します。この層にアクセスするには、この例をライブ スクリプトとして開きます。

numFilters = 64;

layer = residualBlockLayer(numFilters)
layer = 
  residualBlockLayer with properties:

       Name: ''

   Learnable Parameters
    Network: [1x1 dlnetwork]

   State Parameters
    No properties.

  Show all properties

関数 checkLayer を使用して、層の有効性をチェックします。層には 4 次元配列を入力する必要があり、最初の 3 つの次元は前の層の出力における高さ、幅、およびチャネル数に対応し、4 番目の次元は観測値に対応します。一般的な入力サイズを指定し、'ObservationDimension' オプションを 4 に設定します。

validInputSize = [56 56 64];
checkLayer(layer,validInputSize,'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:
	 18 Passed, 0 Failed, 0 Incomplete, 10 Skipped.
	 Time elapsed: 4.2298 seconds.

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

参考

| | | | |

関連するトピック