Main Content

이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

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

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

이 항목에서는 딥러닝 계층의 아키텍처를 설명하고 문제에 맞게 사용자 지정 계층을 정의하는 방법을 설명합니다.

유형설명
계층

사용자 지정 딥러닝 계층을 정의하고 학습 가능한 파라미터를 선택적으로 지정합니다.

학습 가능한 파라미터가 있는 사용자 지정 계층을 정의하는 방법을 보여주는 예제는 학습 가능한 파라미터를 갖는 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오. 입력값이 여러 개인 사용자 지정 계층을 정의하는 방법을 보여주는 예제는 Define Custom Deep Learning Layer with Multiple Inputs 항목을 참조하십시오.

분류 출력 계층

사용자 지정 분류 출력 계층을 정의하고 손실함수를 지정합니다.

사용자 지정 분류 출력 계층을 정의하고 손실함수를 지정하는 방법을 보여주는 예제는 Define Custom Classification Output Layer 항목을 참조하십시오.

회귀 출력 계층

사용자 지정 회귀 출력 계층을 정의하고 손실함수를 지정합니다.

사용자 지정 회귀 출력 계층을 정의하고 손실함수를 지정하는 방법을 보여주는 예제는 사용자 지정 회귀 출력 계층 정의하기 항목을 참조하십시오.

계층 템플릿

다음 템플릿을 사용하여 새로운 계층을 정의할 수 있습니다.

 중간 계층 템플릿

 분류 출력 계층 템플릿

 회귀 출력 계층 템플릿

중간 계층 아키텍처

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

신경망을 순방향으로 통과할 때는 각 계층이 이전 계층의 출력값을 받아서 함수를 적용한 다음 결과를 다음 계층으로 출력(순방향 전파)합니다.

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

신경망의 순방향 통과 끝에서 출력 계층은 예측값 Y와 실제 목표값 T 사이의 손실 L을 계산합니다.

신경망의 역방향 통과 중에는 각 계층이 해당 계층의 출력값에 대한 손실의 도함수를 받아서 입력값에 대한 손실 L의 도함수를 계산한 다음 결과를 역방향 전파합니다. 계층에 학습 가능한 파라미터가 있는 경우 계층 가중치(학습 가능한 파라미터)의 도함수도 계산합니다. 계층은 가중치의 도함수를 사용하여 학습 가능한 파라미터를 업데이트합니다.

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

중간 계층 속성

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

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

속성설명
Name 계층 이름으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. 계층 그래프에 계층을 포함하려면 비어 있지 않은 고유한 계층 이름을 지정해야 합니다. 이 계층을 사용하여 시리즈 신경망을 훈련시킬 때 Name''로 설정하면, 소프트웨어가 훈련 시점에 해당 계층에 자동으로 이름을 할당합니다.
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) 섹션에서 계층의 학습 가능한 파라미터를 선언합니다. 계층에 학습 가능한 파라미터가 없는 경우 properties (Learnable) 섹션을 생략할 수 있습니다.

선택적으로, 학습 가능한 파라미터의 학습률 인자와 L2 인자를 지정할 수 있습니다. 기본적으로 각 학습 가능한 파라미터는 학습률 인자와 L2 인자가 1로 설정되어 있습니다.

내장 계층과 사용자 지정 계층 모두에서 다음 함수를 사용하여 학습률 인자와 L2 정규화 인자를 설정하고 가져올 수 있습니다.

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

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

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

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

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

순방향 함수

계층은 predict 함수나 forward 함수를 사용하여 순방향 통과를 수행합니다. 순방향 통과가 예측 시점에 이루어질 경우 계층은 predict 함수를 사용합니다. 순방향 통과가 훈련 시점에 이루어질 경우 계층은 forward 함수를 사용합니다. 예측 시점과 훈련 시점에 사용하는 함수가 다를 필요가 없는 경우 forward 함수를 생략할 수 있습니다. 이 경우 계층은 훈련 시점에 predict를 사용합니다.

함수 forward와 사용자 지정 역방향 함수를 정의한 경우, 역방향 전파 중에 사용할 수 있는 인수 memory에 값을 할당해야 합니다.

predict의 구문은 다음과 같습니다.

