Main Content

Transferencia del aprendizaje con Deep Network Designer

Este ejemplo muestra cómo realizar transferencias del aprendizaje de manera interactiva mediante la app Deep Network Designer.

La transferencia del aprendizaje es un proceso que consiste en elegir una red de deep learning preentrenada y ajustarla para aprender una tarea nueva. Utilizar la transferencia del aprendizaje es normalmente un proceso más rápido y sencillo que entrenar una red desde cero. Puede transferir de forma rápida las características aprendidas a una nueva tarea con menos cantidad de datos.

Utilice Deep Network Designer para realizar transferencias del aprendizaje para la clasificación de imágenes siguiendo estos pasos:

  1. Abra la app Deep Network Designer y elija una red preentrenada.

  2. Importe el nuevo conjunto de datos.

  3. Reemplace las capas finales por otras adaptadas al nuevo conjunto de datos.

  4. Establezca las tasas de aprendizaje para aprender más rápido en las nuevas capas que en las capas transferidas.

  5. Entrene la red con Deep Network Designer o expórtela para entrenarla en la línea de comandos.

Extraer datos

En el espacio de trabajo, extraiga el conjunto de datos MathWorks Merch. Se trata de un conjunto de datos pequeño que contiene 75 imágenes de artículos promocionales de MathWorks que pertenecen a cinco clases distintas (gorra, cubo, naipes, destornillador y linterna).

unzip("MerchData.zip");

Seleccionar una red preentrenada

Para abrir Deep Network Designer, en la pestaña Apps, en Machine Learning and Deep Learning, haga clic en el icono de la app. Como alternativa, puede abrir la app desde la línea de comandos:

deepNetworkDesigner

Deep Network Designer proporciona una selección de redes de clasificación de imágenes que han aprendido representaciones ricas en características adecuadas para una amplia gama de imágenes. La transferencia del aprendizaje funciona mejor si las imágenes son similares a las imágenes utilizadas originalmente para entrenar la red. Si sus imágenes de entrenamiento son imágenes naturales como las de la base de datos ImageNet, cualquiera de las redes preentrenadas es adecuada. Para obtener una lista de redes disponibles y aprender a compararlas, consulte Redes neuronales profundas preentrenadas.

Si sus datos son muy diferentes a los datos de ImageNet (por ejemplo, si tiene imágenes diminutas, espectrogramas o datos que no sean imágenes) será mejor entrenar una nueva red. Para ver un ejemplo de cómo entrenar una red desde cero, consulte Create Simple Sequence Classification Network Using Deep Network Designer y Train Simple Semantic Segmentation Network in Deep Network Designer.

SqueezeNet no requiere otro paquete de soporte. En el caso de otras redes preentrenadas, si no ha instalado los paquetes de soporte requeridos, la app ofrece la opción Install.

Seleccione SqueezeNet de la lista de redes preentrenadas y haga clic en Open.

Explorar una red

Deep Network Designer muestra una vista alejada de la totalidad de la red en el panel Designer.

Explore la gráfica de red. Para ampliarla con el ratón, utilice Ctrl + la rueda de desplazamiento. Para desplazarse, utilice las teclas de flecha o mantenga pulsada la rueda de desplazamiento y arrastre el ratón. Seleccione una capa para ver sus propiedades. Quite la selección de todas las capas para ver el resumen de la red en el panel Properties.

Importar datos

Para cargar los datos en Deep Network Designer, vaya a la pestaña Data y haga clic en Import Data > Import Image Data. Se abrirá el cuadro de diálogo Import Image Data.

En la lista Data source, seleccione Folder. Haga clic en Browse y seleccione la carpeta MerchData que ha extraído.

Aumento de imágenes

Puede optar por aplicar el aumento de imágenes a sus datos de entrenamiento. La app Deep Network Designer proporciona las siguientes opciones de aumento:

  • Reflexión aleatoria en el eje x

  • Reflexión aleatoria en el eje y

  • Rotación aleatoria

  • Reescalado aleatorio

  • Traslación horizontal aleatoria

  • Traslación vertical aleatoria

