Main Content

Entrenar una red neuronal convolucional para regresión

Este ejemplo muestra cómo entrenar una red neuronal convolucional para predecir los ángulos de rotación de dígitos manuscritos.

Las tareas de regresión implican predecir valores numéricos continuos en lugar de etiquetas de clases discretas. Este ejemplo crea una arquitectura de red neuronal convolucional para la regresión, entrena la red y utiliza la red entrenada para predecir ángulos de dígitos manuscritos rotados.

Este diagrama ilustra el flujo de datos de imagen a través de una red neuronal de regresión.

Cargar datos

El conjunto de datos contiene imágenes sintéticas de dígitos manuscritos junto con los ángulos correspondientes (en grados) que se rota cada imagen.

Cargue los datos de entrenamiento y de prueba de los archivos MAT DigitsDataTrain.mat y DigitsDataTest.mat, respectivamente. Las variables anglesTrain y anglesTest son los ángulos de rotación en grados. Cada conjunto de datos de entrenamiento y de prueba contiene 5000 imágenes.

load DigitsDataTrain
load DigitsDataTest

Muestre algunas de las imágenes de entrenamiento.

numObservations = size(XTrain,4);
idx = randperm(numObservations,49);
I = imtile(XTrain(:,:,:,idx));
figure
imshow(I);

Figure contains an axes object. The axes object contains an object of type image.

Divida XTrain y anglesTrain en particiones de entrenamiento y validación mediante la función trainingPartitions, incluida en este ejemplo como archivo de soporte. Para acceder a esta función, abra el ejemplo como un script en vivo. Reserve el 15% de los datos de entrenamiento para la validación.

[idxTrain,idxValidation] = trainingPartitions(numObservations,[0.85 0.15]);

XValidation = XTrain(:,:,:,idxValidation);
anglesValidaiton = anglesTrain(idxValidation);

XTrain = XTrain(:,:,:,idxTrain);
anglesTrain = anglesTrain(idxTrain);

Comprobar la normalización de datos

Cuando se entrenan redes neuronales, a menudo es útil asegurarse de que sus datos están normalizados en todas las etapas de la red. La normalización ayuda a estabilizar y acelerar el entrenamiento de la red mediante un gradiente descendente. Si sus datos se han escalado mal, la pérdida puede convertirse en NaN y los parámetros de red pueden divergir durante el entrenamiento. Entre las formas habituales de normalizar datos se incluye reescalar los datos de manera que su intervalo sea [0,1] o que tenga una media de cero y una desviación estándar de uno. Puede normalizar los siguientes datos:

  • Datos de entrada. Normalice los predictores antes de introducirlos en la red. En este ejemplo, las imágenes de entrada ya están normalizadas al intervalo [0,1].

  • Salidas de capas. Puede normalizar las salidas de cada capa convolucional y cada capa totalmente conectada mediante una capa de normalización de lotes.

  • Respuestas. Si utiliza capas de normalización de lotes para normalizar las salidas de capas al final de la red, las predicciones de la red se normalizan cuando comienza el entrenamiento. Si la respuesta tiene una escala muy diferente a esas predicciones, puede que el entrenamiento de la red no pueda converger. Si su respuesta se ha escalado mal, pruebe a normalizarla y vea si el entrenamiento de la red mejora. Si normaliza la respuesta antes del entrenamiento, debe transformar las predicciones de la red entrenada para obtener las predicciones de la respuesta original.

Represente la distribución de la respuesta. La respuesta (el ángulo de rotación en grados) se distribuye aproximadamente de forma uniforme entre -45 y 45, que es correcto y no requiere normalización. En los problemas de clasificación, las salidas son probabilidades de clases, que siempre están normalizadas.

figure
histogram(anglesTrain)
axis tight
ylabel("Counts")
xlabel("Rotation Angle")

Figure contains an axes object. The axes object with xlabel Rotation Angle, ylabel Counts contains an object of type histogram.

En general, los datos no tienen que estar normalizados exactamente. Sin embargo, si entrena la red de este ejemplo para predecir 100*anglesTrain o anglesTrain+500 en lugar de anglesTrain, la pérdida es NaN y los parámetros de la red divergen cuando el entrenamiento comienza. Este resultado se produce incluso cuando la única diferencia entre una red que predice aY+b y una red que predice Y es un reescalado sencillo de los pesos y sesgos de la capa totalmente conectada final.