[Z1,…,Zm] = predict(layer,X1,…,Xn)
여기서 X1,…,Xnn개의 계층 입력값이고 Z1,…,Zmm개의 계층 출력값입니다. 값 nm은 각각 계층의 NumInputs 속성, NumOutputs 속성과 일치해야 합니다.

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

forward의 구문은 다음과 같습니다.

[Z1,…,Zm,memory] = forward(layer,X1,…,Xn)
여기서 X1,…,Xnn개의 계층 입력값이고 Z1,…,Zmm개의 계층 출력값이고 memory는 계층의 메모리입니다.

forward에 대한 입력값의 개수가 가변인 경우에는 X1,…,Xn 대신 varargin을 사용하십시오. 이 경우 varargin은 입력값으로 구성된 셀형 배열입니다. 여기서 varargin{i}Xi에 대응됩니다. 출력값의 개수가 가변인 경우에는 Z1,…,Zm 대신 varargout을 사용하십시오. 이 경우 varargout은 출력값으로 구성된 셀형 배열입니다. 여기서 varargout{j}j=1,…,NumOutputs인 경우 Zj에 대응되고 varargout{NumOutputs+1}memory에 대응됩니다.

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

계층 입력값입력 크기관측값 차원
2차원 영상hxwxcxN. 여기서 h, w, c는 영상의 높이, 너비, 채널 개수이고 N은 관측값 개수입니다.4
3차원 영상hxwxdxcxN. 여기서 h, w, d, c는 3차원 영상의 높이, 너비, 깊이, 채널 개수이고 N은 관측값 개수입니다.5
벡터 시퀀스cxNxS. 여기서 c는 시퀀스의 특징 개수이고 N은 관측값 개수이고 S는 시퀀스 길이입니다.2
2차원 영상 시퀀스hxwxcxNxS. 여기서 h, w, c는 영상의 높이, 너비, 채널 개수이고 N은 관측값 개수이고 S는 시퀀스 길이입니다.4
3차원 영상 시퀀스hxwxdxcxNxS. 여기서 h, w, d, c는 3차원 영상의 높이, 너비, 깊이, 채널 개수이고 N은 관측값 개수이고 S는 시퀀스 길이입니다.5

역방향 함수

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

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

  • 특정 알고리즘을 사용하여 도함수 계산.

  • dlarray 객체를 지원하지 않는 역방향 함수에서 연산 사용.

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

backward의 구문은 다음과 같습니다.

[dLdX1,…,dLdXn,dLdW1,…,dLdWk] = backward(layer,X1,…,Xn,Z1,…,Zm,dLdZ1,…,dLdZm,memory)
여기서

  • X1,…,Xnn개의 계층 입력값입니다.

  • Z1,…,Zm은 계층 순방향 함수의 m개의 출력값입니다.

  • dLdZ1,…,dLdZm은 다음 계층에서 역방향 전파된 기울기입니다.

  • memoryforward가 정의된 경우 forward의 메모리 출력값이고, 그 밖의 경우 memory[]입니다.

출력값의 경우, dLdX1,…,dLdXn은 계층 입력값에 대한 손실의 도함수이고 dLdW1,…,dLdWkk개의 학습 가능한 파라미터에 대한 손실의 도함수입니다. 순방향 통과와 역방향 통과 사이에 미사용 변수가 저장되지 않도록 하여 메모리 사용량을 줄이려면 해당 입력 인수를 ~로 바꾸십시오.

backward에 대한 입력값의 개수가 가변인 경우에는 layer 뒤에 입력 인수 대신 varargin을 사용하십시오. 이 경우 varargin은 입력값으로 구성된 셀형 배열입니다. 여기서 varargin{i}i=1,…,NumInputs인 경우 Xi에 대응되고 varargin{NumInputs+j}varargin{NumInputs+NumOutputs+j}j=1,…,NumOutputs인 경우 각각 ZjdLdZj에 대응되고 varargin{end}memory에 대응됩니다.

출력값의 개수가 가변인 경우에는 출력 인수 대신 varargout을 사용하십시오. 이 경우 varargout은 출력값으로 구성된 셀형 배열입니다. 여기서 varargout{i}i=1,…,NumInputs인 경우 dLdXi에 대응되고 varargout{NumInputs+t}t=1,…,k인 경우 dLdWt에 대응됩니다. 여기서 k는 학습 가능한 파라미터의 개수입니다.

