Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

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

사용자 지정 출력 계층은 권장되지 않습니다. 대신 trainnet 함수를 사용하고 사용자 지정 손실 함수를 지정하십시오. 손실 함수에 대한 사용자 지정 역방향 함수를 지정하려면 deep.DifferentiableFunction 객체를 사용하십시오. 자세한 내용은 Define Custom Deep Learning Operations 항목을 참조하십시오.

이 항목에서는 trainNetwork 함수를 사용할 때 작업에 맞게 사용자 지정 딥러닝 출력 계층을 정의하는 방법을 설명합니다. Deep Learning Toolbox™에 내장된 계층 목록은 딥러닝 계층 목록 항목을 참조하십시오.

사용자 지정 중간 계층을 정의하는 방법은 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오.

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

출력 계층 아키텍처

훈련 시점에 순방향 통과 끝에서, 출력 계층은 이전 계층의 예측값(신경망 출력값) Y를 받아서 이들 예측값과 훈련 목표값 사이의 손실 L을 계산합니다. 출력 계층은 예측값 Y에 대한 손실 L의 도함수를 계산한 다음 이전 계층으로 결과를 출력(역방향 전파)합니다.

다음 그림은 컨벌루션 신경망과 출력 계층을 통과하는 데이터의 흐름을 보여줍니다.

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

출력 계층 템플릿

사용자 지정 출력 계층을 정의하려면 다음 클래스 정의 템플릿 중 하나를 사용하십시오. 템플릿은 출력 계층 클래스 정의의 구조를 제공합니다. 또한 다음에 대한 개요를 표시합니다.

  • 계층 속성에 대한 properties 블록(선택 사항). 자세한 내용은 출력 계층 속성 항목을 참조하십시오.

  • 계층 생성자 함수.

  • forwardLoss 함수. 자세한 내용은 순방향 손실 함수 항목을 참조하십시오.

  • backwardLoss 함수(선택 사항). 자세한 내용은 역방향 손실 함수 항목을 참조하십시오.

분류 출력 계층 템플릿

이 템플릿은 손실 함수가 있는 분류 출력 계층의 구조를 제공합니다.

classdef myClassificationLayer < nnet.layer.ClassificationLayer % ...
        % & nnet.layer.Acceleratable % (Optional)
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myClassificationLayer()           
            % (Optional) Create a myClassificationLayer.

            % Layer constructor function goes here.
        end

        function loss = forwardLoss(layer,Y,T)
            % Return the loss between the predictions Y and the training 
            % targets T.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         loss  - Loss between Y and T

            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer,Y,T)
            % (Optional) Backward propagate the derivative of the loss 
            % function.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         dLdY  - Derivative of the loss with respect to the 
            %                 predictions Y

            % Layer backward loss function goes here.
        end
    end
end

회귀 출력 계층 템플릿

이 템플릿은 손실 함수가 있는 회귀 출력 계층의 구조를 제공합니다.

classdef myRegressionLayer < nnet.layer.RegressionLayer % ...
        % & nnet.layer.Acceleratable % (Optional)
        
    properties
        % (Optional) Layer properties.

        % Layer properties go here.
    end
 
    methods
        function layer = myRegressionLayer()           
            % (Optional) Create a myRegressionLayer.

            % Layer constructor function goes here.
        end

        function loss = forwardLoss(layer,Y,T)
            % Return the loss between the predictions Y and the training
            % targets T.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         loss  - Loss between Y and T

            % Layer forward loss function goes here.
        end
        
        function dLdY = backwardLoss(layer,Y,T)
            % (Optional) Backward propagate the derivative of the loss 
            % function.
            %
            % Inputs:
            %         layer - Output layer
            %         Y     – Predictions made by network
            %         T     – Training targets
            %
            % Output:
            %         dLdY  - Derivative of the loss with respect to the 
            %                 predictions Y        

            % Layer backward loss function goes here.
        end
    end
end

사용자 지정 계층 가속

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

역방향 함수가 없는 사용자 지정 계층을 사용하여 신경망을 훈련시킬 경우, 사용자 지정된 계층 순방향 함수의 각 입력 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 섹션에서 계층 속성을 선언합니다.

기본적으로 사용자 지정 출력 계층은 다음과 같은 속성을 갖습니다.

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

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

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

사용자 지정 분류 계층은 다음과 같은 속성도 갖습니다.

  • Classes출력 계층의 클래스로, categorical형 벡터, string형 배열, 문자형 벡터로 구성된 셀형 배열 또는 "auto"로 지정됩니다. Classes"auto"인 경우, 소프트웨어가 훈련 시점에 자동으로 클래스를 설정합니다. string형 배열 또는 문자형 벡터로 구성된 셀형 배열 str을 지정하면, 출력 계층의 클래스가 categorical(str,str)로 설정됩니다.

