Main Content

사용자 지정 딥러닝 계층 정의하기

이 항목에서는 문제에 맞게 사용자 지정 딥러닝 계층을 정의하는 방법을 설명합니다. Deep Learning Toolbox™에 내장된 계층 목록은 딥러닝 계층 목록 항목을 참조하십시오.

Deep Learning Toolbox가 작업에 필요한 계층을 제공하지 않을 경우, 이 항목을 가이드로 참고하여 자신만의 고유한 사용자 지정 계층을 정의할 수 있습니다. 사용자 지정 계층을 정의한 후에는 이 계층이 유효하고, GPU와 호환되며, 올바르게 정의된 기울기를 출력하는지 자동으로 확인할 수 있습니다.

신경망 계층 아키텍처

훈련 중에 반복적으로 신경망이 순방향으로 통과되고 역방향으로 통과됩니다.

신경망을 순방향으로 통과하는 동안 각 계층이 이전 계층의 출력값을 받아서 함수를 적용한 다음 결과를 다음 계층으로 출력(순방향 전파)합니다. 상태 유지 계층(예: LSTM 계층)은 계층 상태도 업데이트합니다.

계층은 여러 개의 입력값과 출력값을 가질 수 있습니다. 예를 들어, 하나의 계층은 여러 개의 이전 계층에서 X1, …, XN을 받아서 출력값 Y1, …, YM을 다음 계층으로 순방향 전파할 수 있습니다.

신경망의 순방향 통과 끝에서 소프트웨어는 예측값과 목표값 사이의 손실 L을 계산합니다.

신경망을 역방향으로 통과하는 중에는 각 계층이 해당 계층의 출력값에 대한 손실의 도함수를 받아서 입력값에 대한 손실 L의 도함수를 계산한 다음 결과를 역방향 전파합니다. 계층에 학습 가능한 파라미터가 있는 경우 계층 가중치(학습 가능한 파라미터)의 도함수도 계산합니다. 이 가중치의 도함수를 사용하여 학습 가능한 파라미터를 업데이트합니다. 계산을 절약하기 위해 순방향 함수는 선택적 메모리 출력을 사용하여 역방향 함수와 정보를 공유할 수 있습니다.

심층 신경망을 통과하는 데이터의 흐름을 보여주는 다음 그림은 단일 입력값 X, 단일 출력값 Y, 그리고 학습 가능한 파라미터 W가 있는 계층을 통과하여 흐르는 데이터를 보여 줍니다.

Network diagram showing the flow of data through a neural network during training.

사용자 지정 계층 템플릿