X1,…,XnZ1,…,Zm의 값은 순방향 함수에서와 동일합니다. dLdZ1,…,dLdZm의 차원은 각각 Z1,…,Zm의 차원과 동일합니다.

dLdX1,…,dLdxn의 차원과 데이터형은 각각 X1,…,Xn의 차원 및 데이터형과 동일합니다. dLdW1,…,dLdWk의 차원과 데이터형은 각각 W1,…,Wk의 차원 및 데이터형과 동일합니다.

손실의 도함수를 계산하려면 다음과 같은 연쇄 법칙을 사용할 수 있습니다.

LX(i)=jLzjzjX(i)

LWi=jLZjZjWi

trainNetwork 함수를 사용할 때 계층은 역방향 통과 중에 자동으로 도함수 dLdW1,…,dLdWk를 사용하여 학습 가능한 파라미터를 업데이트합니다.

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

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를 사용하려면 CUDA® 지원 NVIDIA® GPU(Compute Capability 3.0 이상)도 필요합니다. MATLAB에서 GPU를 사용하는 것에 관한 자세한 내용은 MATLAB에서의 GPU 연산 (Parallel Computing Toolbox) 항목을 참조하십시오.

계층의 유효성 검사하기

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

checkLayer(layer,validInputSize,'ObservationDimension',dim)
여기서 layer는 계층의 인스턴스이고 validInputSize는 계층에 대한 유효한 입력 크기를 지정하는 벡터 또는 셀형 배열이고 dim은 계층 입력 데이터에 있는 관측값의 차원을 지정합니다. 입력 크기가 크면 기울기 검사를 실행하는 데 더 오랜 시간이 소요됩니다. 테스트 속도를 늘리려면 유효한 입력 크기를 작게 지정하십시오.

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

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

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

사용자 지정 PReLU 계층을 정의합니다. 이 계층을 만들려면 파일 preluLayer.m을 현재 폴더에 저장하십시오.

계층의 인스턴스를 만들고 checkLayer를 사용하여 유효성을 검사합니다. 계층에 대한 일반적인 입력값의 단일 관측값을 유효한 입력 크기로 지정합니다. 계층에는 4차원 배열 입력값이 필요합니다. 여기서 처음 3개의 차원은 이전 계층 출력값의 높이, 너비, 채널 개수이고 4번째 차원은 관측값입니다.

관측값의 일반적인 입력 크기를 지정하고 'ObservationDimension'을 4로 설정합니다.

layer = preluLayer(20,'prelu');
validInputSize = [24 24 20];
checkLayer(layer,validInputSize,'ObservationDimension',4)
Running nnet.checklayer.TestLayerWithoutBackward
.......... .......
Done nnet.checklayer.TestLayerWithoutBackward
__________

Test Summary:
	 17 Passed, 0 Failed, 0 Incomplete, 0 Skipped.
	 Time elapsed: 1.5273 seconds.

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

신경망에 계층 포함시키기

Deep Learning Toolbox의 계층을 다루듯이 동일한 방식으로 사용자 지정 계층을 사용할 수 있습니다.

사용자 지정 PReLU 계층을 정의합니다. 이 계층을 만들려면 파일 preluLayer.m을 현재 폴더에 저장하십시오.

사용자 지정 계층 preluLayer를 포함하는 계층 배열을 만듭니다.

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    preluLayer(20,'prelu')
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

출력 계층 아키텍처

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

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

출력 계층 속성

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

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

  • Name계층 이름으로, 문자형 벡터 또는 string형 스칼라로 지정됩니다. 계층 그래프에 계층을 포함하려면 비어 있지 않은 고유한 계층 이름을 지정해야 합니다. 이 계층을 사용하여 시리즈 신경망을 훈련시킬 때 Name''로 설정하면, 소프트웨어가 훈련 시점에 해당 계층에 자동으로 이름을 할당합니다.

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

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

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

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

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

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

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

손실함수

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

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

계층의 순방향 손실함수가 dlarray 객체를 지원하면 자동으로 역방향 손실함수가 결정됩니다. dlarray 객체를 지원하는 함수 목록은 List of Functions with dlarray Support 항목을 참조하십시오. 또는 사용자 지정 역방향 손실함수를 정의하려면 backwardLoss라는 이름의 함수를 만드십시오. 사용자 지정 역방향 손실 함수를 정의하는 방법을 보여주는 예제는 Specify Custom Output Layer Backward Loss Function 항목을 참조하십시오.

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

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

