1. Descripción general
En este lab, aprenderás a compilar un clasificador de Keras. En lugar de tratar de descubrir la combinación perfecta de capas de red neuronal para reconocer flores, primero usaremos una técnica llamada aprendizaje por transferencia para adaptar un potente modelo previamente entrenado a nuestro conjunto de datos.
En este lab, se incluyen las explicaciones teóricas necesarias sobre las redes neuronales y se trata de un buen punto de partida para los desarrolladores que están aprendiendo sobre el aprendizaje profundo.
Este lab es la parte 2 de la serie “Keras en TPU”. Puedes hacerlos en el siguiente orden o de forma independiente.
- Canalizaciones de datos con velocidades de TPU: tf.data.Dataset y TFRecords
- [ESTE LAB] Tu primer modelo de Keras, con aprendizaje por transferencia
- Redes neuronales convolucionales, con Keras y TPU
- Modernos convnets, squeezenet, Xception, con Keras y TPUs
Qué aprenderás
- Para compilar tu propio clasificador de imágenes de Keras con una capa de softmax y la pérdida de la entropía cruzada, sigue estos pasos:
- Para hacer trampa {8/}, usa el aprendizaje por transferencia en lugar de crear tus propios modelos.
Comentarios
Si ves algo fuera de lugar en este codelab, avísanos. Se pueden proporcionar comentarios a través de los problemas de GitHub [feedback link].
2. Guía de inicio rápido de Google Colaboratory
En este lab, se usa Google Colaboratory y no requiere configuración de tu parte. Colaboratory es una plataforma de bloc de notas en línea con fines educativos. Ofrece capacitación gratuita en CPU, GPU y TPU.
Puedes abrir este notebook de muestra y ejecutar algunas celdas para familiarizarte con Colaboratory.
Selecciona un backend de TPU
En el menú de Colab, selecciona Entorno de ejecución > Cambiar tipo de entorno de ejecución y, luego, selecciona TPU. En este lab de código, usarás una TPU (unidad de procesamiento tensorial) potente con compatibilidad para el entrenamiento con aceleración de hardware. La conexión al entorno de ejecución se realizará automáticamente en la primera ejecución, o bien puedes usar el botón “Conectar” de la esquina superior derecha.
Ejecución del notebook
Para ejecutar las celdas de a una por vez, haz clic en una celda y usa Mayúsculas + Intro. También puedes ejecutar todo el notebook en Entorno de ejecución > Ejecutar todo.
Índice
Todos los notebooks tienen un índice. Puedes abrirlo con la flecha negra de la izquierda.
Celdas ocultas
Algunas celdas solo mostrarán su título. Esta es una función de notebook específica de Colab. Puedes hacer doble clic en ellos para ver el código que contienen, pero, por lo general, no es muy interesante. Por lo general, admiten funciones de visualización. Aún debes ejecutar estas celdas para que se definan las funciones que contiene.
Autenticación
Colab puede acceder a tus buckets privados de Google Cloud Storage, siempre que te autentiques con una cuenta autorizada. El fragmento de código anterior activará un proceso de autenticación.
3. [INFO] Nociones básicas del clasificador de redes neuronales
En resumen
Si ya conoces todos los términos en negrita del siguiente párrafo, puedes pasar al siguiente ejercicio. Si recién estás comenzando en el aprendizaje profundo, entonces bienvenido y sigue leyendo.
Para los modelos creados como una secuencia de capas, Keras ofrece la API de Sequential. Por ejemplo, un clasificador de imágenes que usa tres capas densas se puede escribir en Keras de la siguiente manera:
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=[192, 192, 3]),
tf.keras.layers.Dense(500, activation="relu"),
tf.keras.layers.Dense(50, activation="relu"),
tf.keras.layers.Dense(5, activation='softmax') # classifying into 5 classes
])
# this configures the training of the model. Keras calls it "compiling" the model.
model.compile(
optimizer='adam',
loss= 'categorical_crossentropy',
metrics=['accuracy']) # % of correct answers
# train the model
model.fit(dataset, ... )
Red neuronal densa
Esta es la red neuronal más simple para clasificar imágenes. Está formada por "neuronas" dispuestas en capas. La primera capa procesa datos de entrada y envía sus salidas a otras capas. Se llama “densa” porque cada neurona está conectada a todas las neuronas de la capa anterior.
Para ingresar una imagen en una red de este tipo, aplana los valores RGB de todos sus píxeles en un vector largo y úsalo como entrada. No es la mejor técnica para el reconocimiento de imágenes, pero la mejoraremos más adelante.
Neuronas, activaciones y RELU
Una "neurona" calcula una suma ponderada de todas sus entradas, agrega un valor llamado "sesgo" y alimenta el resultado a través de la llamada "función de activación". Al principio, se desconocen los pesos y el sesgo. Se inicializarán al azar y se “aprenderán” a través del entrenamiento de la red neuronal con muchos datos conocidos.
La función de activación más popular se denomina RELU para la unidad lineal rectificada. Es una función muy simple, como puedes ver en el gráfico anterior.
Activación softmax
La red anterior termina con una capa de 5 neuronas porque estamos clasificando las flores en 5 categorías (rosa, tulipán, diente de león, margarita, girasol). Las neuronas en capas intermedias se activan con la función de activación RELU clásica. Sin embargo, en la última capa, queremos calcular números entre 0 y 1 que representen la probabilidad de que esta flor sea una rosa, un tulipán, etcétera. Para ello, usaremos una función de activación llamada "softmax".
Para aplicar softmax a un vector, se toma el exponencial de cada elemento y, luego, se normaliza el vector, por lo general, con la norma L1 (suma de valores absolutos) para que los valores sumen 1 y se puedan interpretar como probabilidades.
Pérdida de la entropía cruzada
Ahora que nuestra red neuronal produce predicciones a partir de imágenes de entrada, debemos medir qué tan buenas son, es decir, la distancia entre lo que nos dice la red y las respuestas correctas, que a menudo se denominan "etiquetas". Recuerda que tenemos etiquetas correctas para todas las imágenes del conjunto de datos.
Cualquier distancia funcionaría, pero para los problemas de clasificación, la llamada "distancia de entropía cruzada" es la más eficaz. A esto lo llamaremos función de error o “pérdida”:
Descenso de gradientes
“Entrenar” la red neuronal en realidad significa usar imágenes de entrenamiento y etiquetas para ajustar los pesos y sesgos, de modo que se minimice la función de pérdida de la entropía cruzada. Funciona de la siguiente manera.
La entropía cruzada es una función de pesos, sesgos, píxeles de la imagen de entrenamiento y su clase conocida.
Si calculamos las derivadas parciales de la entropía cruzada con respecto a todos los pesos y todos los sesgos, obtenemos un “gradiente”, calculado para una determinada imagen, etiqueta y valor actual de pesos y sesgos. Recuerda que podemos tener millones de pesos y sesgos, por lo que calcular el gradiente suena como mucho trabajo. Por suerte, TensorFlow lo hace por nosotros. La propiedad matemática de un gradiente es que apunta hacia arriba. Como queremos ir a donde la entropía cruzada es baja, vamos en la dirección opuesta. Actualizamos los pesos y los sesgos por una fracción del gradiente. Luego hacemos lo mismo una y otra vez con los siguientes lotes de imágenes de entrenamiento y etiquetas, en un bucle de entrenamiento. Con suerte, esto convergerá en un lugar donde la entropía cruzada sea mínima, aunque nada garantiza que este mínimo sea único.
Impulso y minilotes
Puedes calcular tu gradiente en una sola imagen de ejemplo y actualizar los pesos y sesgos de inmediato, pero hacerlo en un lote de, por ejemplo, 128 imágenes, proporciona un gradiente que representa mejor las restricciones que imponen diferentes imágenes de ejemplo y, por lo tanto, es probable que converja hacia la solución más rápido. El tamaño del minilote es un parámetro ajustable.
Esta técnica, a veces llamada "descenso estocástico del gradiente", tiene otro beneficio más pragmático: trabajar con lotes también significa trabajar con matrices más grandes, que suelen ser más fáciles de optimizar en GPUs y TPU.
Sin embargo, la convergencia puede ser un poco caótica y puede detenerse si el vector de gradiente es todo ceros. ¿Significa que encontramos un mínimo? No en todos los casos. Un componente de gradiente puede ser cero en un mínimo o máximo. Con un vector de gradiente con millones de elementos, si todos son ceros, la probabilidad de que cada cero corresponda a un mínimo y ninguno de ellos a un punto máximo es bastante pequeña. En un espacio de muchas dimensiones, los puntos de montaje son bastante comunes y no queremos detenernos en ellos.
Ilustración: un punto silla. El gradiente es 0, pero no es un mínimo en todas las direcciones. (Atribución de imagen Wikimedia: de Nicoguaro - trabajo propio, CC BY 3.0)
La solución es agregar algo de impulso al algoritmo de optimización para que pueda navegar más allá de la silla de montar sin detenerse.
Glosario
lote o minilote: El entrenamiento siempre se realiza en lotes de datos y etiquetas de entrenamiento. Eso ayuda a que el algoritmo converja. La dimensión “lote” suele ser la primera de los tensores de datos. Por ejemplo, un tensor de la forma [100, 192, 192, 3] contiene 100 imágenes de 192 x 192 píxeles con tres valores por píxel (RGB).
Pérdida de entropía cruzada: Es una función de pérdida especial que se usa con frecuencia en los clasificadores.
Capa densa: Es una capa de neuronas en la que cada neurona está conectada a todas las neuronas de la capa anterior.
atributos: A veces, las entradas de una red neuronal se denominan "atributos". El arte de descubrir qué partes de un conjunto de datos (o combinaciones de partes) alimentar a una red neuronal para obtener buenas predicciones se denomina “ingeniería de atributos”.
Etiquetas: Otro nombre para las "clases" o respuestas correctas en un problema de clasificación supervisada.
tasa de aprendizaje: fracción del gradiente por la cual se actualizan los pesos y los sesgos en cada iteración del ciclo de entrenamiento
logits: las salidas de una capa de neuronas antes de que se aplique la función de activación se llaman “logits”. El término proviene de la "función logística", también conocida como "función sigmoidea", que solía ser la función de activación más popular. “Resultados de neuronas antes de la función logística” se acortó a “logits”.
pérdida: la función de error que compara los resultados de la red neuronal con las respuestas correctas
neuron: Calcula la suma ponderada de sus entradas, agrega un sesgo y alimenta el resultado a través de una función de activación.
Codificación one-hot: La clase 3 de 5 se codifica como un vector de 5 elementos, todos ceros, excepto el tercero, que es 1.
relu: unidad lineal rectificada. Una función de activación popular para las neuronas.
sigmoidea: Es otra función de activación que solía ser popular y que sigue siendo útil en casos especiales.
softmax: Es una función de activación especial que actúa sobre un vector, aumenta la diferencia entre el componente más grande y todos los demás, y también normaliza el vector para tener una suma de 1 de modo que pueda interpretarse como un vector de probabilidades. Se usa como último paso en los clasificadores.
tensor: Un “tensor” es como una matriz, pero con un número arbitrario de dimensiones. Un tensor unidimensional es un vector. Un tensor de 2 dimensiones es una matriz. Y, luego, puedes tener tensores con 3, 4, 5 o más dimensiones.
4. Aprendizaje por transferencia
Para un problema de clasificación de imágenes, las capas densas probablemente no sean suficientes. Tenemos que aprender sobre las capas convolucionales y las muchas formas de organizarlas.
Pero también podemos usar un atajo. Hay redes neuronales convolucionales completamente entrenadas disponibles para descargar. Puedes cortar su última capa, el cabezal de clasificación softmax, y reemplazarlo por el tuyo. Todos los sesgos y pesos entrenados se mantienen como están, solo se vuelve a entrenar la capa de softmax que agregas. Esta técnica se llama aprendizaje por transferencia y, sorprendentemente, funciona siempre que el conjunto de datos en el que se entrena previamente la red neuronal esté "lo suficientemente cerca" al tuyo.
Prácticas
Abre el siguiente notebook, ejecuta las celdas (Mayúsculas + Intro) y sigue las instrucciones donde veas la etiqueta “TRABAJO NECESARIO”.
Keras Flowers transfer learning (playground).ipynb
Información adicional
Con el aprendizaje por transferencia, se benefician tanto de arquitecturas avanzadas de redes neuronales convolucionales desarrolladas por investigadores destacados como del entrenamiento previo con un enorme conjunto de datos de imágenes. En este caso, usaremos el aprendizaje por transferencia desde una red entrenada en ImageNet, una base de datos de imágenes que contiene muchas plantas y escenas al aire libre, que se encuentra lo suficientemente cerca de las flores.
Ilustración: Usando una red neuronal convolucional compleja, ya entrenada, como una caja negra, reentrenando solo el encabezado de clasificación. Esto es aprendizaje por transferencia. Más adelante, veremos cómo funcionan estos arreglos complicados de capas convolucionales. Por ahora, es el problema de otra persona.
Aprendizaje por transferencia en Keras
En Keras, puedes crear una instancia de un modelo previamente entrenado de la colección tf.keras.applications.*
. Por ejemplo, MobileNet V2 es una arquitectura de convoluciones muy buena que mantiene un tamaño razonable. Si seleccionas include_top=False
, obtienes el modelo previamente entrenado sin su capa softmax final para que puedas agregar la tuya:
pretrained_model = tf.keras.applications.MobileNetV2(input_shape=[*IMAGE_SIZE, 3], include_top=False)
pretrained_model.trainable = False
model = tf.keras.Sequential([
pretrained_model,
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(5, activation='softmax')
])
También observa la configuración pretrained_model.trainable = False
. Congelan las ponderaciones y los sesgos del modelo previamente entrenado para que solo entrenes tu capa softmax. Esto suele implicar relativamente pocas ponderaciones y se puede hacer rápidamente y sin la necesidad de un conjunto de datos muy grande. Sin embargo, si tienes muchos datos, el aprendizaje por transferencia puede funcionar aún mejor con pretrained_model.trainable = True
. Luego, los pesos previamente entrenados proporcionan excelentes valores iniciales y el entrenamiento puede ajustarlos para que se adapten mejor a tu problema.
Por último, observa la capa Flatten()
insertada antes de la capa de softmax densa. Las capas densas funcionan en vectores planos de datos, pero no se sabe si eso es lo que devuelve el modelo previamente entrenado. Por eso, debemos aplanar. En el siguiente capítulo, a medida que profundizamos en las arquitecturas convolucionales, explicaremos el formato de datos que devuelven las capas convolucionales.
Con este enfoque, la exactitud debería ser de casi un 75%.
Solución
Este es el notebook de la solución. Puedes usarla si no puedes avanzar.
Keras Flowers transfer learning (solution).ipynb
Temas abordados
- 🤔 Cómo escribir un clasificador en Keras
- 🤓 configurados con una última capa de softmax y la pérdida de la entropía cruzada
- Ж Aprendizaje por transferencia
- 🤔 Entrena tu primer modelo
- 🧐 Seguir su pérdida y precisión durante el entrenamiento
Tómate un momento para revisar esta lista de verificación en tu cabeza.
5. ¡Felicitaciones!
Ahora puedes compilar un modelo de Keras. Continúa con el siguiente lab para aprender a ensamblar capas convolucionales.
- Canalizaciones de datos con velocidades de TPU: tf.data.Dataset y TFRecords
- [ESTE LAB] Tu primer modelo de Keras, con aprendizaje por transferencia
- Redes neuronales convolucionales, con Keras y TPU
- Convnets modernos, squeezenet, Xception, con Keras y TPU
TPU en la práctica
Las TPU y las GPU están disponibles en AI Platform de Cloud:
- En VMs de Deep Learning
- En AI Platform Notebooks
- En trabajos de AI Platform Training
Por último, nos encanta recibir comentarios. Infórmanos si notas algún error en este lab o si crees que deberíamos mejorar. Los comentarios se pueden enviar a través de los problemas de GitHub [ vínculo de comentarios].
|