Contenido principal

Generación de código para redes de deep learning

En este ejemplo se muestra cómo generar código CUDA para una aplicación de clasificación de imágenes que utiliza deep learning. Utiliza el comando codegen para generar una función MEX que ejecuta la predicción usando la red de clasificación de imágenes ResNet.

Requisitos previos de terceros

Este ejemplo genera CUDA® MEX y tiene los siguientes requisitos previos de terceros.

  • GPU NVIDIA® habilitada para CUDA y driver compatible.

Para construcciones que no sean MEX, como bibliotecas estáticas o dinámicas, o ejecutables, este ejemplo tiene los siguientes requisitos adicionales.

Verificar el entorno de la GPU

Utilice la función coder.checkGpuInstall (GPU Coder) para verificar que los compiladores y las bibliotecas necesarios para ejecutar este ejemplo están configurados correctamente.

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

Clasificación de imágenes utilizando la red ResNet-50

ResNet-50 es una red neuronal convolucional con 50 capas de profundidad y puede clasificar imágenes en 1000 categorías de objeto. Hay un modelo de ResNet-50 preentrenado para MATLAB® en el paquete de soporte Deep Learning Toolbox™ Model for ResNet-50 Network. Utilice Add-On Explorer para descargar el paquete de soporte e instálelo.

[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.

Función de punto de entrada resnet_predict

La función de punto de entrada resnet_predict.m toma una entrada de imagen y ejecuta la predicción en la imagen utilizando la red de deep learning resnet50 preentrenada. La función utiliza un objeto persistente dlnet para cargar el objeto dlnetwork y reutiliza el objeto persistente para la predicción en las llamadas posteriores. Esta función de punto de entrada utiliza imagePretrainedNetwork para cargar el objeto dlnetwork y realizar la predicción en la imagen de entrada. Se crea un objeto dlarray dentro de la función de punto de entrada. La entrada y salida para la función de punto de entrada son tipos de datos primitivos. Para obtener más información, consulte 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

Ejecutar generación de código MEX

Para generar código CUDA para la función de punto de entrada resnet_predict.m, cree un objeto de configuración de código GPU para un objetivo MEX. Utilice la función coder.DeepLearningConfig (GPU Coder) para crear un objeto de configuración de código de deep learning y asígnelo a la propiedad DeepLearningConfig del objeto de configuración de código GPU. Ejecute el comando codegen y especifique un tamaño de entrada de 224 por 224 por 3, que es el valor que corresponde al tamaño de la capa de entrada de la red.

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

Ejecutar código MEX generado

Llame a resnet_predict_mex en la imagen de entrada.

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

Asignar las puntuaciones de predicción a etiquetas y mostrar salida

Obtenga las cinco primeras puntuaciones de predicción y sus etiquetas.

[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.

Borre el objeto de red estática que estaba cargado en la memoria.

clear resnet_predict_mex;

Consulte también

Temas