분류 작업입력 크기관측값 차원
2차원 영상 분류1x1xKxN. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다.4
3차원 영상 분류1x1x1xKxN. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다.5
sequence-to-label 분류KxN. 여기서 K는 클래스의 개수이고 N은 관측값의 개수입니다.2
sequence-to-sequence 분류KxNxS. 여기서 K는 클래스의 개수이고 N은 관측값의 개수이고 S는 시퀀스 길이입니다.2

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

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

회귀 작업입력 크기관측값 차원
2차원 영상 회귀1x1xRxN. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다.4
2차원 image-to-image 회귀hxwxcxN. 여기서 h, w, c는 출력값의 높이, 너비, 채널 개수이고 N은 관측값의 개수입니다.4
3차원 영상 회귀1x1x1xRxN. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다.5
3차원 image-to-image 회귀hxwxdxcxN. 여기서 h, w, d, c는 출력값의 높이, 너비, 깊이, 채널 개수이고 N은 관측값의 개수입니다.5
sequence-to-one 회귀RxN. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수입니다.2
sequence-to-sequence 회귀RxNxS. 여기서 R은 응답 변수의 개수이고 N은 관측값의 개수이고 S는 시퀀스 길이입니다.2

예를 들어, 신경망이 1개의 응답 변수를 갖는 영상 회귀 신경망을 정의하고 미니 배치의 크기가 50이라면 T는 크기가 1x1x1x50인 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를 사용하려면 CUDA 지원 NVIDIA GPU(Compute Capability 3.0 이상)도 필요합니다. MATLAB에서 GPU를 사용하는 것에 관한 자세한 내용은 MATLAB에서의 GPU 연산 (Parallel Computing Toolbox) 항목을 참조하십시오.

신경망에 사용자 지정 회귀 출력 계층 포함시키기

Deep Learning Toolbox의 출력 계층을 다루듯이 동일한 방식으로 사용자 지정 출력 계층을 사용할 수 있습니다. 이 섹션에서는 사용자 지정 출력 계층을 사용하여 회귀용 신경망을 만들고 훈련시키는 방법을 보여줍니다.

이 예제에서는 컨벌루션 신경망 아키텍처를 구성하고 신경망을 훈련시킨 다음 훈련된 신경망을 사용하여 손으로 쓴 숫자의 회전 각도를 예측합니다. 이러한 예측은 광학 문자 인식 분야에 유용합니다.

사용자 지정 평균 절대 오차 회귀 계층을 정의합니다. 이 계층을 만들려면 파일 maeRegressionLayer.m을 현재 폴더에 저장하십시오.

예제 훈련 데이터를 불러옵니다.

[XTrain,~,YTrain] = digitTrain4DArrayData;

계층 배열을 만들고 사용자 지정 회귀 출력 계층 maeRegressionLayer를 포함시킵니다.

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(5,20)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(1)
    maeRegressionLayer('mae')]
layers = 
  6x1 Layer array with layers:

     1   ''      Image Input           28x28x1 images with 'zerocenter' normalization
     2   ''      Convolution           20 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''      Batch Normalization   Batch normalization
     4   ''      ReLU                  ReLU
     5   ''      Fully Connected       1 fully connected layer
     6   'mae'   Regression Output     Mean absolute error

훈련 옵션을 설정하고 신경망을 훈련시킵니다.

options = trainingOptions('sgdm','Verbose',false);
net = trainNetwork(XTrain,YTrain,layers,options);

예측된 회전 각도와 실제 회전 각도 사이의 예측 오차를 계산하여 신경망 성능을 평가합니다.

[XTest,~,YTest] = digitTest4DArrayData;
YPred = predict(net,XTest);
predictionError = YTest - YPred;

실제 각도로부터 허용 가능한 오차 범위 내에 있는 예측값의 개수를 계산합니다. 임계값을 10도로 설정하고 예측값이 이 임계값 내에 있는 비율을 계산합니다.

thr = 10;
numCorrect = sum(abs(predictionError) < thr);
numTestImages = size(XTest,4);
accuracy = numCorrect/numTestImages
accuracy = 0.8064

참고 항목

| | | | |

관련 항목