Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Transferencia del aprendizaje mediante una red preentrenada

Este ejemplo muestra cómo ajustar una red neuronal convolucional GoogLeNet preentrenada para clasificar una nueva colección de imágenes.

GoogLeNet se ha entrenado con más de un millón de imágenes y puede clasificarlas en 1000 categorías de objetos (como teclado, taza de café, lápiz y muchos animales). La red ha aprendido representaciones ricas en características para una amplia gama de imágenes. La red toma una imagen como entrada y, a continuación, emite una etiqueta para el objeto en la imagen junto con las probabilidades para cada una de las categorías de objetos.

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 datos

Descomprima y cargue las nuevas imágenes como un almacén de datos de imágenes. imageDatastore etiqueta de forma automática las imágenes basándose en los nombres de las carpetas y almacena los datos como un objeto ImageDatastore. Un almacén de datos de imágenes permite almacenar un gran volumen 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 convolucional.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Divida los datos en conjuntos de datos de entrenamiento y de validación. Utilice el 70% de las imágenes para el entrenamiento y el 30% para la validación. splitEachLabel divide el almacén de datos de imágenes en dos nuevos almacenes de datos.

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

Este pequeño conjunto de datos ahora contiene solo 55 imágenes de entrenamiento y 20 imágenes de validación. Visualice algunas imágenes de muestra.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

Cargar una red preentrenada

Cargue la red neuronal GoogLeNet preentrenada. Si no se ha instalado Deep Learning Toolbox™ Model for GoogLeNet Network, el software proporciona un enlace de descarga.

net = googlenet;

Utilice deepNetworkDesigner para obtener una visualización interactiva de la arquitectura de la red e información detallada sobre sus capas.

deepNetworkDesigner(net)

La primera capa, que es la de entrada de imágenes, requiere imágenes de entrada de un tamaño de 224 por 224 por 3, donde 3 es el número de canales de color.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   224   224     3

Sustituir capas finales

La capa totalmente conectada y la capa de clasificación de la red net preentrenada están configuradas para 1000 clases. Estas dos capas, loss3-classifier y output en GoogLeNet, contienen información sobre cómo combinar las características que la red extrae en probabilidades de clase, un valor de pérdida y etiquetas predichas. Para volver a entrenar una red preentrenada para clasificar nuevas imágenes, hay que sustituir estas dos capas por otras adaptadas al nuevo conjunto de datos.

Extraiga la gráfica de capas a partir de la red entrenada.

lgraph = layerGraph(net); 

Sustituya la capa totalmente conectada por una nueva capa totalmente conectada que tenga un número de salidas igual al número de clases. Para que el aprendizaje sea más rápido en las nuevas capas que en las capas transferidas, aumente los valores de WeightLearnRateFactor y BiasLearnRateFactor en la capa totalmente conectada.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses, ...
    'Name','new_fc', ...
    'WeightLearnRateFactor',10, ...
    'BiasLearnRateFactor',10);
    
lgraph = replaceLayer(lgraph,'loss3-classifier',newLearnableLayer);

La capa de clasificación especifica las clases de salida de la red. Sustituya la capa de clasificación por una nueva sin etiquetas de clase. trainNetwork establece automáticamente las clases de salida de la capa en el momento del entrenamiento.

newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'output',newClassLayer);

Entrenar la red

La red requiere imágenes de entrada de un tamaño de 224 por 224 por 3, pero las imágenes de los almacenes de datos de imágenes tienen diferentes tamaños. Utilice un almacén de datos de imágenes aumentado para cambiar automáticamente el tamaño de las imágenes de entrenamiento. Especifique operaciones de aumento adicionales para realizar en las imágenes de entrenamiento: voltear aleatoriamente las imágenes de entrenamiento a lo largo del eje vertical y trasladarlas aleatoriamente hasta 30 píxeles horizontal y verticalmente. El aumento de datos ayuda a evitar que la red se sobreajuste y memorice los detalles exactos de las imágenes de entrenamiento.

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

Para cambiar el tamaño de las imágenes de validación de forma automática sin realizar más aumentos de datos, utilice un almacén de datos de imágenes aumentadas sin especificar ninguna operación adicional de preprocesamiento.

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

Especifique las opciones de entrenamiento. Para la transferencia del aprendizaje, mantenga las características de las primeras capas de la red preentrenada (los pesos de las capas transferidas). Para ralentizar el aprendizaje en las capas transferidas, establezca la tasa de aprendizaje inicial en un valor pequeño. En el paso anterior, aumentó los factores de la tasa de aprendizaje de la capa totalmente conectada para acelerar el aprendizaje en las nuevas capas finales. Esta combinación de ajustes de la tasa de aprendizaje da como resultado un aprendizaje rápido solo en las capas nuevas y un aprendizaje más lento en las demás. Al realizar la transferencia del aprendizaje, no es necesario entrenar durante tantas épocas. Una época es un ciclo de entrenamiento completo en el conjunto total de datos de entrenamiento. Especifique el tamaño del minilote y los datos de validación. El software valida la red cada iteración de ValidationFrequency durante el entrenamiento.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

Entrene la red formada por las capas transferidas y las nuevas. De forma predeterminada, trainNetwork usa GPU en caso de que esté disponible. Se requiere Parallel Computing Toolbox™ y un dispositivo con GPU compatible. Para obtener información sobre los dispositivos compatibles, consulte GPU Computing Requirements (Parallel Computing Toolbox). De lo contrario, usa una CPU. También puede especificar el entorno de ejecución con el argumento de par nombre-valor 'ExecutionEnvironment' de trainingOptions.

netTransfer = trainNetwork(augimdsTrain,lgraph,options);

Clasificar imágenes de validación

Clasifique las imágenes de validación utilizando la red ajustada.

[YPred,scores] = classify(netTransfer,augimdsValidation);

Visualice cuatro imágenes de validación de muestra con etiquetas predichas.

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

Calcule la precisión de la clasificación en el conjunto de validación. La precisión es la fracción de etiquetas que la red predice correctamente.

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 1

Para obtener consejos para mejorar la precisión de la clasificación, consulte Trucos y consejos de deep learning.

Referencias

[1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems 25 (2012).

[2] Szegedy, Christian, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. "Going deeper with convolutions." Proceedings of the IEEE conference on computer vision and pattern recognition (2015): 1–9.

Consulte también

| | | | |

Temas relacionados