Codegenerierung für Deep-Learning-Netze
Dieses Beispiel zeigt, wie Sie CUDA-Code für eine Bildklassifizierungsanwendung mit Deep Learning generieren. Hierbei wird der Befehl codegen verwendet, um eine MEX-Funktion zu generieren, die eine Vorhersage über das Bildklassifizierungsnetz ResNet ausführt.
Erforderliche Drittanbieterprodukte
Dieses Beispiel generiert CUDA® MEX und benötigt die folgenden Drittanbieterprodukte.
CUDA-fähige NVIDIA®-Grafikkarte und kompatiblen Treiber.
Für Nicht-MEX-Builds wie statische, dynamische Bibliotheken oder ausführbare Dateien weist dieses Beispiel die folgenden weiteren Anforderungen auf.
NVIDIA-Toolkit.
Umgebungsvariablen für Compiler und Bibliotheken. Weitere Informationen finden Sie unter Third-Party Hardware (GPU Coder) und Setting Up the Prerequisite Products (GPU Coder).
Verifizieren der GPU-Umgebung
Verwenden Sie die Funktion coder.checkGpuInstall (GPU Coder), um zu verifizieren, ob die für dieses Beispiel benötigten Compiler und Bibliotheken korrekt eingerichtet wurden.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'none'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Bildklassifizierung mit dem ResNet-50-Netz
Bei ResNet-50 handelt es sich um ein 50 Schichten tiefes Convolutional Neural Network, das Bilder in 1000 Objektkategorien klassifizieren kann. Ein vortrainiertes ResNet-50-Modell für MATLAB® ist im Supportpaket Deep Learning Toolbox™ model for ResNet-50 Network verfügbar. Verwenden Sie den Add-On Explorer, um das Supportpaket herunterzuladen und zu installieren.
[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 Einstiegspunktfunktion
Die Einstiegspunktfunktion resnet_predict.m akzeptiert einen Bildeingang und führt mithilfe des vortrainierten Deep-Learning-Netzes resnet50 eine Vorhersage an dem Bild durch. Die Funktion verwendet ein persistentes Objekt dlnet, um das dlnetwork-Objekt zu laden und verwendet das persistente Objekt für die Vorhersage bei darauffolgenden Aufrufen wieder. Diese Einstiegspunktfunktion verwendet imagePretrainedNetwork zum Laden des dlnetwork-Objekts und zum Durchführen der Vorhersage am Eingangsbild. Ein dlarray-Objekt wird in der Einstiegspunktfunktion erstellt. Die Eingabe und Ausgabe der Einstiegspunktfunktion weisen primitive Datentypen auf. Weitere Informationen finden Sie unter 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
Ausführen der MEX-Codegenerierung
Um CUDA-Code für die Einstiegspunktfunktion resnet_predict.m zu generieren, erstellen Sie ein GPU-Code-Konfigurationsobjekt für ein MEX-Ziel. Verwenden Sie die coder.DeepLearningConfig (GPU Coder)-Funktion, um ein Deep-Learning-Code-Konfigurationsobjekt zu erstellen und der Eigenschaft DeepLearningConfig des GPU-Code-Konfigurationsobjekts zuzuweisen. Führen Sie den Befehl codegen aus und geben Sie eine Eingangsgröße von 224x224x3 fest; dieser Wert entspricht der Eingangsschichtgröße des Netzes.
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
Ausführen von generiertem MEX
Rufen Sie resnet_predict_mex bei dem Eingabebild auf.
im = imread('peppers.png');
im = imresize(im, [224,224]);
predict_scores = resnet_predict_mex(single(im));Abbilden der Vorhersagescores auf Kennzeichnungen und Anzeigen der Ausgabe
Rufen Sie die fünf höchsten Vorhersagescores und deren Kennzeichnungen ab.
[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')

Löschen Sie das geladene statische Netzobjekt aus dem Speicher.
clear resnet_predict_mex;