Puede incrementar de forma efectiva la cantidad de datos de entrenamiento aplicando un aumento aleatorio a los datos. El aumento también permite entrenar redes para que permanezcan invariables a las distorsiones en los datos de imágenes. Por ejemplo, puede añadir rotaciones aleatorias para introducir imágenes de manera que una red permanezca invariable ante la presencia de rotación en las imágenes de entrada.

Para este ejemplo, aplique una reflexión aleatoria en el eje x, una rotación aleatoria a partir del intervalo [-90,90] grados, y un reescalado aleatorio a partir del intervalo [1,2].

Datos de validación

También puede seleccionar los datos de validación dividiéndolos de los datos de entrenamiento, lo que se denomina validación de retención, o importándolos desde otra fuente. La validación calcula el rendimiento del modelo con los datos nuevos en comparación con los datos del entrenamiento, y ayuda a monitorizar el rendimiento y protegerse de un sobreajuste.

En este ejemplo, utilice el 30% de las imágenes para la validación.

Haga clic en Import para importar los datos en Deep Network Designer.

Visualizar datos

Deep Network Designer permite realizar una inspección visual de la distribución de los datos de entrenamiento y los datos de validación en la pestaña Data. Puede ver que, en el caso de este ejemplo, hay cinco clases en el conjunto de datos. También puede ver observaciones aleatorias de cada clase.

Preparar la red para el entrenamiento

Edite la red en el panel Designer para especificar un número nuevo de clases en los datos. Para preparar la red para la transferencia del aprendizaje, sustituya la última capa de aprendizaje y la última capa de clasificación.

Remplazar la última capa de aprendizaje

Para usar una red preentrenada para la transferencia del aprendizaje, debe modificar el número de clases de forma que coincida con el nuevo conjunto de datos. En primer lugar, encuentre la última capa de aprendizaje de la red. En SqueezeNet, la última capa de aprendizaje es la última capa convolucional ('conv10'). En este caso, sustitúyala por una nueva capa convolucional con un número de filtros igual al número de clases.

Arrastre una nueva capa convolution2dLayer al lienzo. Para que coincida con la capa convolucional original, establezca FilterSize en 1,1.

La propiedad NumFilters define el número de clases para los problemas de clasificación. Cambie NumFilters por el número de clases de los nuevos datos (5 en este ejemplo).

Modifique las tasas de aprendizaje para aprender más rápido en la nueva capa que en las capas transferidas estableciendo los valores WeightLearnRateFactor y BiasLearnRateFactor en 10.

Elimine la última capa convolucional 2D y conecte en su lugar la nueva capa.

Remplazar la capa de salida

En el caso de la transferencia del aprendizaje, es necesario que reemplace la capa de salida. Desplácese hasta el final de la biblioteca Layer Library y arrastre una nueva capa classificationLayer al lienzo. Elimine la capa de clasificación original y conecte la capa nueva en su lugar.

En el caso de una capa de salida nueva, no es necesario establecer el OutputSize. En el momento del entrenamiento, Deep Network Designer establece de forma automática las clases de salida de la capa a partir de los datos.

Comprobar la red

Para comprobar que la red está preparada para el entrenamiento, haga clic en Analyze. Si el analizador Deep Learning Network Analyzer no detecta ningún error, la red editada está preparada para el entrenamiento.

Entrenar la red

En Deep Network Designer puede entrenar redes importadas o creadas en la app.

Para entrenar la red con la configuración predeterminada, vaya a la pestaña Training y haga clic en Train. Las opciones de entrenamiento predeterminadas resultan más adecuadas para los conjuntos de datos de gran tamaño. En el caso de conjuntos de datos pequeños, reduzca el tamaño de minilote y la frecuencia de validación.

Si desea obtener un mayor grado de control sobre el entrenamiento, haga clic en Training Options y seleccione la configuración de entrenamiento.

  • Para ralentizar el aprendizaje en las capas transferidas, establezca la tasa de aprendizaje inicial en un valor pequeño.

  • Especifique la frecuencia de validación para que la precisión de los datos de validación se calcule una vez por época.

  • Especifique un número pequeño de épocas. Una época es un ciclo de entrenamiento completo en el conjunto total de datos de entrenamiento. En el caso de la transferencia del aprendizaje, no es necesario entrenar durante tantas épocas.

  • Especifique el tamaño de minilote, es decir, cuántas imágenes se pueden utilizar en cada iteración. Para asegurarse de que la totalidad del conjunto de datos se utiliza durante cada época, establezca el tamaño de minilote para dividir el número de muestras de entrenamiento de manera uniforme.

