Main Content

딥러닝 신경망을 위한 코드 생성

이 예제에서는 딥러닝을 사용하는 영상 분류 애플리케이션의 CUDA 코드를 생성하는 방법을 보여줍니다. 이 예제에서는 codegen 명령을 사용하여, 영상 분류 신경망 ResNet으로 예측을 실행하는 MEX 함수를 생성합니다.

타사 선행 조건

이 예제는 CUDA® MEX를 생성하며, 다음과 같은 타사 요구 사항이 있습니다.

  • CUDA를 지원하는 NVIDIA® GPU 및 호환되는 드라이버.

정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.

GPU 환경 확인하기

coder.checkGpuInstall (GPU Coder) 함수를 사용하여 이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인합니다.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'none';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

ResNet-50 신경망을 사용한 영상 분류

ResNet-50은 50개 계층으로 구성된 컨벌루션 신경망으로, 영상을 1,000개의 객체 범주로 분류할 수 있습니다. MATLAB®에서 사용 가능한 사전 훈련된 ResNet-50 모델은 Deep Learning Toolbox™ Model for ResNet-50 Network 지원 패키지에서 제공됩니다. 애드온 탐색기를 사용하여 지원 패키지를 다운로드하고 설치하십시오.

[net, classNames] = imagePretrainedNetwork('resnet50');
disp(net)
  dlnetwork with properties:

         Layers: [176×1 nnet.cnn.layer.Layer]
    Connections: [191×2 table]
     Learnables: [214×3 table]
          State: [106×3 table]
     InputNames: {'input_1'}
    OutputNames: {'fc1000_softmax'}
    Initialized: 1

  View summary with summary.

resnet_predict 진입점 함수

resnet_predict.m 진입점 함수는 영상을 입력값으로 받아서 사전 훈련된 resnet50 딥러닝 신경망을 사용하여 영상에 대해 예측을 실행합니다. 이 함수는 영속 객체 dlnet을 사용하여 dlnetwork 객체를 불러오고, 이후의 호출에서 예측을 수행할 때 이 영속 객체를 재사용합니다. 이 진입점 함수는 imagePretrainedNetwork 함수를 사용하여 dlnetwork 객체를 불러오고 입력 영상에 대해 예측을 수행합니다. dlarray 객체는 진입점 함수 내부에서 생성됩니다. 진입점 함수에 대한 입력값과 출력값은 원시 데이터형을 가집니다. 자세한 내용은 Code Generation for dlarray (GPU Coder) 항목을 참조하십시오.

type('resnet_predict.m')
function out = resnet_predict(in) %#codegen
% Copyright 2020-2024 The MathWorks, Inc.

persistent dlnet;

dlIn = dlarray(in, 'SSC');
if isempty(dlnet)
    % Call the function resnet50 that returns a dlnetwork object
    % for ResNet-50 model.
    dlnet = imagePretrainedNetwork('resnet50');
end

dlOut = predict(dlnet, dlIn);
out = extractdata(dlOut);

end

MEX 코드 생성 실행하기

resnet_predict.m 진입점 함수에 대한 CUDA 코드를 생성하려면 MEX 타깃에 대한 GPU 코드 구성 객체를 만듭니다. coder.DeepLearningConfig (GPU Coder) 함수를 사용하여 딥러닝 코드 구성 객체를 만들고 이 객체를 GPU 코드 구성 객체의 DeepLearningConfig 속성에 할당합니다. codegen 명령을 실행하고 입력 크기를 224×224×3으로 지정합니다. 이 값은 신경망의 입력 계층 크기에 해당합니다.

cfg = coder.gpuConfig('mex');
dlcfg = coder.DeepLearningConfig(TargetLibrary = "none");
cfg.DeepLearningConfig = dlcfg;
codegen -config cfg resnet_predict -args {ones(224,224,3,'single')} -report
Code generation successful: View report

생성된 MEX 실행하기

입력 영상에 대해 resnet_predict_mex를 호출합니다.

im = imread('peppers.png');
im = imresize(im, [224,224]);
predict_scores = resnet_predict_mex(single(im));

예측 점수를 레이블에 매핑하고 출력 표시하기

상위 5개의 예측 점수와 그 레이블을 가져옵니다.

[scores,indx] = sort(predict_scores, 'descend');
classNamesTop = classNames(indx(1:5));

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,im);
barh(ax2,scores(5:-1:1))
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop(5:-1:1))
ax2.YAxisLocation = 'right';
sgtitle('Top Five Predictions That Use ResNet-50')

Figure contains 2 axes objects and another object of type subplottext. Axes object 1 contains an object of type image. Axes object 2 with xlabel Probability contains an object of type bar.

메모리로 불러온 정적 network 객체를 지웁니다.

clear resnet_predict_mex;

관련 항목