사용자 지정 회귀 계층은 다음과 같은 속성도 갖습니다.

  • ResponseNames응답 변수의 이름으로, 문자형 벡터로 구성된 셀형 배열 또는 string형 배열로 지정됩니다. 소프트웨어는 훈련 시점에 훈련 데이터에 따라 자동으로 응답 변수의 이름을 설정합니다. 디폴트 값은 {}입니다.

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

순방향 손실 함수

출력 계층은 순방향 손실 함수를 사용하여 예측값과 목표값 사이의 손실 L을 계산하고, 역방향 손실 함수를 사용하여 예측값에 대한 손실 함수의 도함수를 계산합니다.

forwardLoss의 구문은 loss = forwardLoss(layer,Y,T)입니다. 입력값 Y는 신경망에 의해 생성된 예측값에 대응됩니다. 이러한 예측값은 이전 계층의 출력값입니다. 입력값 T는 훈련 목표값에 대응됩니다. 출력값 loss는 지정된 손실 함수에 따른 YT 사이의 손실입니다. 출력값 loss는 스칼라여야 합니다.

역방향 손실 함수

역방향 손실 함수는 예측값에 대한 손실 함수의 도함수를 계산합니다. 계층 순방향 손실 함수가 dlarray 객체를 지원하는 경우 자동 미분을 사용하여 역방향 손실 함수가 자동으로 결정됩니다. 도함수는 실수 값이어야 합니다. dlarray 객체를 지원하는 함수 목록은 List of Functions with dlarray Support 항목을 참조하십시오. 또는 사용자 지정된 역방향 손실 함수를 정의하려면 backwardLoss라는 함수를 만드십시오.

backwardLoss의 구문은 dLdY = backwardLoss(layer,Y,T)입니다. 입력값 Y는 신경망에 의해 생성된 예측값을 포함하고, 입력값 T는 훈련 목표값을 포함합니다. 출력값 dLdY는 예측값 Y에 대한 손실 함수의 도함수입니다. 출력값 dLdY는 계층 입력값 Y와 크기가 동일해야 합니다.

분류 문제의 경우, T의 차원은 문제의 유형에 따라 달라집니다.

분류 작업
형태데이터 형식
2차원 영상 분류1×1×K×N. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다."SSCB"
3차원 영상 분류1×1×1×K×N. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다."SSSCB"
sequence-to-label 분류K×N. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다."CB"
sequence-to-sequence 분류K×N×S. 여기서 K는 클래스의 개수이고 N은 관측값의 개수이고 S는 시퀀스 길이입니다."CBT"

Y의 크기는 이전 계층의 출력값에 따라 달라집니다. Y의 크기가 T와 같도록 하려면 출력 계층 앞에 올바른 크기를 출력하는 계층을 포함시켜야 합니다. 예를 들어, YK개 클래스에 대한 예측 점수로 구성된 4차원 배열이 되도록 하려면 출력 계층 앞에 크기가 K인 완전 연결 계층과 소프트맥스 계층을 차례대로 포함시킬 수 있습니다.

회귀 문제의 경우, T의 차원도 문제의 유형에 따라 달라집니다.

회귀 작업
형태데이터 형식
2차원 영상 회귀1×1×R×N. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다."SSCB"
2차원 image-to-image 회귀h×w×c×N. 여기서 h, w, c는 각각 출력값의 높이, 너비, 채널 개수이고 N은 관측값의 개수입니다."SSCB"
3차원 영상 회귀1×1×1×R×N. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다."SSSCB"
3차원 image-to-image 회귀h×w×d×c×N. 여기서 h, w, d, c는 각각 출력값의 높이, 너비, 깊이, 채널 개수이고 N은 관측값의 개수입니다."SSSCB"
sequence-to-one 회귀R×N. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다."CB"
sequence-to-sequence 회귀R×S×N. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수이고 S는 시퀀스 길이입니다."CBT"

예를 들어, 신경망이 1개의 응답 변수를 갖는 영상 회귀 신경망을 정의하고 미니 배치의 크기가 50이라면 T는 크기가 1×1×1×50인 4차원 배열입니다.

Y의 크기는 이전 계층의 출력값에 따라 달라집니다. Y의 크기가 T와 같도록 하려면 출력 계층 앞에 올바른 크기를 출력하는 계층을 포함시켜야 합니다. 예를 들어, R개의 응답 변수를 갖는 영상 회귀의 경우, Y가 올바른 크기를 갖는 4차원 배열이 되도록 하려면 크기가 R인 완전 연결 계층을 출력 계층 앞에 포함시킬 수 있습니다.

forwardLoss 함수와 backwardLoss 함수는 다음 출력 인수를 갖습니다.

함수출력 인수설명
forwardLossloss예측값 Y와 실제 목표값 T 사이에 계산된 손실입니다.
backwardLossdLdY예측값 Y에 대한 손실 함수의 도함수입니다.

backwardLoss 함수는 이전 계층에 필요한 크기를 갖는 dLdY를 출력해야 하고, dLdYY와 크기가 동일해야 합니다.

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) 항목을 참조하십시오.

계층의 유효성 검사하기

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

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

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

참고 항목

| | | | | |

관련 항목