Main Content

Entrenar una red con datos de características y de imagen

En este ejemplo se muestra cómo entrenar una red que clasifica dígitos escritos a mano usando datos de entrada de características y de imagen.

Cargar los datos de entrenamiento

Cargue las imágenes de los dígitos, las etiquetas y los ángulos de rotación en el sentido de las agujas del reloj.

load DigitsDataTrain

Para entrenar una red con varias entradas usando la función trainnet, cree un único almacén de datos que contenga los predictores y las respuestas de entrenamiento. Para convertir arreglos numéricos en almacenes de datos, use arrayDatastore. A continuación, use la función combine para combinarlos en un único almacén de datos.

dsX1Train = arrayDatastore(XTrain,IterationDimension=4);
dsX2Train = arrayDatastore(anglesTrain);
dsTTrain = arrayDatastore(labelsTrain);
dsTrain = combine(dsX1Train,dsX2Train,dsTTrain);

Muestre 20 imágenes de entrenamiento aleatorias.

numObservationsTrain = numel(labelsTrain);
idx = randperm(numObservationsTrain,20);

figure
tiledlayout("flow");
for i = 1:numel(idx)
    nexttile
    imshow(XTrain(:,:,:,idx(i)))
    title("Angle: " + anglesTrain(idx(i)))
end

Definir la arquitectura de red

Defina la red siguiente.

image1.png

  • Para la entrada de imagen, especifique una capa de entrada de imagen con un tamaño que coincida con los datos de entrada.

  • Para la entrada de características, especifique una capa de entrada de características con un tamaño que coincida con el número de características de entrada.

  • Para la rama de entrada de imagen, especifique un bloque de capa convolucional, normalización de lotes y ReLU, donde la capa convolucional tenga 16 filtros de 5 por 5.

  • Para convertir la salida de la capa de normalización de lotes en un vector de características, incluya una capa totalmente conectada de tamaño 50.

  • Para concatenar la salida de la primera capa totalmente conectada con la entrada de características, aplane la salida "SSCB" (espacial, espacial, canal, lote) de la capa totalmente conectada para que tenga el formato "CB" usando una capa aplanada.

  • Concatene la salida de la capa aplanada con la entrada de características a lo largo de la primera dimensión (la dimensión del canal).

  • Para la salida de clasificación, incluya una capa totalmente conectada con un tamaño de salida que coincida con el número de clases, seguida de una capa softmax.

Cree una red neuronal vacía.

net = dlnetwork;

Cree un arreglo de capas que contenga la rama principal de la red y añádalo a la red.

[h,w,numChannels,numObservations] = size(XTrain);
numFeatures = 1;
classNames = categories(labelsTrain);
numClasses = numel(classNames);

imageInputSize = [h w numChannels];
filterSize = 5;
numFilters = 16;

layers = [
    imageInputLayer(imageInputSize,Normalization="none")
    convolution2dLayer(filterSize,numFilters)
    batchNormalizationLayer
    reluLayer
    fullyConnectedLayer(50)
    flattenLayer
    concatenationLayer(1,2,Name="cat")
    fullyConnectedLayer(numClasses)
    softmaxLayer];

net = addLayers(net,layers);

Añada una capa de entrada de características a la red y conéctela a la segunda entrada de la capa de concatenación.

featInput = featureInputLayer(numFeatures,Name="features");
net = addLayers(net,featInput);
net = connectLayers(net,"features","cat/in2");

Visualice la red en una gráfica.

figure
plot(net)

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.

  • Entrenar usando el optimizador de SGDM.

  • Entrenar durante 15 épocas.

  • Entrenar con una tasa de aprendizaje de 0,01.

  • Muestre el progreso del entrenamiento en una gráfica y monitorice la métrica de precisión.

  • Suprimir la salida detallada.

options = trainingOptions("sgdm", ...
    MaxEpochs=15, ...
    InitialLearnRate=0.01, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=0);

Entrenar la red

Entrene la red neuronal con la función trainnet. Para la clasificación, utilice la pérdida de entropía cruzada. 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(dsTrain,net,"crossentropy",options);

Probar la red

Pruebe la precisión de clasificación de la red comparando las predicciones en un conjunto de pruebas con las etiquetas verdaderas.

Cargue los datos de prueba.

load DigitsDataTest

Realice predicciones con la función minibatchpredict y convierta las puntuaciones en etiquetas con la función scores2label. De forma predeterminada, la función minibatchpredict usa una GPU en caso de que esté disponible.

scores = minibatchpredict(net,XTest,anglesTest);
YTest = scores2label(scores,classNames);

Visualice las predicciones en una gráfica de confusión.

figure
confusionchart(labelsTest,YTest)

Evalúe la precisión de clasificación.

accuracy = mean(YTest == labelsTest)
accuracy = 0.9852

Vea algunas de las imágenes con sus predicciones.

idx = randperm(size(XTest,4),9);
figure
tiledlayout(3,3)
for i = 1:9
    nexttile
    I = XTest(:,:,:,idx(i));
    imshow(I)

    label = string(YTest(idx(i)));
    title("Predicted Label: " + label)
end

Consulte también

| | | | | | | |

Ejemplos relacionados

Más acerca de