주요 콘텐츠

dlfeval

사용자 지정 훈련 루프에서의 딥러닝 모델 평가

설명

dlfeval 함수는 자동 미분이 활성화된 상태로 딥러닝 모델과 함수를 평가합니다. 기울기를 계산하기 위해 dlgradient 함수를 사용합니다.

대부분의 딥러닝 작업의 경우, 사전 훈련된 신경망을 사용하고 이를 사용자 자신의 데이터에 맞게 적응시킬 수 있습니다. 새로운 영상 세트를 분류할 수 있도록 전이 학습을 사용하여 컨벌루션 신경망을 다시 훈련시키는 방법을 보여주는 예제는 Retrain Neural Network to Classify New Images 항목을 참조하십시오. 또는 trainnet 함수와 trainingOptions 함수를 사용하여 신경망을 처음부터 만들고 훈련시킬 수 있습니다.

trainingOptions 함수가 작업에 필요한 훈련 옵션을 제공하지 않는다면 자동 미분을 사용하여 사용자 지정 훈련 루프를 만들 수 있습니다. 자세한 내용은 사용자 지정 훈련 루프를 사용하여 신경망 훈련시키기 항목을 참조하십시오.

trainnet 함수가 작업에 필요한 손실 함수를 제공하지 않는다면 사용자 지정 손실 함수를 trainnet에 함수 핸들로 지정할 수 있습니다. 예측값과 목표값보다 더 많은 입력값이 필요한 손실 함수(예: 신경망 또는 추가 입력값에 액세스해야 하는 손실 함수)의 경우 사용자 지정 훈련 루프를 사용하여 모델을 훈련시킵니다. 자세한 내용은 사용자 지정 훈련 루프를 사용하여 신경망 훈련시키기 항목을 참조하십시오.

Deep Learning Toolbox™가 작업에 필요한 계층을 제공하지 않는다면 사용자 지정 계층을 만들 수 있습니다. 자세한 내용은 사용자 지정 딥러닝 계층 정의하기 항목을 참조하십시오. 계층 신경망으로 지정할 수 없는 모델의 경우 모델을 함수로 정의할 수 있습니다. 자세한 내용은 Train Network Using Model Function 항목을 참조하십시오.

어느 훈련 방법을 어느 작업에 사용해야 하는지에 대한 자세한 내용은 Train Deep Learning Model in MATLAB 항목을 참조하십시오.

[y1,...,yk] = dlfeval(fun,x1,...,xn)은 입력 인수 x1,...,xn에서 딥러닝 배열 함수 fun을 평가합니다. dlfeval에 전달된 함수에는 자동 미분을 사용하여 입력값 x1,...,xn에서 기울기를 계산하는 dlgradient에 대한 호출이 포함될 수 있습니다.

예제

예제

모두 축소

로젠브록 함수는 최적화를 위한 표준 테스트 함수입니다. rosenbrock.m 헬퍼 함수는 함수 값을 계산하고, 자동 미분을 사용하여 기울기를 구합니다.

type rosenbrock.m
function [y,dydx] = rosenbrock(x)

y = 100*(x(2) - x(1).^2).^2 + (1 - x(1)).^2;
dydx = dlgradient(y,x);

end

로젠브록 함수를 실행하고 점 [–1,2]에서의 기울기를 계산하려면, 그 점의 dlarray를 만든 다음 함수 핸들 @rosenbrock에 대해 dlfeval을 호출합니다.

x0 = dlarray([-1,2]);
[fval,gradval] = dlfeval(@rosenbrock,x0)
fval = 
  1×1 dlarray

   104

gradval = 
  1×2 dlarray

   396   200

또는 로젠브록 함수를 두 입력값 x1과 x2의 함수로 정의합니다.

type rosenbrock2.m
function [y,dydx1,dydx2] = rosenbrock2(x1,x2)

y = 100*(x2 - x1.^2).^2 + (1 - x1).^2;
[dydx1,dydx2] = dlgradient(y,x1,x2);

end

dlfeval을 호출하여, 입력값 –12를 나타내는 두 dlarray 인수에 대해 rosenbrock2를 실행합니다.

x1 = dlarray(-1);
x2 = dlarray(2);
[fval,dydx1,dydx2] = dlfeval(@rosenbrock2,x1,x2)
fval = 
  1×1 dlarray

   104

dydx1 = 
  1×1 dlarray

   396

dydx2 = 
  1×1 dlarray

   200

단위 정사각형 내의 여러 점에 대한 로젠브록 함수 기울기를 플로팅합니다. 먼저, 계산 지점과 함수 출력값을 나타내는 배열을 초기화합니다.

[X1 X2] = meshgrid(linspace(0,1,10));
X1 = dlarray(X1(:));
X2 = dlarray(X2(:));
Y = dlarray(zeros(size(X1)));
DYDX1 = Y;
DYDX2 = Y;

루프에서 함수를 실행합니다. quiver를 사용하여 결과를 플로팅합니다.

for i = 1:length(X1)
    [Y(i),DYDX1(i),DYDX2(i)] = dlfeval(@rosenbrock2,X1(i),X2(i));
end
quiver(extractdata(X1),extractdata(X2),extractdata(DYDX1),extractdata(DYDX2))
xlabel('x1')
ylabel('x2')

Figure contains an axes object. The axes object with xlabel x1, ylabel x2 contains an object of type quiver.

dlgradientdlfeval을 사용하여, 복소수가 포함된 함수의 값과 기울기를 계산합니다. 복소수 기울기를 계산하거나, 기울기를 실수로만 한정할 수 있습니다.

