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.
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
dlnetwork
| dlfeval
| dlarray
| fullyConnectedLayer
| Deep Network Designer | featureInputLayer
| minibatchqueue
| onehotencode
| onehotdecode
Ejemplos relacionados
- Crear una red neuronal de deep learning sencilla para clasificación
- Entrenar una red neuronal convolucional para regresión