El transfer learning es una técnica valiosísima que nos permite aprovechar modelos ya entrenados por otros devs para usarlos en nuestros datasets.
A través de este módulo comprenderemos qué es el aprendizaje por transferencia, cómo cargar sistemas pre-entrenados, cómo consumirlos desde fuentes de terceros y cómo aplicarlos a nuestros proyectos.
¿Cómo funciona el aprendizaje por transferencia?
Para entender cómo funciona el transfer learning vamos a hacer una analogía: cuando eras niño aprendiste a manejar bicicleta, durante ese aprendizaje entendiste los conceptos de equilibrio, fuerza, velocidad y demás. En el futuro, cuando aprendas a manejar moto, podrás trasladar gran parte de los conceptos que ya aprendiste para obtener ventaja en este nuevo aprendizaje.
A nivel de máquina el transfer learning se hace a través de las features o características del modelo que entrenaste originalmente. Supón que tienes un detector de manzanas y ahora quieres detectar otras frutas (naranjas, piñas, etc).
No será necesario volver a entrenar un modelo desde el inicio dado que ya posees una configuración que detecta formas y colores, bastaría con hacer algunas iteraciones sobre este modelo principal con los nuevos datos y obtendrás un modelo igual de funcional.
En la red puedes encontrar decenas de configuraciones que han sido entrenadas por meses de la mano de grandes protagonistas de la investigación del deep learning.
El proceso de configuración será el de eliminar la capa final de la red que vamos a aprovechar (la capa de predicciones original) y la sustituiremos por nuestra propia configuración de salida.
Usando una red ya entrenada
Antes de usar un modelo pre-entrenado es fundamental entender su arquitectura.
La arquitectua MobileNet V2 fue diseñada para detección de objetos en dispositivos embebidos y móviles, su entrada es una imágen de 300x300 pixeles y a través de una serie de capas convolucionales con max pooling se adquieren todas las features a clasificar con un sistema de redes neuronales. Si quisieramos usarla, bastaría con eliminar la última capa y personalizarla a nuestra necesidad.
Para esta ocasión cargaremos el modelo Inception versión 3 (otra arquitectura altamente conocida de redes convolucionales). Importaremos nuestras dependencias de Keras y cargaremos la configuración desde la locación donde estén guardadas en disco, crearemos un modelo secuencial y lo inyectaremos desde la primer capa (nota que no se incluye la capa de salida).
Se añade nuestra nueva capa de salida y se configura al modelo como no entrenable.
from tensorflow.keras.layers import Dense
from tensorflow.keras.Model import Sequential
from tensorflow.keras.applications.inception_v3 import InceptionV3
## URL incepction modelweights_file ="/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5"new_model = Sequential()new_model.add(InceptionV3(include_top =False, weights = weights_file))new_model.add(Dense(num_classes, activation ="softmax"))new_model.layers[0].trainable =False
Con esto podemos aprovechar cientos de modelos ya entrenados por otros IA devs.
Después de algunas horas haciendo los ejercicios del curso en Colab, ya no me deja conectar con el con el backend de GPU.
Seún indican Colab puede brindar recursos gratuitos pero tiene límites de uso dinámicos que a veces fluctúan y a que no proporciona recursos garantizados o ilimitados. Colab no publica estos límites, en parte porque pueden (y de hecho, lo hacen) cambiar. Como resultado, los usuarios que utilizan Colab para ejecutar cálculos de larga duración o los que usaron más recursos últimamente tienen más probabilidades de encontrar límites de uso o de que se restrinja de manera temporal su acceso a las GPU y TPU.
Si, asi mismo es, te dan algo para que comiences y puedas hacer algunas cosas sencillas digamos, pero si ya quieres ir un poco màs, tienes que pagar.
Con el aprendizaje por transferencia, si tengo un modelo que ya selecciona las placas de un auto, por ejemplo. ¿Usando un modelo preentrenado con MNITS puedo identificar los caracteres de números de la placa?
Sin tener que entrenar, claro
Hola Raul, claro que si
Como mencionas no tendrias que entrenar el modelo, unicamente descargas el modelo y realizas inferencia.
Sin embargo si quieres utilizar un modelo de clasificación debes enviarle unicamente la letra o numero al algoritmo ya recortada de la imagen general, lo que acostumbro a hacer cuando tengo un reto que es crear un algoritmo para detectar placas de carro es utilizar un modelo de object detection, este modelo te permitira primero localizar en que parte de la imagen se encuentra la placa y luego si aplicar una clasificación puede ser con MNIST o incluso con una OCR que tambien hay mucho trabajo.
TensorFlow tiene una OCR muy muy interesante -> OCR
Gracias Adonai, si, me quedó claro la explicación.
Dejo por acá que el OCR tiene sus retos ya que además del número hay otros textos que habría que filtrar. Además la iluminación de las placas puede ser otro reto.
El aprendizaje por transferencia ofrece varias ventajas:
Acelera el entrenamiento: Al aprovechar el conocimiento adquirido en la tarea fuente, el modelo para la tarea objetivo puede aprender más rápido y con menos datos. Esto es especialmente útil para tareas donde la recopilación de datos es costosa o difícil.
Mejora el rendimiento: En muchos casos, el aprendizaje por transferencia puede conducir a un mejor rendimiento en la tarea objetivo, incluso si el modelo pre-entrenado no fue diseñado específicamente para esa tarea. Esto se debe a que el modelo pre-entrenado ha aprendido representaciones generales del mundo que pueden ser útiles para una amplia gama de tareas.
Reduce la necesidad de datos: El aprendizaje por transferencia puede ser particularmente beneficioso cuando se dispone de conjuntos de datos pequeños para la tarea objetivo. Al utilizar un modelo pre-entrenado, el modelo objetivo puede aprender a partir de menos datos de los que necesitaría si se entrenara desde cero.
Tipos de aprendizaje por transferencia:
Aprendizaje por transferencia fina (fine-tuning): En este enfoque, se ajusta el modelo pre-entrenado en la tarea objetivo. Esto implica modificar las capas superiores del modelo para que se adapten a los datos específicos de la tarea objetivo.
Extracción de características (feature extraction): En este enfoque, se utilizan las capas iniciales del modelo pre-entrenado como extractor de características. Las características extraídas se utilizan luego para entrenar un nuevo modelo lineal o de otro tipo en la tarea objetivo.
Ejemplos
Visión artificial: Se puede utilizar para entrenar modelos de reconocimiento de objetos, clasificación de imágenes y segmentación de imágenes.
Procesamiento del lenguaje natural: Se puede utilizar para entrenar modelos de traducción automática, análisis de sentimientos y resumen de texto.
Robótica: Se puede utilizar para entrenar robots para realizar tareas como la navegación, la manipulación de objetos y el reconocimiento de voz.
Hugging face es otro foro de modelos más reciente, que aquí en platzi también hay un curso para hacer transfer learning con el
https://huggingface.co/