Path: blob/master/site/es-419/tutorials/images/transfer_learning.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Aprendizaje por transferencia y la puesta a punto
En este tutorial aprenderá a clasificar imágenes de perros y gatos usando el aprendizaje por transferencia a partir de una red preentrenada.
Un modelo preentrenado es una red guardada que se ha entrenado previamente en un gran conjunto de datos, normalmente en una tarea de clasificación de imágenes a gran escala. Puede usar el modelo preentrenado tal cual o utilizar el aprendizaje por transferencia para adaptar este modelo a una tarea determinada.
La intuición que hay detrás del aprendizaje por transferencia para la clasificación de imágenes es que si se entrena un modelo en un conjunto de datos lo suficientemente grande y general, este modelo servirá efectivamente como modelo genérico del mundo visual. Entonces, se pueden aprovechar estos mapas de características aprendidas sin tener que empezar de cero a entrenar un modelo amplio en un gran conjunto de datos.
En este bloc de notas, probará dos formas de personalizar un modelo preentrenado:
Extracción de características: Use las representaciones aprendidas por una red anterior para extraer características significativas de las nuevas muestras. Basta con añadir un nuevo clasificador, que se entrenará desde cero, sobre el modelo preentrenado para poder reutilizar los mapas de características aprendidas previamente para el conjunto de datos.
No es necesario (re)entrenar todo el modelo. La red convolucional base ya contiene características que son genéricamente útiles para clasificar imágenes. Sin embargo, la parte final de clasificación del modelo preentrenado es específica de la tarea de clasificación original y, posteriormente, específica del conjunto de clases sobre las que se estableció el modelo.
Ajuste fino: Desbloquee algunas de las capas superiores de un modelo base inmovilizado y entrene conjuntamente tanto las capas clasificadoras recién añadidas como las últimas capas del modelo base. Esto nos permite "afinar" las representaciones de características de más alto orden en el modelo base para hacerlas más relevantes en la tarea específica.
Seguirá el flujo de trabajo general del aprendizaje automático.
Examinar y comprender los datos
Construir una canalización de entrada, en este caso usando el ImageDataGenerator de Keras.
Armar el modelo
Cargar el modelo base preentrenado (y las ponderaciones preentrenadas)
Acumular las capas de clasificación en la parte superior
Entrenar el modelo
Evaluar el modelo
Preprocesamiento de los datos
Descarga de datos
En este tutorial, usará un conjunto de datos compuesto por varios miles de imágenes de gatos y perros. Descargue y extraiga un archivo zip que contiene las imágenes y, a continuación, cree un tf.data.Dataset
para el entrenamiento y la validación mediante la utilidad tf.keras.utils.image_dataset_from_directory
. Si desea obtener más información sobre la carga de imágenes, consulte este tutorial.
Muestre las nueve primeras imágenes y etiquetas del conjunto de entrenamiento:
Como el conjunto de datos original no incluye un conjunto de prueba, deberá crear uno. Para ello, determine cuántos lotes de datos están disponibles en el conjunto de validación utilizando tf.data.experimental.cardinality
y, a continuación, traslade el 20 % de ellos a un conjunto de prueba.
Configurar el conjunto de datos para rendimiento
Use la preextracción en búfer para cargar imágenes desde el disco sin que la E/S se bloquee. Si desea más información sobre este método, consulte la guía rendimiento de datos.
Usar aumentación de datos
Cuando no se dispone de un gran conjunto de datos de imágenes, es una buena práctica introducir artificialmente la diversidad del muestreo aplicando transformaciones aleatorias, aunque realistas, a las imágenes de entrenamiento, como la rotación y el volteado horizontal. Esto ayuda a exponer el modelo a diferentes aspectos de los datos de entrenamiento y a reducir el sobreajuste. Si desea obtener más información sobre la aumentación de datos, consulte este tutorial.
Nota: Estas capas sólo están activas durante el entrenamiento, cuando se llama a Model.fit
. Están inactivas cuando se usa el modelo en modo de inferencia en Model.evaluate
, Model.predict
, o Model.call
.
Apliquemos repetidamente estas capas a la misma imagen y veamos el resultado.
Reescalar valores de pixel
En un momento, descargará tf.keras.applications.MobileNetV2
para usarlo como modelo base. Este modelo espera valores de píxel en [-1, 1]
, pero en este momento, los valores de píxel de sus imágenes están en [0, 255]
. Para reescalarlos, use el método de preprocesamiento incluido con el modelo.
Nota: Como alternativa, podría reescalar los valores de los píxeles de [0, 255]
a [-1, 1]
usando tf.keras.layers.Rescaling
.
Nota: Si utiliza otras tf.keras.applications
, asegúrese de consultar la documentación de la API para determinar si esperan pixeles en [-1, 1]
o [0, 1]
, o use la función incluida preprocess_input
.
Crear el modelo base a partir de las redes convolucionales preentrenadas
Creará el modelo base a partir del modelo MobileNet V2 desarrollado en Google. Éste está preentrenado en el conjunto de datos ImageNet, un gran conjunto de datos compuesto por 1.4M de imágenes y 1000 clases. ImageNet es un conjunto de datos de entrenamiento para la investigación con una gran variedad de categorías como jackfruit
y syringe
. Esta base de conocimientos nos ayudará a clasificar perros y gatos a partir de nuestro conjunto de datos específico.
En primer lugar, tiene que elegir qué capa de MobileNet V2 va a usar para la extracción de características. La última capa de clasificación (en la "parte superior", ya que la mayoría de los diagramas de modelos de aprendizaje automático van de abajo a arriba) no es muy útil. En su lugar, seguirá la práctica común de depender de la última capa antes de la operación de aplanamiento. Esta capa se denomina "capa cuello de botella". Las características de la capa cuello de botella conservan más generalidad comparadas con las de la capa final/superior.
En primer lugar, instancie un modelo MobileNet V2 precargado con ponderaciones entrenadas en ImageNet. Al especificar el argumento include_top=False, se carga una red que no incluye las capas de clasificación en la parte superior, lo que resulta ideal para la extracción de características.
Este extractor de características convierte cada imagen 160x160x3
en un bloque 5x5x1280
de características. Veamos lo que hace con un lote de imágenes de ejemplo:
Extracción de características
En este paso, congelará la base convolucional creada en el paso anterior y la usará como extractor de características. Además, añadirá un clasificador sobre ella y entrenará al clasificador de nivel superior.
Congelar la base convolucional
Es importante congelar la base convolucional antes de compilar y entrenar el modelo. La congelación (al configurar layer.trainable = False) impide que las ponderaciones de una capa determinada se actualicen durante el entrenamiento. MobileNet V2 tiene muchas capas, por lo que si configura el indicador trainable
de todo el modelo en False, se congelarán todas ellas.
Nota importante sobre las capas BatchNormalization
Muchos modelos contienen capas tf.keras.layers.BatchNormalization
. Esta capa es un caso especial y deben tomarse precauciones en el contexto del ajuste fino, como se muestra más adelante en este tutorial.
Si configura layer.trainable = False
, la capa BatchNormalization
se ejecutará en modo de inferencia y no actualizará sus estadísticas de media y varianza.
Cuando descongele un modelo que contenga capas BatchNormalization para realizar un ajuste fino, deberá mantener las capas BatchNormalization en modo de inferencia pasando training = False
al llamar al modelo base. De lo contrario, las actualizaciones aplicadas a las ponderaciones no entrenables destruirán lo que el modelo ha aprendido.
Para más detalles, consulte la Guía de aprendizaje por transferencia.
Añadir una cabecera de clasificación
Para generar predicciones a partir del bloque de características, realice un promedio sobre las ubicaciones espaciales 5x5
, usando una capa tf.keras.layers.GlobalAveragePooling2D
para convertir las características en un único vector de 1280 elementos por imagen.
Aplique una capa tf.keras.layers.Dense
para convertir estas características en una única predicción por imagen. No necesita una función de activación aquí porque esta predicción se tratará como un logit
, o un valor de predicción en bruto. Los números positivos predicen la clase 1, los números negativos predicen la clase 0.
Construya un modelo encadenando las capas de aumento de datos, reescalado, base_model
y extractor de características usando la API Functional de Keras. Como se mencionó anteriormente, use training=False
ya que nuestro modelo contiene una capa BatchNormalization
.
Los más de 8 millones de parámetros de MobileNet están congelados, pero hay 1.2 mil parámetros entrenables en la capa Dense. Éstos se dividen entre dos objetos tf.Variable
, las ponderaciones y los sesgos.
Compilar el modelo
Compile el modelo antes de entrenarlo. Como hay dos clases, use la pérdida tf.keras.losses.BinaryCrossentropy
con from_logits=True
ya que el modelo proporciona una salida lineal.
Entrenar el modelo
Tras un entrenamiento de 10 épocas, debería obtener una precisión del 96 % en el conjunto de validación.
Curvas de aprendizaje
Analicemos las curvas de aprendizaje de la precisión/pérdida en el entrenamiento y la validación al usar el modelo base MobileNetV2 como extractor de características fijas.
Nota: Si se pregunta por qué las métricas de validación son claramente mejores que las de entrenamiento, el factor principal se debe a que capas como tf.keras.layers.BatchNormalization
y tf.keras.layers.Dropout
afectan a la precisión durante el entrenamiento. Se desactivan cuando se calcula la pérdida de validación.
En menor medida, también se debe a que las métricas de entrenamiento informan de la media de una época, mientras que las métricas de validación se evalúan después de la época, por lo que las métricas de validación ven un modelo que ha entrenado ligeramente más tiempo.
Afinado
En el experimento de extracción de características, sólo se entrenaron unas pocas capas sobre un modelo base MobileNetV2. Las ponderaciones de la red preentrenada no se actualizaron durante el entrenamiento.
Una forma de aumentar aún más el rendimiento es entrenar (o "afinar") las ponderaciones de las capas superiores del modelo preentrenado junto con el entrenamiento del clasificador que ha añadido. El proceso de entrenamiento forzará el afinado de las ponderaciones a partir de mapas de características genéricas a características asociadas específicamente con el conjunto de datos.
Nota: Esto sólo debe intentarse después de haber entrenado el clasificador de nivel superior con el modelo preentrenado configurado como no entrenable. Si añade un clasificador inicializado aleatoriamente sobre un modelo preentrenado e intenta entrenar todas las capas conjuntamente, la magnitud de las actualizaciones del gradiente será demasiado grande (debido a las ponderaciones aleatorias del clasificador) y su modelo preentrenado olvidará lo que ha aprendido.
Además, debería intentar afinar un pequeño número de capas superiores en lugar de todo el modelo MobileNet. En la mayoría de las redes convolucionales, cuanto más alta es una capa, más especializada está. Las primeras capas aprenden características muy simples y genéricas que se generalizan a casi todos los tipos de imágenes. A medida que se asciende, las características son cada vez más específicas del conjunto de datos sobre el que se ha entrenado el modelo. La meta de la afinación es adaptar estas características especializadas para que funcionen con el nuevo conjunto de datos, en lugar de sobrescribir el aprendizaje genérico.
Descongelar las capas superiores del modelo
Todo lo que tiene que hacer es descongelar el base_model
y configurar que las capas inferiores no se puedan entrenar. Luego, deberá recompilar el modelo (necesario para que estos cambios surtan efecto), y reanudar el entrenamiento.
Compilar el modelo
Como está entrenando un modelo mucho más grande y quiere readaptar las ponderaciones preentrenadas, es importante usar una tasa de aprendizaje más baja en esta fase. De lo contrario, su modelo podría sobreajustarse muy rápidamente.
Continuar entrenando el modelo
Si se ha entrenado antes hasta la convergencia, este paso mejorará su precisión en algunos puntos porcentuales.
Echemos un vistazo a las curvas de aprendizaje de la precisión/pérdida de entrenamiento y validación al ajustar las últimas capas del modelo base MobileNetV2 y entrenar el clasificador sobre él. La pérdida de validación es mucho mayor que la pérdida de entrenamiento, por lo que es posible que se produzca un sobreajuste.
También es posible que se produzca cierto sobreajuste, ya que el nuevo conjunto de entrenamiento es relativamente pequeño y similar a los conjuntos de datos originales de MobileNetV2.
Tras el afinamiento, el modelo alcanza casi un 98 % de precisión en el conjunto de validación.
Evaluación y predicción
Por último, puede verificar el rendimiento del modelo en los nuevos datos usando el conjunto de pruebas.
Y ahora ya está todo configurado para usar este modelo para predecir si su mascota es un gato o un perro.
Resumen
Usar un modelo preentrenado para la extracción de características: Cuando se trabaja con un conjunto de datos pequeño, es una práctica común aprovechar las características aprendidas por un modelo entrenado en un conjunto de datos más grande en el mismo dominio. Esto se hace instanciando el modelo preentrenado y añadiendo encima un clasificador totalmente conectado. El modelo preentrenado se "congela" y sólo se actualizan las ponderaciones del clasificador durante el entrenamiento. En este caso, la base convolucional extrajo todas las características asociadas a cada imagen y usted acaba de entrenar un clasificador que determina la clase de imagen dado ese conjunto de características extraídas.
{nbsp}Afinando un modelo preentrenado: Para mejorar aún más el rendimiento, quizá quiera adaptar las capas superiores de los modelos preentrenados al nuevo conjunto de datos afinando el ajuste. En este caso, ajustó las ponderaciones de forma que su modelo aprendiera características de alto nivel específicas del conjunto de datos. Esta técnica suele recomendarse cuando el conjunto de datos de entrenamiento es grande y muy similar al conjunto de datos original en el que se entrenó el modelo preentrenado.
Para saber más, visite la Guía de aprendizaje por transferencia.