Main Content

Crear una red de deep learning sencilla para clasificación

Este ejemplo muestra cómo crear y entrenar una red neuronal convolucional sencilla para la clasificación mediante deep learning. Las redes neuronales convolucionales son herramientas fundamentales en deep learning y resultan especialmente adecuadas para reconocer imágenes.

Este ejemplo muestra cómo hacer lo siguiente:

  • Cargar y explorar datos de imágenes.

  • Definir la arquitectura de la red.

  • Especificar las opciones de entrenamiento.

  • Entrenar la red.

  • Predecir las etiquetas de los datos nuevos y calcular la precisión de la clasificación.

Para ver un ejemplo de cómo crear y entrenar una red de clasificación de imágenes sencilla de forma interactiva, consulte Crear una red de clasificación de imágenes sencilla utilizando Deep Network Designer.

Cargar y explorar datos de imágenes

Cargue los datos de dígitos de muestra como un almacén de datos de imágenes. imageDatastore etiqueta de forma automática las imágenes basándose en los nombres de las carpetas y almacena los datos como un objeto ImageDatastore. Un almacén de datos de imágenes permite almacenar un gran volumen de datos de imágenes, incluidos los que no caben en la memoria, y leer eficazmente lotes de imágenes durante el entrenamiento de una red neuronal convolucional.

digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ...
    'nndatasets','DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
    'IncludeSubfolders',true,'LabelSource','foldernames');

Muestre algunas de las imágenes del almacén de datos.

figure;
perm = randperm(10000,20);
for i = 1:20
    subplot(4,5,i);
    imshow(imds.Files{perm(i)});
end

Calcule el número de imágenes en cada categoría. labelCount es una tabla que contiene las etiquetas y el número de imágenes que tiene cada etiqueta. El almacén de datos contiene 1000 imágenes para cada uno de los dígitos de 0 a 9, lo que hace un total de 10.000 imágenes. Puede especificar el número de clases en la última capa totalmente conectada de su red como el argumento OutputSize.

labelCount = countEachLabel(imds)
labelCount=10×2 table
    Label    Count
    _____    _____

      0      1000 
      1      1000 
      2      1000 
      3      1000 
      4      1000 
      5      1000 
      6      1000 
      7      1000 
      8      1000 
      9      1000 

Debe especificar el tamaño de las imágenes en la capa de entrada de la red. Verifique el tamaño de la primera imagen en digitData. Cada imagen tiene un tamaño de 28 por 28 por 1 píxeles.

img = readimage(imds,1);
size(img)
ans = 1×2

    28    28

Especificar los conjuntos de datos de entrenamiento y de validación

Divida los datos en conjuntos de datos de entrenamiento y de validación, de forma que cada categoría del conjunto de entrenamiento contenga 750 imágenes y el conjunto de validación contenga el resto de las imágenes de cada etiqueta. splitEachLabel divide el almacén de datos digitData en dos nuevos almacenes de datos: trainDigitData y valDigitData.

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');

Definir la arquitectura de red

Defina la arquitectura de la red neuronal convolucional.

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Capa de entrada de la imagen Una imageInputLayer es donde se especifica el tamaño de la imagen, que en este caso es de 28 por 28 por 1. Estos números corresponden a la altura, la anchura y el tamaño del canal. Los datos de dígitos consisten en imágenes en escala de grises, así que el tamaño del canal (canal del color) es 1. En una imagen en color, el tamaño del canal es 3, correspondiente a los valores RGB. No es necesario cambiar el orden de los datos porque, de forma predeterminada, trainNetwork cambia el orden de los datos al comienzo del entrenamiento. trainNetwork también puede cambiar el orden de los datos de forma automática al comienzo de cada época durante el entrenamiento.

Capa convolucional En la capa convolucional, el primer argumento es filterSize, que es la altura y la anchura de los filtros que utiliza la función de entrenamiento cuando escanea las imágenes. En este ejemplo, el número 3 indica que el tamaño del filtro es de 3 por 3. Puede especificar diferentes tamaños para la altura y la anchura del filtro. El segundo argumento es el número de filtros, numFilters, que es el número de neuronas que se conectan a la misma región de la entrada. Este parámetro determina el número de mapas de características. Utilice el par nombre-valor 'Padding' para añadir relleno al mapa de características de entrada. En una capa convolucional con un tramo predeterminado de 1, el relleno 'same' garantiza que el tamaño de salida espacial sea el mismo que el tamaño de entrada. También puede definir el tramo y las tasas de aprendizaje para esta capa mediante los argumentos de par nombre-valor de convolution2dLayer.

