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 del curso “Keras en TPU” . Puedes hacerlo 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
- Convnets modernos, squeezenet, Xception, con Keras y TPU
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 notas que falta algo en este codelab, comunícate con nosotros. Se pueden proporcionar comentarios a través de los problemas de GitHub [feedback link].
2. Guía de inicio rápido de Google Colaboratory
Este lab 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 entrenamiento gratuito sobre CPU, GPU y TPU.
Puedes abrir este notebook de muestra y ejecutarlo en algunas celdas para familiarizarte con Colaboratory.
Selecciona un backend de TPU
En el menú de Colab, selecciona Entorno de ejecución > Cambia el tipo de entorno de ejecución y, luego, selecciona TPU. En este codelab, usarás una potente TPU (unidad de procesamiento tensorial) respaldada para el entrenamiento acelerado por 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” en la esquina superior derecha.
Ejecución del notebook
Para ejecutar las celdas una a la vez, haz clic en una celda y usa Mayúsculas + Intro. También puedes ejecutar todo el notebook con Entorno de ejecución > Ejecutar todo
Índice
Todos los notebooks tienen un índice. Puedes abrirlo con la flecha negra que está a la izquierda.
Celdas ocultas
Algunas celdas solo mostrarán el 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 contiene, pero, por lo general, no es muy interesante. Por lo general, las funciones de asistencia o 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 y cuando te autentiques con una cuenta autorizada. El fragmento de código anterior activará un proceso de autenticación.
3. [INFO] Conceptos básicos del clasificador de redes neuronales
En pocas palabras
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 secuencial. 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". organizados en capas. La primera capa procesa datos de entrada y envía sus salidas a otras capas. Se denomina “denso” ya que cada neurona está conectada a todas las neuronas de la capa anterior.
Puedes incorporar una imagen a esta red compactando los valores RGB de todos sus píxeles en un vector largo y usándolo como entradas. 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 y agrega un valor llamado "sesgo" y envía 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”. entrenando 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 de 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 esto, usaremos una función de activación denominada “softmax”.
La aplicación de softmax a un vector se realiza tomando la exponencial de cada elemento y luego normalizando el vector, generalmente con el uso de la norma L1 (suma de valores absolutos) para que los valores sumen 1 y puedan interpretarse 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, a menudo llamadas “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 el más efectivo. A esto lo llamaremos error o “pérdida”. función:
Descenso de gradientes
“Capacitación” La red neuronal en realidad significa usar imágenes y etiquetas de entrenamiento para ajustar los pesos y los sesgos con el fin de minimizar 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 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 y etiquetas de entrenamiento, en un bucle de entrenamiento. Se espera que esto converja 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 da como resultado un gradiente que representa mejor las restricciones impuestas por las 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 de gradientes estocástico" tiene otra ventaja más pragmática: trabajar con lotes también significa trabajar con matrices más grandes y, por lo general, estas son más fáciles de optimizar en GPU y TPU.
Sin embargo, la convergencia puede ser un poco caótica y hasta puede detenerse si el vector de gradiente es solo ceros. ¿Eso 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. En un vector 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: una silla de montar. 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 de entrenamiento y etiquetas. Eso ayuda a que el algoritmo converja. El "lote" suele ser la primera de los tensores de datos. Por ejemplo, un tensor de 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 en 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”.
labels: otro nombre para las "clases" o respuestas correctas en un problema de clasificación supervisado
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 denominan “logits”. El término proviene de la "función logística" también conocida como la "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. Es 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 el ú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.
Actividad práctica
Abre el siguiente notebook, ejecuta las celdas (Mayúsculas-Intro) y sigue las instrucciones cuando veas un “TRABAJO OBLIGATORIO”. etiqueta.
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: Uso de 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, el problema es 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.*
. MobileNet V2, por ejemplo, es una buena arquitectura convolucional que se mantiene razonable en tamaño. Cuando seleccionas include_top=False
, obtienes el modelo previamente entrenado sin su capa final de softmax, de modo que puedas agregar el tuyo:
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')
])
Observa también la configuración de pretrained_model.trainable = False
. Se inmovilizan las ponderaciones y los sesgos del modelo previamente entrenado para que solo entrenes tu capa de 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
. 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 es necesario 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
- 🤔 Entrenamiento de tu primer modelo
- 🧐 Seguir su pérdida y exactitud 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 aprendizaje profundo
- 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. Se pueden proporcionar comentarios a través de los problemas de GitHub [feedback link].
|