En este ejemplo, establezca InitialLearnRate en 0.0001, ValidationFrequency en 5 y MaxEpochs en 8. Dado que hay 55 observaciones, establezca MiniBatchSize en 11 para dividir los datos de entrenamiento de forma uniforme y asegúrese de que utiliza la totalidad del conjunto de entrenamiento durante cada una de las épocas. Para obtener más información sobre cómo seleccionar las opciones de entrenamiento, consulte trainingOptions.

Para entrenar la red con las opciones de entrenamiento especificadas, haga clic en Close y luego en Train.

Deep Network Designer permite visualizar y monitorizar el progreso del entrenamiento. Después, puede editar las opciones de entrenamiento y volver a entrenar la red si lo necesita.

Para guardar la gráfica del entrenamiento como una imagen, haga clic en Export Training Plot.

Exportar resultados y generar código de MATLAB

Para exportar la arquitectura de red con los pesos entrenados, vaya a la pestaña Training y seleccione Export > Export Trained Network and Results. Deep Network Designer exporta la red entrenada como la variable trainedNetwork_1 y la información del entrenamiento como la variable trainInfoStruct_1.

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [3.1028 3.7235 3.5007 1.2493 1.5267 1.4770 1.2506 1.5767 1.0273 1.1279 0.6417 0.7218 0.7767 0.4651 0.7253 0.5403 0.5126 0.3012 0.6455 0.3326 0.2897 0.4604 0.3298 0.1844 0.2311 0.1436 0.1762 0.2212 0.0945 0.3570 0.1205 … ]
           TrainingAccuracy: [36.3636 27.2727 27.2727 45.4545 36.3636 36.3636 63.6364 36.3636 63.6364 63.6364 81.8182 81.8182 72.7273 90.9091 72.7273 90.9091 81.8182 100 81.8182 100 100 81.8182 81.8182 100 100 100 90.9091 100 100 81.8182 100 100 100 … ]
             ValidationLoss: [3.4224 NaN NaN NaN 1.6053 NaN NaN NaN NaN 0.8457 NaN NaN NaN NaN 0.4648 NaN NaN NaN NaN 0.4317 NaN NaN NaN NaN 0.3389 NaN NaN NaN NaN 0.3652 NaN NaN NaN NaN 0.4322 NaN NaN NaN NaN 0.4720]
         ValidationAccuracy: [30 NaN NaN NaN 30 NaN NaN NaN NaN 70 NaN NaN NaN NaN 85 NaN NaN NaN NaN 80 NaN NaN NaN NaN 85 NaN NaN NaN NaN 85 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90]
              BaseLearnRate: [1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 … ]
        FinalValidationLoss: 0.4720
    FinalValidationAccuracy: 90
     OutputNetworkIteration: 40

También puede generar código de MATLAB, que recrea la red y las opciones de entrenamiento utilizadas. Vaya a la pestaña Training y seleccione Export > Generate Code for Training. Examine el código de MATLAB para aprender a preparar los datos de forma programática para el entrenamiento, a crear la arquitectura de red y a entrenar la red.

Clasificar una imagen nueva

Cargue una nueva imagen para clasificarla con la red entrenada.

I = imread("MerchDataTest.jpg");

Deep Network Designer cambia el tamaño de las imágenes durante el entrenamiento de forma que coincidan con el tamaño de entrada de la red. Para ver el tamaño de entrada de la red, vaya al panel Designer y seleccione imageInputLayer (primera capa). El tamaño de entrada de la red es de 227 por 227.

Cambie el tamaño de la imagen de prueba de forma que coincida con el tamaño de entrada de la red.

I = imresize(I, [227 227]);

Clasifique la imagen de prueba con la red entrenada.

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

Consulte también

Temas relacionados