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.
NVIDIA Toolkit.
Variables de entorno para los compiladores y las bibliotecas. Para obtener más información, consulte Third-Party Hardware (GPU Coder) y Setting Up the Prerequisite Products (GPU Coder).
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')
Borre el objeto de red estática que estaba cargado en la memoria.
clear resnet_predict_mex;