사용자 지정 계층을 정의하려면 다음 클래스 정의 템플릿을 사용하십시오. 이 템플릿은 사용자 지정 계층 클래스 정의의 구조를 제공합니다. 다음과 같은 내용을 포함합니다.

  • 계층 속성, 학습 가능한 파라미터, 상태 파라미터에 대한 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 layer = initialize(layer,layout)
            % (Optional) Initialize layer learnable and state parameters.
            %
            % Inputs:
            %         layer  - Layer to initialize
            %         layout - Data layout, specified as a networkDataLayout
            %                  object
            %
            % Outputs:
            %         layer - Initialized layer
            %
            %  - For layers with multiple inputs, replace layout with 
            %    layout1,...,layoutN, where N is the number of inputs.
            
            % Define layer initialization function here.
        end
        

        function [Y,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:
            %         Y     - 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 Y with 
            %    Y1,...,YM, 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 [Y,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:
            %         Y      - 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 Y with 
            %    Y1,...,YM, 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,Y,dLdY,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 
            %         Y       - Layer output data 
            %         dLdY    - 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 Y and dLdY with
            %    Y1,...,YM and dLdY,...,dLdYM, 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

형식이 지정된 입력값과 출력값

dlarray 객체를 사용하면 차원에 레이블을 지정할 수 있기 때문에 차원이 높은 데이터로 작업하기가 더 쉽습니다. 예를 들어 "S", "T", "C", "B" 레이블을 사용하여 어떤 차원이 각각 공간 차원, 시간 차원, 채널 차원, 배치 차원에 해당하는지 레이블을 지정할 수 있습니다. 지정되지 않은 차원과 기타 자원에는 "U" 레이블을 사용하십시오. 특정 차원에 대해 연산을 수행하는 dlarray 객체 함수에는 직접 dlarray 객체 형식을 지정하거나 DataFormat 옵션을 사용하여 차원 레이블을 지정할 수 있습니다.

사용자 지정 계층에서 형식이 지정된 dlarray 객체를 사용하면 입력값과 출력값의 형식이 서로 다른 계층(예: 차원을 치환, 추가 또는 제거하는 계층)을 정의할 수 있습니다. 예를 들어 공간(spatial), 공간(spatial), 채널(channel), 배치(batch)를 뜻하는 형식 "SSCB"의 영상으로 구성된 미니 배치를 입력값으로 취하고, 채널(channel), 배치(batch), 시간(time)을 뜻하는 형식 "CBT"의 시퀀스로 구성된 미니 배치를 출력값으로 취하는 계층을 정의할 수 있습니다. 형식이 지정된 dlarray 객체를 사용하면 서로 다른 입력 형식을 가진 데이터에 대해 연산을 수행할 수 있는 계층도 정의할 수 있습니다. 예를 들면 형식이 "SSCB"(공간, 공간, 채널, 배치)인 입력값과 "CBT"(채널, 배치, 시간)인 입력값을 지원하는 계층을 정의할 수 있습니다.

역방향 함수를 지정하지 않았다면 계층 함수는 기본적으로 형식이 지정되지 않은 dlarray 객체를 입력값으로 받습니다. 계층이 형식이 지정된 dlarray 객체를 입력값으로 받고 형식이 지정된 dlarray 객체를 출력하도록 지정하려면 사용자 지정 계층을 정의할 때 nnet.layer.Formattable 클래스도 상속하십시오.

형식이 지정된 입력값을 갖는 사용자 지정 계층을 정의하는 방법을 보여주는 예제는 Define Custom Deep Learning Layer with Formatted Inputs 항목을 참조하십시오.

사용자 지정 계층 가속

사용자 지정 계층을 정의할 때 역방향 함수를 지정하지 않을 경우 자동 미분을 사용하여 기울기가 자동으로 결정됩니다.

역방향 함수가 없는 사용자 지정 계층을 사용하여 신경망을 훈련시킬 경우, 사용자 지정된 계층 순방향 함수의 각 입력 dlarray 객체를 추적하여 자동 미분에 사용할 계산 그래프를 결정합니다. 이 추적 과정은 얼마간의 시간이 걸릴 수 있으며 동일한 추적을 다시 계산하게 될 수도 있습니다. 추적을 최적화, 캐시하고 재사용하면 신경망을 훈련할 때 기울기 계산 속도를 높일 수 있습니다. 또한 훈련 후에는 이러한 추적을 재사용하여 신경망 예측 속도를 높일 수도 있습니다.

추적은 계층 입력값의 크기, 형식, 기본 데이터형에 따라 달라집니다. 즉, 어떤 크기나 형식, 기본 데이터형을 갖는 입력값이 캐시에 포함되어 있지 않으면 계층은 이 입력값에 대해 새로운 추적을 트리거합니다. 이전에 캐시된 추적과 값만 다른 입력값은 새 추적을 트리거하지 않습니다.

사용자 지정 계층이 가속을 지원함을 나타내려면 사용자 지정 계층을 정의할 때 nnet.layer.Acceleratable 클래스에서도 상속하십시오. 사용자 지정 계층이 nnet.layer.Acceleratable에서 상속되는 경우 dlnetwork 객체에 데이터를 통과시킬 때 추적이 자동으로 캐시됩니다.

예를 들어 사용자 지정 계층 myLayer가 가속을 지원함을 나타내려면 다음 구문을 사용하십시오.

classdef myLayer < nnet.layer.Layer & nnet.layer.Acceleratable
    ...
end

가속 관련 고려 사항

추적 캐시는 그 특성상 모든 함수에 대해 가속을 지원하지는 않습니다.

캐시 과정에서는 변경이 예상되거나 외부 요인의 영향을 받는 값 또는 코드 구조체를 캐시할 수 있습니다. 다음과 같은 사용자 지정 계층을 가속할 때는 주의를 기울여야 합니다.

  • 난수를 생성하는 경우.

  • if 조건문과 while 루프를 사용하며 조건이 dlarray 객체의 값에 종속되는 경우.

캐시 과정은 추가 계산이 필요하기 때문에 경우에 따라 가속으로 인해 코드 실행 시간이 더 오래 걸릴 수 있습니다. 이는 자주 재사용되지 않는 새 캐시를 생성하는 데 시간이 쓰이는 경우에 발생할 수 있습니다. 예를 들어 서로 다른 시퀀스 길이의 여러 미니 배치를 함수에 전달하면 각각의 고유한 시퀀스 길이에 대해 새 추적이 트리거됩니다.

사용자 지정 계층 가속으로 인해 속도 저하가 발생하면 Acceleratable 클래스를 제거하여 가속을 비활성화할 수 있습니다. 또는 Acceleration 옵션을 "none"으로 설정하여 dlnetwork 객체 함수 predictforward의 가속을 비활성화할 수도 있습니다.

사용자 지정 계층에서 가속을 사용하는 방법에 대한 자세한 내용은 Custom Layer Function Acceleration 항목을 참조하십시오.

사용자 지정 계층 속성

클래스 정의의 properties 섹션에서 계층 속성을 선언합니다.

기본적으로 사용자 지정 계층은 다음과 같은 속성을 갖습니다. 다음 속성은 properties 섹션에서 선언하지 마십시오.

속성설명
Name계층 이름으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. Layer 배열 입력값에 대해 trainnetdlnetwork 함수는 이름이 ""인 계층에 자동으로 이름을 할당합니다.
Description

계층에 대한 한 줄 설명으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. 이 설명은 계층이 Layer 배열에 표시되는 경우에 나타납니다.

계층 설명을 지정하지 않으면 계층 클래스 이름이 표시됩니다.

Type

계층 유형으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. Type의 값은 계층이 Layer 배열에 표시되는 경우에 나타납니다.

계층 유형을 지정하지 않을 경우 계층 클래스 이름이 표시됩니다.

NumInputs계층에 대한 입력값의 개수로, 양의 정수로 지정됩니다. 이 값을 지정하지 않으면 NumInputsInputNames의 이름 개수로 자동으로 설정됩니다. 디폴트 값은 1입니다.
InputNames계층의 입력값 이름으로, 문자형 벡터로 구성된 셀형 배열로 지정됩니다. 이 값을 지정하지 않았고 NumInputs가 1보다 크면, InputNames{'in1',...,'inN'}으로 자동으로 설정됩니다. 여기서 NNumInputs와 동일합니다. 디폴트 값은 {'in'}입니다.
NumOutputs계층에 대한 출력값의 개수로, 양의 정수로 지정됩니다. 이 값을 지정하지 않으면 NumOutputsOutputNames의 이름 개수로 자동으로 설정됩니다. 디폴트 값은 1입니다.
OutputNames계층의 출력값 이름으로, 문자형 벡터로 구성된 셀형 배열로 지정됩니다. 이 값을 지정하지 않았고 NumOutputs가 1보다 크면, OutputNames{'out1',...,'outM'}으로 자동으로 설정됩니다. 여기서 MNumOutputs와 동일합니다. 디폴트 값은 {'out'}입니다.

계층에 다른 속성이 없는 경우 properties 섹션을 생략할 수 있습니다.

입력값이 여러 개인 계층을 만들 때는 계층 생성자에서 NumInputs 또는 InputNames 속성을 설정해야 합니다. 출력값이 여러 개인 계층을 만들 때는 계층 생성자에서 NumOutputs 또는 OutputNames 속성을 설정해야 합니다. 예제는 Define Custom Deep Learning Layer with Multiple Inputs 항목을 참조하십시오.

학습 가능한 파라미터

클래스 정의의 properties (Learnable) 섹션에서 계층의 학습 가능한 파라미터를 선언합니다.

숫자형 배열 또는 dlnetwork 객체를 학습 가능한 파라미터로 지정할 수 있습니다. dlnetwork 객체에 학습 가능한 파라미터와 상태 파라미터가 모두 있는 경우에는(예: LSTM 계층이 포함된 dlnetwork 객체), properties (Learnable, State) 섹션에 지정해야 합니다. 계층이 학습 가능한 파라미터를 갖지 않으면 Learnable 특성에 대한 properties 섹션을 생략할 수 있습니다.

선택적으로, 학습 가능한 파라미터의 학습률 인자와 L2 인자를 지정할 수 있습니다. 기본적으로 각각의 학습 가능한 파라미터에는 학습률 인자와 L2 인자가 1로 설정되어 있습니다. 내장 계층과 사용자 지정 계층 모두에 대해 다음 함수를 사용하여 학습률 인자와 L2 정규화 인자를 설정하고 가져올 수 있습니다.

함수설명
setLearnRateFactor학습 가능한 파라미터의 학습률 인자를 설정합니다.
setL2Factor학습 가능한 파라미터의 L2 정규화 인자를 설정합니다.
getLearnRateFactor학습 가능한 파라미터의 학습률 인자를 가져옵니다.
getL2Factor학습 가능한 파라미터의 L2 정규화 인자를 가져옵니다.

학습 가능한 파라미터의 학습률 인자와 L2 인자를 지정하려면 각각 구문 layer = setLearnRateFactor(layer,parameterName,value)layer = setL2Factor(layer,parameterName,value)를 사용하십시오.

학습 가능한 파라미터의 학습률 인자와 L2 인자의 값을 가져오려면 각각 구문 getLearnRateFactor(layer,parameterName)getL2Factor(layer,parameterName)을 사용하십시오.

예를 들어, 다음 구문은 학습 가능한 파라미터 "Alpha"의 학습률 인자를 0.1로 설정합니다.

layer = setLearnRateFactor(layer,"Alpha",0.1);

상태 파라미터

상태 유지 계층(예: 순환 계층)은 클래스 정의의 properties (State) 섹션에서 계층 상태 파라미터를 선언합니다. 학습 가능한 파라미터가 학습 가능한 파라미터와 상태 파라미터를 모두 갖는 dlnetwork 객체인 경우(예: LSTM 계층을 포함하는 dlnetwork 객체), properties (Learnable, State) 섹션에서 해당 속성을 지정해야 합니다. 계층이 상태 파라미터를 갖지 않으면 State 특성의 properties 섹션을 생략할 수 있습니다.

계층이 상태 파라미터를 갖고 있으면 순방향 함수는 업데이트된 계층 상태도 반환해야 합니다. 자세한 내용은 순방향 함수 항목을 참조하십시오.

사용자 지정된 상태 재설정 함수를 지정하려면 클래스 정의에 구문 layer = resetState(layer)를 갖는 함수를 포함시키십시오. 자세한 내용은 상태 재설정 함수 항목을 참조하십시오.

상태 파라미터를 갖는 사용자 지정 계층이 포함된 신경망을 trainnet 함수를 사용해서 병렬 훈련하는 것은 지원되지 않습니다. 상태 파라미터를 가진 사용자 지정 계층이 포함된 신경망을 훈련시킬 때는 ExecutionEnvironment 훈련 옵션이 "auto", "gpu" 또는 "cpu"여야 합니다.

학습 가능한 파라미터와 상태 파라미터 초기화

계층의 학습 가능한 파라미터와 상태 파라미터를 계층 생성자 함수 또는 사용자 지정 initialize 함수에서 초기화하도록 지정할 수 있습니다.

  • 학습 가능한 파라미터 또는 상태 파라미터 초기화에 계층 입력값의 크기 정보가 필요하지 않은 경우(예: 가중 덧셈 계층의 학습 가능한 가중치가 계층 입력값의 개수와 일치하는 크기의 벡터인 경우), 계층 생성자 함수에서 가중치를 초기화할 수 있습니다. 예제는 Define Custom Deep Learning Layer with Multiple Inputs 항목을 참조하십시오.

  • 학습 가능한 파라미터 또는 상태 파라미터 초기화에 계층 입력값의 크기 정보가 필요한 경우(예: SReLU 계층의 학습 가능한 가중치가 입력 데이터의 채널 개수와 일치하는 크기의 벡터인 경우), 입력 데이터 레이아웃에 대한 정보를 활용하는 사용자 지정 초기화 함수에서 가중치를 초기화할 수 있습니다. 예제는 학습 가능한 파라미터를 갖는 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오.

순방향 함수

일부 계층은 훈련 중과 예측 중에 서로 다르게 동작합니다. 예를 들어 드롭아웃 계층은 훈련 중에만 드롭아웃을 수행하며 예측 중에는 아무런 영향을 미치지 않습니다. 계층은 순방향 통과를 수행해야 할 때 predict 함수나 forward 함수 중 하나를 사용합니다. 예측 시점에 순방향 통과할 때는 계층이 predict 함수를 사용합니다. 훈련 시점에 순방향 통과할 때는 계층이 forward 함수를 사용합니다. 예측 시점과 훈련 시점에 각각 다르게 두 함수가 필요하지 않다면 forward 함수를 생략할 수 있습니다. 이런 경우 계층은 훈련 시점에 predict를 사용합니다.

계층이 상태 파라미터를 갖고 있다면, 순방향 함수는 업데이트된 계층 상태 파라미터도 숫자형 배열로 반환해야 합니다.

사용자 지정된 forward 함수와 backward 함수를 둘 다 정의한 경우에는 순방향 함수가 memory 출력값을 반환해야 합니다.

predict 함수 구문은 계층 유형에 따라 달라집니다.

  • Y = predict(layer,X)는 입력 데이터 X를 순방향으로 계층에 통과시키고 결과 Y를 출력합니다. 여기서 layer는 하나의 입력값과 하나의 출력값을 갖습니다.

  • [Y,state] = predict(layer,X)는 업데이트된 상태 파라미터 state도 출력합니다. 여기서 layer는 하나의 상태 파라미터를 갖습니다.

계층이 여러 개의 입력값, 여러 개의 출력값 또는 여러 개의 상태 파라미터를 사용하도록 구문을 조정할 수 있습니다.

  • 입력값이 여러 개인 계층의 경우 XX1,...,XN으로 대체합니다. 여기서 N은 입력값의 개수입니다. NumInputs 속성은 N과 일치해야 합니다.

  • 출력값이 여러 개인 계층의 경우 YY1,...,YM으로 대체합니다. 여기서 M은 출력값의 개수입니다. NumOutputs 속성은 M과 일치해야 합니다.

  • 상태 파라미터가 여러 개인 계층의 경우 statestate1,...,stateK로 대체합니다. 여기서 K는 상태 파라미터의 개수입니다.

계층에 대한 입력값의 개수가 가변인 경우에는 X1,…,XN 대신 varargin을 사용하십시오. 이 경우 varargin은 입력값으로 구성된 셀형 배열입니다. 여기서 varargin{i}Xi에 대응됩니다.

출력값의 개수가 가변인 경우에는 Y1,…,YM 대신 varargout을 사용하십시오. 이 경우 varargout은 출력값으로 구성된 셀형 배열입니다. 여기서 varargout{j}Yj에 대응됩니다.

사용자 지정 계층에 학습 가능한 파라미터에 대한 dlnetwork 객체가 있는 경우, 사용자 지정 계층의 predict 함수에서 dlnetwork에 대해 predict 함수를 사용하십시오. 그렇게 하면 dlnetwork 객체 predict 함수가 예측에 적합한 계층 연산을 사용합니다. dlnetwork가 상태 파라미터를 갖는 경우 신경망 상태도 반환하십시오.

forward 함수 구문은 계층 유형에 따라 달라집니다.

  • Y = forward(layer,X)는 입력 데이터 X를 순방향으로 계층에 통과시키고 결과 Y를 출력합니다. 여기서 layer는 하나의 입력값과 하나의 출력값을 갖습니다.

  • [Y,state] = forward(layer,X)는 업데이트된 상태 파라미터 state도 출력합니다. 여기서 layer는 하나의 상태 파라미터를 갖습니다.

  • [__,memory] = forward(layer,X)는 위의 구문 중 하나를 사용하여 사용자 지정 backward 함수에 대한 메모리 값도 반환합니다. 계층이 사용자 지정 forward 함수와 사용자 지정 backward 함수를 모두 갖고 있다면 순방향 함수는 메모리 값을 반환해야 합니다.

계층이 여러 개의 입력값, 여러 개의 출력값 또는 여러 개의 상태 파라미터를 사용하도록 구문을 조정할 수 있습니다.

  • 입력값이 여러 개인 계층의 경우 XX1,...,XN으로 대체합니다. 여기서 N은 입력값의 개수입니다. NumInputs 속성은 N과 일치해야 합니다.

  • 출력값이 여러 개인 계층의 경우 YY1,...,YM으로 대체합니다. 여기서 M은 출력값의 개수입니다. NumOutputs 속성은 M과 일치해야 합니다.

  • 상태 파라미터가 여러 개인 계층의 경우 statestate1,...,stateK로 대체합니다. 여기서 K는 상태 파라미터의 개수입니다.

계층에 대한 입력값의 개수가 가변인 경우에는 X1,…,XN 대신 varargin을 사용하십시오. 이 경우 varargin은 입력값으로 구성된 셀형 배열입니다. 여기서 varargin{i}Xi에 대응됩니다.

출력값의 개수가 가변인 경우에는 Y1,…,YM 대신 varargout을 사용하십시오. 이 경우 varargout은 출력값으로 구성된 셀형 배열입니다. 여기서 varargout{j}Yj에 대응됩니다.

사용자 지정 계층에 학습 가능한 파라미터에 대한 dlnetwork 객체가 있는 경우, 사용자 지정 계층의 forward 함수에서 dlnetwork 객체의 forward 함수를 사용하십시오. 그렇게 하면 dlnetwork 객체 forward 함수가 훈련에 적합한 계층 연산을 사용합니다.

입력값의 차원은 데이터의 유형 및 연결된 계층의 출력값에 따라 달라집니다.

계층 입력값
형태데이터 형식
2차원 영상

h×w×c×N 숫자형 배열로, 여기서 h, w, c, N은 각각 영상의 높이, 너비, 채널 개수, 관측값의 개수입니다.

"SSCB"
3차원 영상h×w×d×c×N 숫자형 배열로, 여기서 h, w, d, c, N은 각각 영상의 높이, 너비, 깊이, 채널 개수, 영상 관측값의 개수입니다."SSSCB"
벡터 시퀀스

c×N×s 행렬로, 여기서 c는 시퀀스의 특징 개수이고 N은 시퀀스 관측값의 개수, s는 시퀀스 길이입니다.

"CBT"
2차원 영상 시퀀스

h×w×c×N×s 배열로, 여기서 h, w, c는 각각 영상의 높이, 너비, 채널 개수이고 N은 영상 시퀀스 관측값의 개수, s는 시퀀스 길이입니다.

"SSCBT"
3차원 영상 시퀀스

h×w×d×c×N×s 배열로, 여기서 h, w, d, c는 각각 영상의 높이, 너비, 깊이, 채널 개수이고, N은 영상 시퀀스 관측값의 개수, s는 시퀀스 길이입니다.

"SSSCBT"
특징c×N 배열로, 여기서 c는 특징의 개수이고 N은 관측값의 개수입니다."CB"

시퀀스를 출력하는 계층은 임의 길이의 시퀀스를 출력하거나 시간 차원이 없는 데이터를 출력할 수 있습니다.

사용자 지정된 계층 순방향 함수의 출력값은 복소수 값일 수 있습니다. (R2024a 이후) 계층이 복소수 값 데이터를 출력하는 경우, 이 사용자 지정 계층을 신경망에서 사용할 때는 그 뒤에 오는 계층이나 손실 함수가 반드시 복소수 값 입력을 지원하도록 해야 합니다. 사용자 지정 계층의 predict 또는 forward 함수에서 복소수가 사용되면 학습 가능한 파라미터도 복소수 값으로 생성될 수 있습니다. 복소수 값의 학습 가능한 파라미터를 사용하여 모델을 훈련시키려면 trainnet 함수를 "sgdm", "adam" 또는 "rmsprop" 솔버와 함께 사용하거나(trainingOptions 함수를 사용하여 솔버를 지정), 사용자 지정 훈련 루프에 sgdmupdate, adamupdate 또는 rmspropupdate 함수를 사용하십시오.

R2024a 이전: 사용자 지정된 계층 순방향 함수의 출력값은 복소수가 아니어야 합니다. 사용자 지정 계층의 predict 또는 forward 함수에 복소수가 사용된다면 모든 출력값을 실수 값으로 변환한 후 반환하십시오. 사용자 지정 계층의 predict 또는 forward 함수에서 복소수가 사용되면 학습 가능한 파라미터도 복소수 값으로 생성될 수 있습니다. 자동 미분을 사용하고 있다면(즉, 사용자 지정 계층에 대해 역방향 함수를 작성하지 않았다면) 함수 계산을 시작할 때 학습 가능한 모든 파라미터를 실수 값으로 변환하십시오. 이렇게 하면 자동 미분 알고리즘이 복소수 값 기울기를 출력하지 않습니다.

상태 재설정 함수

dlnetwork 객체에 대한 resetState 함수는 기본적으로 상태 파라미터를 갖는 사용자 지정 계층에 영향을 주지 않습니다. network 객체에 대한 resetState 함수의 계층 동작을 정의하려면 계층 정의에 상태 파라미터를 재설정하는 선택적 계층 resetState 함수를 정의하십시오.

resetState 함수의 구문은 layer = resetState(layer)여야 합니다. 여기서 반환되는 계층은 상태 재설정 속성을 가집니다.

resetState 함수는 학습 가능 속성과 상태 속성을 제외한 어떤 계층 속성도 설정해서는 안 됩니다. 이 함수가 다른 계층의 속성을 설정하는 경우 계층이 예기치 않게 동작할 수 있습니다. (R2023a 이후)

역방향 함수

계층 역방향 함수는 입력 데이터에 대한 손실의 도함수를 계산한 다음 그 결과를 이전 계층으로 출력(역방향 전파)합니다. 계층이 학습 가능한 파라미터를 갖고 있으면(예: 계층 가중치) backward는 학습 가능한 파라미터의 도함수도 계산합니다. trainnet 함수를 사용하면 계층은 역방향 통과 중에 이 도함수를 사용하여 학습 가능한 파라미터를 자동으로 업데이트합니다.

역방향 함수를 정의하는 것은 선택 사항입니다. 사용자가 역방향 함수를 지정하지 않았고 계층 순방향 함수가 dlarray 객체를 지원하는 경우, 자동 미분을 사용하여 역방향 함수가 자동으로 결정됩니다. dlarray 객체를 지원하는 함수 목록은 List of Functions with dlarray Support 항목을 참조하십시오. 다음과 같은 경우 사용자 지정 역방향 함수를 정의하십시오.

  • 특정 알고리즘을 사용하여 도함수를 계산하려는 경우.

  • dlarray 객체를 지원하지 않는 순방향 함수에서 연산을 사용하려는 경우.

학습 가능한 dlnetwork 객체를 갖는 사용자 지정 계층은 사용자 지정된 역방향 함수를 지원하지 않습니다.

사용자 지정된 역방향 함수를 정의하려면 backward라는 함수를 만드십시오.

backward 함수 구문은 계층 유형에 따라 달라집니다.

  • dLdX = backward(layer,X,Y,dLdY,memory)는 계층 입력값에 대한 손실의 도함수 dLdX를 반환하며, 여기서 layer는 단일 입력값과 단일 출력값을 갖습니다. Y는 순방향 함수의 출력값에 해당하고 dLdYY에 대한 손실의 도함수에 해당합니다. 함수 입력값 memory는 순방향 함수의 메모리 출력값에 해당합니다.

  • [dLdX,dLdW] = backward(layer,X,Y,dLdY,memory)는 학습 가능한 파라미터에 대한 손실의 도함수 dLdW도 반환합니다. 여기서 layer는 하나의 학습 가능한 파라미터를 갖습니다.

  • [dLdX,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory)는 상태 입력값에 대한 손실의 도함수 dLdSin도 반환합니다. 여기서 layer는 하나의 상태 파라미터를 가지며 dLdSout는 계층 상태 출력값에 대한 손실의 도함수에 해당합니다.

  • [dLdX,dLdW,dLdSin] = backward(layer,X,Y,dLdY,dLdSout,memory)는 학습 가능한 파라미터에 대한 손실의 도함수 dLdW와 계층 상태 입력값에 대한 손실의 도함수 dLdSin도 반환합니다. 여기서 layer는 하나의 상태 파라미터와 하나의 학습 가능한 파라미터를 갖습니다.

계층이 여러 개의 입력값, 여러 개의 출력값 또는 여러 개의 학습 가능한 파라미터 또는 여러 개의 상태 파라미터를 사용하도록 구문을 조정할 수 있습니다.

  • 입력값이 여러 개인 계층의 경우 XdLdX를 각각 X1,...,XNdLdX1,...,dLdXN으로 대체합니다. 여기서 N은 입력값의 개수입니다.

  • 출력값이 여러 개인 계층의 경우 YdLdY를 각각 Y1,...,YMdLdY1,...,dLdYM으로 대체합니다. 여기서 M은 출력값의 개수입니다.

  • 학습 가능한 파라미터가 여러 개인 계층의 경우 dLdWdLdW1,...,dLdWP로 대체합니다. 여기서 P는 학습 가능한 파라미터의 개수입니다.

  • 상태 파라미터가 여러 개인 계층의 경우 dLdSindLdSout를 각각 dLdSin1,...,dLdSinKdLdSout1,...,dLdSoutK로 대체합니다. 여기서 K는 상태 파라미터의 개수입니다.

순방향 통과와 역방향 통과 사이에 사용되지 않는 변수가 저장되지 않도록 하여 메모리 사용량을 줄이려면 해당 입력 인수를 ~로 대체하십시오.

backward에 대한 입력값의 개수가 가변인 경우에는 layer 뒤에 입력 인수 대신 varargin을 사용하십시오. 이 경우, varargin은 입력값으로 구성된 셀형 배열입니다. 처음 N개의 요소는 N개의 계층 입력값에 해당하고, 다음 M개의 요소는 M개의 계층 출력값에 해당하고, 그다음 M개의 요소는 M개의 계층 출력값에 대한 손실의 도함수에 해당하고, 그다음 K개의 요소는 K개의 상태 출력값에 대한 손실의 K개의 도함수에 해당하며, 마지막 요소는 memory에 해당합니다.

출력값의 개수가 가변인 경우에는 출력 인수 대신 varargout을 사용하십시오. 이 경우, varargout은 출력값으로 구성된 셀형 배열입니다. 여기서 처음 N개의 요소는 N개의 계층 입력값에 대한 손실의 N개의 도함수에 해당하고, 그다음 P개의 요소는 P개의 학습 가능한 파라미터에 대한 손실의 도함수에 해당하며, 그다음 K개의 요소는 K개의 상태 입력값에 대한 손실의 도함수에 해당합니다.

XY의 값은 순방향 함수와 동일합니다. dLdY의 차원은 Y의 차원과 동일합니다.

dLdX의 차원 및 데이터형은 X의 차원 및 데이터형과 동일합니다. dLdW의 차원 및 데이터형은 W의 차원 및 데이터형과 동일합니다.

입력 데이터에 대한 손실의 도함수를 계산하고자 할 때, 출력 데이터에 대한 손실의 도함수와 입력 데이터에 대한 출력 데이터의 도함수에 연쇄 법칙을 적용할 수 있습니다.

LX(i)=jLYjYjX(i)

LWi=jLYjYjWi

trainnet 함수를 사용하면 계층은 역방향 통과 중에 도함수 dLdW를 사용하여 학습 가능한 파라미터를 자동으로 업데이트합니다.

사용자 지정된 역방향 함수를 정의하는 방법을 보여주는 예제는 Specify Custom Layer Backward Function 항목을 참조하십시오.

사용자 지정된 계층 역방향 함수의 출력값은 복소수 값일 수 있습니다. (R2024a 이후) 복소수 값 기울기를 사용하면 학습 가능한 파라미터가 복소수 값으로 생성될 수 있습니다. 복소수 값의 학습 가능한 파라미터를 사용하여 모델을 훈련시키려면 trainnet 함수를 "sgdm", "adam" 또는 "rmsprop" 솔버와 함께 사용하거나(trainingOptions 함수를 사용하여 솔버를 지정), 사용자 지정 훈련 루프에 sgdmupdate, adamupdate 또는 rmspropupdate 함수를 사용하십시오.

R2024a 이전: 사용자 지정된 계층 역방향 함수의 출력값은 복소수가 아니어야 합니다. 역방향 함수에 복소수가 사용된다면 역방향 함수의 모든 출력값을 실수 값으로 변환한 후 반환하십시오.

GPU 호환성

계층 순방향 함수가 dlarray 객체를 완전히 지원하는 경우 이 계층은 GPU와 호환됩니다. 그렇지 않은 경우, 계층이 GPU와 호환되려면 계층 함수가 gpuArray (Parallel Computing Toolbox) 형식의 입력값을 지원하고 출력값을 이 형식으로 반환해야 합니다.

여러 MATLAB® 내장 함수는 gpuArray (Parallel Computing Toolbox) 입력 인수와 dlarray 입력 인수를 지원합니다. dlarray 객체를 지원하는 함수 목록은 List of Functions with dlarray Support 항목을 참조하십시오. GPU에서 실행되는 함수 목록은 GPU에서 MATLAB 함수 실행하기 (Parallel Computing Toolbox) 항목을 참조하십시오. 딥러닝을 위해 GPU를 사용하려면 지원되는 GPU 장치도 필요합니다. 지원되는 장치에 대한 자세한 내용은 GPU 연산 요구 사항 (Parallel Computing Toolbox) 항목을 참조하십시오. MATLAB에서 GPU를 사용하는 것에 관한 자세한 내용은 MATLAB에서의 GPU 연산 (Parallel Computing Toolbox) 항목을 참조하십시오.

코드 생성 호환성

코드 생성을 지원하는 사용자 지정 계층을 만들려면 다음 조건을 충족해야 합니다.

  • 계층이 해당 계층 정의에 프라그마 %#codegen을 지정해야 합니다.

  • 계층 순방향 함수의 입력값과 출력값은 배치 크기가 동일해야 합니다.

  • 비 스칼라 속성은 single형, double형 또는 문자형 배열이어야 합니다.

  • 스칼라 속성은 숫자형, 논리형 또는 string형이어야 합니다.

일반 C/C++/CUDA 코드 생성은(DeepLearningConfigTargetLibrary 옵션이 "none"인 경우) 공간 차원, 채널 차원, 배치 차원, 시간 차원만 포함된 입력값을 갖는 사용자 지정 계층을 지원합니다. 그 외의 경우 코드 생성은 2차원 영상 또는 특징 입력값을 갖는 사용자 지정 계층만 지원합니다. 코드 생성은 상태 속성(특성이 State인 속성)을 갖는 사용자 지정 계층을 지원하지 않습니다.

코드 생성을 지원하는 사용자 지정 계층을 만드는 방법을 보여주는 예제는 Define Custom Deep Learning Layer for Code Generation 항목을 참조하십시오

신경망 구성

계층 내에서 자체적으로 신경망을 정의하는 사용자 지정 계층을 만들려면, 계층 정의의 properties (Learnable) 섹션에서 dlnetwork 객체를 학습 가능한 파라미터로 선언합니다. 이 방법을 신경망 구성이라고 합니다. 신경망 구성을 사용하여 다음을 수행할 수 있습니다.

  • 제어 흐름이 있는 신경망(예: 입력 데이터에 따라 섹션이 동적으로 변경될 수 있는 신경망)을 만듭니다.

  • 루프가 있는 신경망(예: 출력값을 자신에게 피드백하는 섹션이 있는 신경망)을 만듭니다.

  • 예를 들어, 트윈 신경망 또는 생성적 적대 신경망(GAN)과 같이 서로 다른 데이터가 동일한 계층을 통과해야 하는 신경망에서 가중치 공유를 구현합니다.

학습 가능한 파라미터와 상태 파라미터를 모두 갖는 중첩된 신경망의 경우(예: 배치 정규화 또는 LSTM 계층이 있는 신경망), 계층 정의의 properties (Learnable, State) 섹션에서 신경망을 선언하십시오.

계층의 유효성 검사하기

사용자 지정 딥러닝 계층을 만들 때 checkLayer 함수를 사용하여 계층이 유효한지 검사할 수 있습니다. 이 함수는 계층에서 유효성, GPU 호환성, 올바르게 정의된 기울기 및 코드 생성 호환성을 검사합니다. 계층이 유효한지 검사하려면 다음 명령을 실행하십시오.

checkLayer(layer,layout)
layer는 계층의 인스턴스이고 layout은 계층에 대한 입력값의 유효한 크기와 데이터 형식을 지정하는 networkDataLayout 객체입니다. 여러 개의 관측값을 검사하려면 ObservationDimension 옵션을 설정하십시오. 코드 생성 호환성 검사를 실행하려면 CheckCodegenCompatibility 옵션을 1(true)로 설정하십시오. 입력 크기가 크면 기울기 검사를 실행하는 데 더 오랜 시간이 소요됩니다. 검사 속도를 늘리려면 유효한 입력 크기를 작게 지정하십시오.

자세한 내용은 Check Custom Layer Validity 항목을 참조하십시오.

checkLayer를 사용하여 사용자 지정 계층의 유효성 검사하기

사용자 지정 계층 sreluLayer의 계층 유효성을 검사합니다.

사용자 지정 계층 sreluLayer는 지원 파일로 이 예제에 첨부되어 있으며 입력 데이터에 SReLU 연산을 적용합니다. 이 계층에 액세스하려면 이 예제를 라이브 스크립트로 여십시오.

계층의 인스턴스를 만듭니다.

layer = sreluLayer;

계층에 대한 일반적인 입력값의 예상 입력 크기와 형식을 지정하는 networkDataFormat 객체를 생성합니다. 유효한 입력 크기 [24 24 20 128]을 지정합니다. 여기서 차원은 이전 계층 출력값의 높이, 너비, 채널 개수, 관측값 개수에 해당합니다. 형식을 "SSCB"(공간, 공간, 채널, 배치)로 지정합니다.

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

checkLayer를 사용하여 계층 유효성을 검사합니다.

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.28208 seconds.

함수는 계층에서 문제를 검출하지 않습니다.

참고 항목

| | | | | | | | | | | |

관련 항목