Si la distribución de la entrada o respuesta es muy irregular o está muy desviada, también puede realizar transformaciones no lineales (por ejemplo, tomando logaritmos) a los datos antes de entrenar la red.

Definir la arquitectura de una red neuronal

Definir la arquitectura de la red neuronal.

  • Para la entrada de imagen, especifique una capa de entrada de imagen.

  • Especifique cuatro bloques convolución-batchnorm-ReLU con un número creciente de filtros.

  • Entre cada bloque, especifique una capa de agrupación media con regiones de agrupación y un tramo de tamaño 2.

  • Al final de la red, incluya una capa totalmente conectada con un tamaño de salida que coincida con el número de respuestas.

numResponses = 1;

layers = [
    imageInputLayer([28 28 1])
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    averagePooling2dLayer(2,Stride=2)
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(numResponses)];

Especificar las opciones de entrenamiento

Especifique las opciones de entrenamiento. Para escoger entre las opciones se requiere un análisis empírico. Para explorar diferentes configuraciones de opciones de entrenamiento mediante la ejecución de experimentos, puede utilizar la app Experiment Manager.

  • Establezca la tasa de aprendizaje inicial en 0.001 y disminuya la tasa de aprendizaje tras 20 épocas.

  • Monitorice la precisión de la red durante el entrenamiento especificando datos de validación y la frecuencia de validación. 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.

  • Muestre el progreso del entrenamiento en una gráfica y monitorice el error cuadrático medio raíz.

  • Deshabilite la salida detallada.

miniBatchSize  = 128;
validationFrequency = floor(numel(anglesTrain)/miniBatchSize);

options = trainingOptions("sgdm", ...
    MiniBatchSize=miniBatchSize, ...
    InitialLearnRate=1e-3, ...
    LearnRateSchedule="piecewise", ...
    LearnRateDropFactor=0.1, ...
    LearnRateDropPeriod=20, ...
    Shuffle="every-epoch", ...
    ValidationData={XTest,anglesTest}, ...
    ValidationFrequency=validationFrequency, ...
    Plots="training-progress", ...
    Metrics="rmse", ...
    Verbose=false);

Entrenar redes neuronales

Entrene la red neuronal con la función trainnet. Para la regresión, utilice la pérdida de error cuadrático medio. De forma predeterminada, la función trainnet usa una GPU en caso de que esté disponible. Para utilizar una GPU se requiere una licencia de Parallel Computing Toolbox™ y un dispositivo GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, la función usa la CPU. Para especificar el entorno de ejecución, utilice la opción de entrenamiento ExecutionEnvironment.

net = trainnet(XTrain,anglesTrain,layers,"mse",options);

Probar la red

Pruebe el rendimiento de la red evaluando la precisión de los datos de prueba.

Realice predicciones con la función minibatchpredict. De forma predeterminada, la función minibatchpredict usa una GPU en caso de que esté disponible.

YTest = minibatchpredict(net,XTest);

Calcule el error cuadrático medio raíz (RMSE) para medir las diferencias entre el ángulo de rotación predicho y el real.

predictionError = anglesTest - YTest;
squares = predictionError.^2;
rmse = sqrt(mean(squares))
rmse = single
    4.6859

Visualice las predicciones en una gráfica de dispersión. Represente los valores predichos frente a los valores reales.

figure
scatter(YTest,anglesTest,"+")
xlabel("Predicted Value")
ylabel("True Value")

hold on
plot([-60 60], [-60 60],"r--")

Figure contains an axes object. The axes object with xlabel Predicted Value, ylabel True Value contains 2 objects of type scatter, line.

Hacer predicciones con nuevos datos

Utilice la red neuronal para hacer una predicción con la primera imagen de prueba. Para hacer una predicción con una sola imagen, utilice la función predict. Para usar una GPU, primero convierta los datos a gpuArray.

X = XTest(:,:,:,1);
if canUseGPU
    X = gpuArray(X);
end
Y = predict(net,X)
Y = single
    34.4249

Consulte también

| |

Temas relacionados