3.14 - Práctica 2: transferencia de aprendizaje con VGG-16

Lección 14 de la sección “Redes Convolucionales” del curso Fundamentos de Deep Learning con Python.

Introducción

En la lección anterior vimos cómo AlexNet y VGGNet fueron las primeras Redes Convolucionales profundas que lograron un desempeño cercano al del ser humano en una tarea de clasificación de imágenes.

En esta práctica veremos cómo usar una variante de VGGNet, conocida como VGG-16, para implementar un clasificador de imágenes muy robusto y usando una técnica del Deep Learning conocida como la transferencia de aprendizaje.

Contenido exclusivo suscriptores

Suscríbete y accede al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

El problema a resolver

Queremos usar el set tf_flowers, que posee 3670 imágenes y 5 categorías, para implementar un clasificador basado en Redes Convolucionales.

Alternativas de solución

Para resolver este problema podemos usar dos enfoques:

  1. Crear y entrenar “desde cero” una Red Convolucional
  2. Aprovechar modelos pre-entrenados (como VGG-16), con un buen desempeño, para resolver esta tarea

En esta práctica usaremos el segundo enfoque, que se conoce precisamente como transferencia del aprendizaje.

La transferencia de aprendizaje

La transferencia de aprendizaje consiste en tomar un modelo pre-entrenado con un set de datos extenso y posteriormente “afinarlo” para una tarea de clasificación en particular.

En este caso tomaremos VGG-16, una arquitectura que ha sido previamente entrenada usando el set ImageNet.

Si observamos esta red veremos que contiene dos bloques de procesamiento básicos: uno de extracción de características (conformado por todos los bloques convolucionales), seguido por bloques de salida tipo fully connected (Red Neuronal) encargados de la clasificación.

La idea de la transferencia de aprendizaje es la siguiente:

Descarga del set de datos, creación de los sets de entrenamiento y prueba y exploración

El dataset puede ser fácilmente descargado usando TensorFlow (en particular el módulo tfds).

Cada arreglo (entrenamiento y prueba) es una variable tipo “EagerTensor” que debemos convertir a formato Numpy.

Una vez leído el dataset podemos verificar que las flores pueden pertenecer a una de 5 categorías:

Pre-procesamiento del set de datos

En primer lugar debemos reajustar el tamaño de las imágenes a 224x224x3 y eliminar las imágenes originales para optimizar uso de la RAM en Google Colab. Para esto usamos los módulos image.resize de Tensorflow.

A continuación representamos la categoría de cada dato en el formato one-hot, usando el módulo to_categorical de la librería Keras.

Adicionalmente las imágenes deben ser pre-procesadasde igual forma a como lo hacen los autores de VGG-16 con las imágenes de ImageNet, para lo cual podemos usar el módulo preprocess_input de Tensorflow.

Preparación del modelo pre-entrenado (VGG-16)

Usando Keras, tomaremos el modelo VGG-16 pre-entrenado (usando el módulo VGG16) pero eliminaremos las capas fully connected (se preservarán únicamente las capas de extracción de características). Además lo “congelaremos” para que no puedan ser entrenadas estas capas.

Entrenamiento del modelo (transferencia de aprendizaje)

Escogemos la GPU como método de entrenamiento en Google Colab y usamos los siguientes hiperparámetros:

Resultados del entrenamiento

Al dibujar las curvas de entrenamiento para los sets de entrenamiento y prueba, vemos que el modelo alcanza una exactitud cercana al 97% en ambos casos.

Esto nos permite verificar que la transferencia de aprendizaje funciona adecuadamente, y que hemos logrado aprovechar una arquitectura pre-entrenada (VGG-16), para resolver un problema de clasificación pero usando un set de datos totalmente diferente al usado originalmente.

Contenido exclusivo suscriptores

Recuerda suscribirte para acceder al set de datos, código fuente y video con la explicación detallada de esta lección. Además podrás disfrutar de todos los cursos de la Academia Online

Conclusión

Muy bien, acabamos de ver de forma aplicada el concepto de transferencia de aprendizaje para resolver un problema de clasificación.

En particular vimos como tomar la red VGG-16 (entrenada con ImageNet) y realizar ligeras modificaciones para lograr clasificar imágenes de flores.

En la próxima lección veremos otras dos arquitecturas que representaron avances significativos en tareas de clasificación en comparación con sus precursoras AlexNet y VGGNet. Así que hablaremos específicamente de GoogLeNet y ResNet.

Ver todas las lecciones de este curso