Hauptinhalt

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.

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')

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.

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

clear resnet_predict_mex;

Siehe auch

Themen