Capa de normalización de lotes Las capas de normalización de lotes normalizan las activaciones y los gradientes que se propagan a través de una red, lo que hace que el entrenamiento de la red sea un problema de optimización más fácil. Utilice las capas de normalización de lotes entre las capas convolucionales y las no linealidades, como capas ReLU, para acelerar el entrenamiento de la red y reducir la sensibilidad a la inicialización de la red. Utilice batchNormalizationLayer para crear una capa de normalización de lotes.

Capa ReLU La capa de normalización de lotes va seguida de una función de activación no lineal. La función de activación más habitual es la unidad lineal rectificada (ReLU). Utilice reluLayer para crear una capa ReLU.

Capa de agrupación máxima Las capas convolucionales (con funciones de activación) van seguidas en ocasiones de una operación de submuestreo que reduce el tamaño espacial del mapa de características y elimina información espacial redundante. El submuestreo permite incrementar el número de filtros en capas convolucionales más profundas sin aumentar la cantidad necesaria de cálculos por capa. Una manera de realizar el submuestreo es utilizar una agrupación máxima, que puede crear mediante maxPooling2dLayer. La capa de agrupación máxima devuelve los valores máximos de regiones rectangulares de entradas, especificados por el primer argumento (poolSize). En este ejemplo, el tamaño de la región rectangular es [2,2]. El argumento de par nombre-valor 'Stride' especifica el tamaño del salto que la función de entrenamiento toma a medida que escanea la entrada.

Capa totalmente conectada Las capas convolucional y de submuestreo van seguidas por una o más capas totalmente conectadas. Como su propio nombre sugiere, una capa totalmente conectada es una capa en la que las neuronas se conectan a todas las neuronas de la capa anterior. Esta capa combina todas las características aprendidas por las capas anteriores por toda la imagen para identificar los patrones mayores. La última capa totalmente conectada combina las características para clasificar las imágenes. Por tanto, el parámetro OutputSize en la última capa totalmente conectada es igual al número de clases en los datos objetivo. En este ejemplo, el tamaño de salida es 10, que se corresponde con las 10 clases. Utilice fullyConnectedLayer para crear una capa totalmente conectada.

Capa softmax La función de activación softmax normaliza la salida de la capa totalmente conectada. La salida de la capa softmax consiste en números positivos que suman hasta uno, que luego se pueden utilizar como probabilidades de clasificación por parte de la capa de clasificación. Cree una capa softmax mediante la función softmaxLayer después de la última capa totalmente conectada.

Capa de clasificación La capa final es la capa de clasificación. Esta capa utiliza las probabilidades devueltas por la función de activación softmax para cada entrada para asignar la entrada a una de las clases mutuamente excluyentes y calcular la pérdida. Para crear una capa de clasificación utilice classificationLayer.

Especificar las opciones de entrenamiento

Tras definir la estructura de la red, especifique las opciones de entrenamiento. Entrene la red con el gradiente descendente estocástico con momento (SGDM) con una tasa de aprendizaje inicial de 0.01. Establezca el número máximo de épocas en 4. Una época es un ciclo de entrenamiento completo en el conjunto total de datos de entrenamiento. Monitorice la precisión de la red durante el entrenamiento especificando datos de validación y la frecuencia de validación. Cambie el orden de los datos en cada época. El software entrena la red según los datos de entrenamiento y calcula la precisión de los datos de validación en intervalos regulares durante el entrenamiento. Los datos de validación no se utilizan para actualizar los pesos de la red. Active la gráfica de progreso del entrenamiento y desactive la salida de la ventana de comandos.

options = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...
    'MaxEpochs',4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',imdsValidation, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');

Entrenar la red con datos de entrenamiento

Entrene la red con la arquitectura definida por layers, los datos de entrenamiento y las opciones de entrenamiento. De forma predeterminada, trainNetwork usa una GPU en caso de que esté disponible. De lo contrario, usa una CPU. Entrenar en una GPU requiere Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). También puede especificar el entorno de ejecución con el argumento de par nombre-valor 'ExecutionEnvironment' de trainingOptions.

La gráfica de progreso del entrenamiento muestra la pérdida y la precisión de minilotes y la pérdida y la precisión de validación. Para obtener más información sobre la gráfica de progreso del entrenamiento, consulte Monitorizar el progreso del entrenamiento de deep learning. La pérdida es la pérdida de entropía cruzada. La precisión es el porcentaje de imágenes que la red clasifica correctamente.

net = trainNetwork(imdsTrain,layers,options);

Clasificar imágenes de validación y calcular la precisión

Prediga las etiquetas de los datos de validación con la red entrenada y calcule la precisión de validación final. La precisión es la fracción de etiquetas que la red predice correctamente. En este caso, más del 99% de las etiquetas predichas coincide con las etiquetas verdaderas del conjunto de validación.

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;

accuracy = sum(YPred == YValidation)/numel(YValidation)
accuracy = 0.9988

Consulte también

| | |

Temas relacionados