딥러닝 신경망을 위한 코드 생성
이 예제에서는 딥러닝을 사용하는 영상 분류 애플리케이션의 CUDA 코드를 생성하는 방법을 보여줍니다. 이 예제에서는 codegen
명령을 사용하여, 영상 분류 신경망 ResNet으로 예측을 실행하는 MEX 함수를 생성합니다.
타사 선행 조건
이 예제는 CUDA® MEX를 생성하며, 다음과 같은 타사 요구 사항이 있습니다.
CUDA를 지원하는 NVIDIA® GPU 및 호환되는 드라이버.
정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.
NVIDIA 툴킷.
컴파일러 및 라이브러리 환경 변수. 자세한 내용은 타사 하드웨어 (GPU Coder) 항목과 필수 제품 준비하기 (GPU Coder) 항목을 참조하십시오.
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')
메모리로 불러온 정적 network 객체를 지웁니다.
clear resnet_predict_mex;