함수 complexFun을 정의합니다(이 예제의 끝에 나와 있음). 이 함수는 다음 복소수 식을 구현합니다.

f(x)=(2+3i)x

함수 gradFun을 정의합니다(이 예제의 끝에 나와 있음). 이 함수는 complexFun을 호출하고, dlgradient를 사용하여 입력값에 대한 결과 기울기를 구합니다. 자동 미분의 경우, 미분하려는 값(즉, 입력값에서 계산된 함수 값)은 실수형 스칼라여야 합니다. 따라서 이 함수는 기울기를 계산하기 전에 결과값의 실수부 합을 취합니다. 이 함수는 함수 값의 실수부와 기울기(복소수일 수 있음)를 반환합니다.

복소 평면 위의 샘플 점을 -2에서 2 사이, 그리고 -2i에서 2i 사이로 정의한 다음, dlarray로 변환합니다.

functionRes = linspace(-2,2,100);
x = functionRes + 1i*functionRes.';
x = dlarray(x);

각 샘플 점에서의 함수 값과 기울기를 계산합니다.

[y, grad] = dlfeval(@gradFun,x);
y = extractdata(y);

기울기를 표시할 샘플 점을 정의합니다.

gradientRes = linspace(-2,2,11);
xGrad = gradientRes + 1i*gradientRes.';

그러한 샘플 점에서의 기울기 값을 추출합니다.

[~,gradPlot] = dlfeval(@gradFun,dlarray(xGrad));
gradPlot = extractdata(gradPlot);

결과를 플로팅합니다. imagesc를 사용하여 복소 평면 상에 함수 값을 표시합니다. quiver를 사용하여 기울기의 방향과 크기를 표시합니다.

imagesc([-2,2],[-2,2],y);
axis xy
colorbar
hold on
quiver(real(xGrad),imag(xGrad),real(gradPlot),imag(gradPlot),"k");
xlabel("Real")
ylabel("Imaginary")
title("Real Value and Gradient","Re$(f(x)) = $ Re$((2+3i)x)$","interpreter","latex")

함수 기울기가 전체 복소 평면에서 동일합니다. 자동 미분으로 계산된 기울기 값을 추출합니다.

grad(1,1)
ans = 
  1×1 dlarray

   2.0000 - 3.0000i

관찰해 볼 때, 이 함수의 복소수 도함수 값은 다음과 같습니다.

df(x)dx=2+3i

하지만 함수 Re(f(x))가 해석적이지 않으므로, 아무런 복소수 도함수도 정의되지 않습니다. MATLAB의 자동 미분에서는 미분하려는 값이 항상 실수여야 하므로, 이 함수는 복소 해석적 함수가 될 수 없습니다. 대신 플롯에 표시된 것처럼, 반환되는 기울기가 가장 가파르게 상승하는 방향을 가리키도록 도함수가 계산됩니다. 이는 함수 Re(f(x)): C R을 함수 Re(f(xR+ixI)): R × R R로 해석하여 수행됩니다.

function y = complexFun(x)
    y = (2+3i)*x;    
end

function [y,grad] = gradFun(x)
    y = complexFun(x);
    y = real(y);

    grad = dlgradient(sum(y,"all"),x);
end

입력 인수

모두 축소

평가할 함수로, 함수 핸들로 지정됩니다. fundlgradient 호출을 포함하면, dlfeval은 자동 미분을 사용하여 기울기를 계산합니다. 이 기울기 계산 시 dlgradient 호출의 각 인수는 dlarray이거나 dlarray를 포함하는 셀형 배열, 구조체 또는 테이블이어야 합니다. dlfeval에 대한 입력 인수 개수는 fun에 대한 입력 인수 개수와 같아야 합니다.

예: @rosenbrock

데이터형: function_handle

함수 인수로, MATLAB 데이터형 또는 dlnetwork 객체로 지정됩니다. 양자화된 dlnetwork 객체는 지원되지 않습니다.

dlgradient 호출의 미분 변수인 입력 인수 xj는 추적되는 dlarray이거나 추적되는 dlarray를 포함하는 셀형 배열, 구조체 또는 테이블이어야 합니다. 하이퍼파라미터 또는 상수 데이터 배열 같은 추가 변수는 dlarray일 필요가 없습니다.

딥러닝을 위한 기울기를 계산하기 위해 dlnetwork 객체를 함수 인수로 제공하고 fun 내에서 신경망의 순방향 통과를 실행할 수 있습니다.

예: dlarray([1 2;3 4])

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
복소수 지원 여부:

출력 인수

모두 축소

함수 출력값으로, 모든 데이터형으로 반환됩니다. 출력값이 dlgradient 호출에서 생성된 경우 출력값은 dlarray입니다.

  • dlgradient 호출은 함수 내에 있어야 합니다. 기울기의 숫자형 값을 구하려면 dlfeval을 사용하여 함수를 계산해야 하고 함수에 대한 인수는 dlarray여야 합니다. Use Automatic Differentiation In Deep Learning Toolbox 항목을 참조하십시오.

  • 기울기가 올바로 계산될 수 있도록 하려면 함수 fundlarray를 지원하는 함수만 사용해야 합니다. List of Functions with dlarray Support 항목을 참조하십시오.

  • 딥러닝 함수(예: 모델 함수와 모델 손실 함수)에 대한 호출의 속도를 높이려면 dlaccelerate 함수를 사용하면 됩니다. 이 함수는 추적을 자동으로 최적화하고 캐시하며 재사용하는 AcceleratedFunction 객체를 반환합니다.

알고리즘

모두 축소

확장 기능

모두 확장

버전 내역

R2019b에 개발됨