Main Content

Introducción a la transferencia del aprendizaje

Este ejemplo muestra cómo usar Deep Network Designer para preparar una red para la transferencia del aprendizaje.

La transferencia del aprendizaje se suele usar en aplicaciones de deep learning. Se puede usar una red preentrenada como punto de partida para aprender una nueva tarea. Ajustar una red con transferencia del aprendizaje suele ser más rápido y fácil que entrenarla con pesos inicializados al azar de cero. Puede transferir de forma rápida las características aprendidas a una nueva tarea con menos imágenes de entrenamiento.

Cargar los datos de imagen

En el área de trabajo, extraiga el conjunto de datos MathWorks® Merch. Para acceder a los datos, abra el ejemplo como un script en vivo. Este conjunto de datos pequeño contiene 75 imágenes de artículos promocionales de MathWorks que pertenecen a cinco clases distintas (gorra, cubo, naipes, destornillador y linterna).

folderName = "MerchData";
unzip("MerchData.zip",folderName);

Cree un almacén de datos de imágenes. Un almacén de datos de imágenes permite almacenar grandes colecciones 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. Especifique la carpeta con las imágenes extraídas e indique que los nombres de las subcarpetas corresponden a las etiquetas de las imágenes.

imds = imageDatastore(folderName, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

Visualice algunas imágenes de muestra.

numImages = numel(imds.Labels);
idx = randperm(numImages,16);
I = imtile(imds,Frames=idx);
figure
imshow(I)

Extraiga los nombres de las clases y el número de clases.

classNames = categories(imds.Labels);
numClasses = numel(classNames);

Divida los datos en conjuntos de datos de entrenamiento, validación y prueba. Utilice el 70% de las imágenes para el entrenamiento, el 15% para la validación y el 15% para la prueba. La función splitEachLabel divide el almacén de datos de imágenes en tres nuevos almacenes de datos.

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

Cargar una red preentrenada

Para adaptar una red neuronal preentrenada a una nueva tarea, use la app Deep Network Designer.

deepNetworkDesigner

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

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

Editar una red para la transferencia del aprendizaje

Para volver a entrenar SqueezeNet para clasificar nuevas imágenes, edite la última capa convolucional 2D de la red, conv10.

En el panel Designer, seleccione la capa conv10. En la parte inferior del panel Properties, haga clic en Unlock Layer. En el cuadro de advertencia que aparece, haga clic en Unlock Anyway. De este modo, se desbloquean las propiedades de la capa para que pueda adaptarlas a su nueva tarea.

Establezca la propiedad NumFilters en el nuevo número de clases. En este ejemplo, serían 5. 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.

Para comprobar que la red está preparada para el entrenamiento, haga clic en Analyze. Dado que el analizador Deep Learning Network Analyzer no detecta ningún error o advertencia, la red está preparada para el entrenamiento. Para exportar la red, haga clic en Export. La app guarda la red en la variable net_1.

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.

options = trainingOptions("adam", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

Entrenar una red neuronal

Entrene la red neuronal con la función trainnet. Como el objetivo es la clasificación, use la pérdida de entropía cruzada.

net = trainnet(imdsTrain,net_1,"crossentropy",options);

Probar una red neuronal

Clasifique las imágenes de prueba. Para hacer predicciones con varias observaciones, utilice la función minibatchpredict. Para convertir las puntuaciones de predicción en etiquetas, utilice la función scores2label. La función minibatchpredict usa automáticamente una GPU en caso de que esté disponible.

inputSize = net.Layers(1).InputSize(1:2);

augimdsTrain = augmentedImageDatastore(inputSize,imdsTest);

YTest = minibatchpredict(net,imdsTest);
YTest = scores2label(YTest,classNames);

Visualice la precisión de clasificación en una gráfica de confusión.

TTest = imdsTest.Labels;
figure
confusionchart(TTest,YTest);

Clasificar una imagen nueva

Clasifique una imagen de prueba. Lea una imagen de un archivo JPEG, cambie su tamaño y conviértala al tipo de datos single.

im = imread("MerchDataTest.jpg");

im = imresize(im,inputSize(1:2));
X = single(im);

Clasifique la imagen. Para hacer una predicción con una sola observación, utilice la función predict.

scores = predict(net,X);
[label,score] = scores2label(scores,classNames);

Muestre la imagen con la etiqueta predicha y la puntuación correspondiente.

figure
imshow(im)
title(string(label) + " (Score: " + gather(score) + ")")

Para obtener más información sobre la transferencia del aprendizaje y cómo mejorar el rendimiento de la red, consulte Retrain Neural Network to Classify New Images.

Referencias

[1] ImageNet. http://www.image-net.org.

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

Consulte también

| | | |

Temas relacionados