Autoencoder de TensorFlow: Ejemplo de aprendizaje profundo

¿Qué es un Autoencoder?

Un autocodificador es una gran herramienta para recrear una entrada. En una palabra simple, la máquina toma, digamos una imagen, y puede producir una imagen estrechamente relacionada. La entrada en este tipo de red neuronal no está etiquetada, lo que significa que la red es capaz de aprender sin supervisión. Más precisamente, la entrada es codificada por la red para centrarse solo en la característica más crítica. Esta es una de las razones por las que el autoencoder es popular para la reducción de dimensionalidad. Además, los autocodificadores se pueden usar para producir modelos de aprendizaje generativo. Por ejemplo, la red neuronal se puede entrenar con un conjunto de caras y luego puede producir caras nuevas.

En este tutorial, aprenderá:

¿Cómo funciona Autoencoder?

El propósito de un autocodificador es producir una aproximación de la entrada centrándose solo en las características esenciales. Puede pensar por qué no simplemente aprender a copiar y pegar la entrada para producir la salida. De hecho, un autocodificador es un conjunto de restricciones que obligan a la red a aprender nuevas formas de representar los datos, diferentes de simplemente copiar la salida.

Un autocodificador típico se define con una entrada, una representación interna y una salida (una aproximación de la entrada). El aprendizaje se produce en las capas enlazadas a la representación interna. De hecho, hay dos bloques principales de capas que se parecen a una red neuronal tradicional. La ligera diferencia es que la capa que contiene la salida debe ser igual a la entrada. En la imagen de abajo, la entrada original entra en el primer bloque llamado el codificador. Esta representación interna comprime (reduce) el tamaño de la entrada. En el segundo bloque se produce la reconstrucción de la entrada. Esta es la fase de decodificación.

El modelo actualizará los pesos minimizando la función de pérdida. El modelo se penaliza si la salida de reconstrucción es diferente de la entrada.

Concretamente, imagine una imagen con un tamaño de 50×50 (es decir, 250 píxeles) y una red neuronal con una sola capa oculta compuesta de cien neuronas. El aprendizaje se realiza en un mapa de entidades que es dos veces más pequeño que la entrada. Significa que la red necesita encontrar una manera de reconstruir 250 píxeles con solo un vector de neuronas igual a 100.

Ejemplo de Autocodificador apilado

En este tutorial, aprenderá a usar un autocodificador apilado. La arquitectura es similar a una red neuronal tradicional. La entrada va a una capa oculta para comprimirse o reducir su tamaño, y luego llega a las capas de reconstrucción. El objetivo es producir una imagen de salida tan cercana como la original. El modelo tiene que aprender una manera de lograr su tarea bajo un conjunto de restricciones, es decir, con una dimensión inferior.

Hoy en día, los autocodificadores se utilizan principalmente para retocar una imagen. Imagina una imagen con rasguños; un humano aún es capaz de reconocer el contenido. La idea de descodificar el autocodificador es agregar ruido a la imagen para forzar a la red a aprender el patrón detrás de los datos.

La otra familia útil de autoencoder es el autoencoder variacional. Este tipo de red puede generar nuevas imágenes. Imagina que entrenas una red con la imagen de un hombre; tal red puede producir nuevas caras.

Cree un autoencoder con TensorFlow

En este tutorial, aprenderá a construir un autocodificador apilado para reconstruir una imagen.

Utilizará el conjunto de datos CIFAR-10 que contiene 60000 imágenes en color 32×32. El conjunto de datos ya está dividido entre 50000 imágenes para entrenamiento y 10000 para pruebas. Hay hasta diez clases:

  • Avión
  • Automóvil
  • Pájaro
  • Gato
  • Ciervo
  • Perro
  • Rana
  • Caballo
  • Enviar
  • Camión

Necesitas descargar las imágenes en esta URL https://www.cs.toronto.edu/~kriz/cifar.html y descomprimirla. La carpeta for-10-batches-py contiene cinco lotes de datos con 10000 imágenes cada uno en un orden aleatorio.

Antes de construir y entrenar su modelo, debe aplicar algún procesamiento de datos. Procederás de la siguiente manera:

  1. Importar los datos
  2. Convertir los datos a formato blanco y negro
  3. Anexar todos los lotes
  4. Construir el conjunto de datos de capacitación
  5. Construir un visualizador de imágenes

Preprocesamiento de imágenes

Paso 1) Importe los datos.

Según el sitio web oficial, puede cargar los datos con el siguiente código. El código cargará los datos en un diccionario con los datos y la etiqueta. Tenga en cuenta que el código es una función.

Paso 2) Convertir los datos a formato blanco y negro

Para simplificar, convertirá los datos en una escala de grises. Es decir, con una sola dimensión contra tres para la imagen de colores. La mayor parte de la red neuronal solo funciona con una entrada de dimensión.

Paso 3) Anexar todos los lotes

Ahora que se crean ambas funciones y se carga el conjunto de datos, puede escribir un bucle para anexar los datos en la memoria. Si comprueba cuidadosamente, el archivo de descomprimir con los datos se denomina data_batch_ con un número del 1 al 5. Puede recorrer los archivos y anexarlos a los datos.

Una vez finalizado este paso, convertirá los datos de colores a un formato de escala de grises. Como puede ver, la forma de los datos es 50000 y 1024. Los 32*32 píxeles ahora se aplanan hasta 2014.

Nota: Cambiar ‘. /cifar-10-batches-py/data_batch_ ‘a la ubicación real de su archivo. Por ejemplo, para la máquina Windows, la ruta podría ser filename = ‘e:CIFar-10-batches-pydata_batch_’ + str (i)

Paso 4) Construir el conjunto de datos de capacitación

Para que el entrenamiento sea más rápido y fácil, entrenará a un modelo solo en las imágenes del caballo. Los caballos son la séptima clase en los datos de etiqueta. Como se menciona en la documentación del conjunto de datos CIFAR-10, cada clase contiene 5000 imágenes. Puede imprimir la forma de los datos para confirmar que hay 5.000 imágenes con 1024 columnas.

Paso 5) Construir un visualizador de imágenes

Finalmente, se construye una función para trazar las imágenes. Necesitará esta función para imprimir la imagen reconstruida desde el autocodificador.

Una forma fácil de imprimir imágenes es usar el objeto imshow de la biblioteca matplotlib. Tenga en cuenta que, necesita convertir la forma de los datos de 1024 a 32*32 (es decir, el formato de una imagen).

La función toma 3 argumentos:

  • Imagen: la entrada
  • Forma: lista, la dimensión de la imagen
  • CMAP:Seleccione el mapa de color. Por defecto, gris

Puede intentar trazar la primera imagen en el dataset. Deberías ver a un hombre a caballo.

 

Establecer estimador de dataset

Muy bien, ahora que el conjunto de datos está listo para usar, puede comenzar a usar Tensorflow. Antes de construir el modelo, vamos a utilizar el estimador Dataset de Tensorflow para alimentar la red.

Construirá un conjunto de datos con el estimador TensorFlow. Para refrescar su mente, debe usar:

  • from_tensor_slices
  • Repito
  • lote

El código completo para construir el conjunto de datos es:

Tenga en cuenta que x es un marcador de posición con la siguiente forma:

  • [None, n_inputs]: Establecer en Ninguno porque el número de imágenes de la red es igual al tamaño del lote.

para más detalles, consulte el tutorial sobre regresión lineal..

Después de eso, debe crear el iterador. Sin esta línea de código, ningún dato pasará a través de la canalización.

Ahora que la tubería está lista, puede verificar si la primera imagen es la misma que antes (es decir, un hombre a caballo).

Establezca el tamaño del lote en 1 porque solo desea alimentar el dataset con una imagen. Puede ver la dimensión de los datos con print (sess.run (features) .shape). Es igual a (1, 1024). 1 significa que sólo una imagen con 1024 se alimenta cada uno. Si el tamaño del lote se establece en dos, dos imágenes pasarán por la canalización. (No cambie el tamaño del lote. De lo contrario, lanzará un error. Sólo una imagen a la vez puede ir a la función plot_image ().

 

Construir la red

Es hora de construir la red. Entrenará un autocodificador apilado, es decir, una red con múltiples capas ocultas.

Su red tendrá una capa de entrada con 1024 puntos, es decir, 32×32, la forma de la imagen.

El bloque del codificador tendrá una capa oculta superior con 300 neuronas, una capa central con 150 neuronas. El bloque del decodificador es simétrico al codificador. Puede visualizar la red en la imagen de abajo. Tenga en cuenta que puede cambiar los valores de las capas ocultas y centrales.

Construir un autocodificador es muy similar a cualquier otro modelo de aprendizaje profundo.

Construirá el modelo siguiendo estos pasos:

  1. Definir los parámetros
  2. Definir las capas
  3. Definir la arquitectura
  4. Definir la optimización
  5. Ejecutar el modelo
  6. Evaluar el modelo

En la sección anterior, aprendió a crear una canalización para alimentar el modelo, por lo que no es necesario crear una vez más el dataset. Construirá un autocodificador con cuatro capas. Usen la inicialización de Xavier. Esta es una técnica para establecer los pesos iniciales iguales a la varianza tanto de la entrada como de la salida. Por último, se utiliza la función de activación elu. Usted regulariza la función de pérdida con el regularizador L2.

Paso 1) Definir los parámetros

El primer paso implica definir el número de neuronas en cada capa, la tasa de aprendizaje y el hiperparámetro del regularizador.

Antes de eso, se importa la función parcialmente. Es un mejor método para definir los parámetros de las capas densas. El siguiente código define los valores de la arquitectura de autoencoder. Como se mencionó anteriormente, el autocodificador tiene dos capas, con 300 neuronas en las primeras capas y 150 en las segundas capas. Sus valores se almacenan en n_hidden_1 y n_hidden_2.

Es necesario definir la tasa de aprendizaje y el hiperparámetro L2. Los valores se almacenan en learning_rate y l2_reg

La técnica de inicialización de Xavier se llama con el objeto xavier_initializer del contrib estimator. En el mismo estimador, puede agregar el regularizador con l2_regularizer

Paso 2) Definir las capas

Se han establecido todos los parámetros de las capas densas; puede empaquetar todo en la variable dense_layer utilizando el objeto partial. dense_layer que utiliza la activación ELU, inicialización Xavier y regularización L2.

Paso 3) Definir la arquitectura

Si observa la imagen de la arquitectura, observa que la red apila tres capas con una capa de salida. En el siguiente código, conecta las capas apropiadas. Por ejemplo, la primera capa calcula el producto de puntos entre las entidades matrice de entradas y las matrices que contienen los 300 pesos. Después de calcular el producto punto, la salida va a la función de activación Elu. La salida se convierte en la entrada de la siguiente capa, por lo que la utiliza para calcular hidden_2, etc. La multiplicación de matrices es la misma para cada capa porque se utiliza la misma función de activación. Tenga en cuenta que la última capa, salidas, no aplica una función de activación. Tiene sentido porque esta es la entrada reconstruida

Paso 4) Definir la optimización

El último paso es construir el optimizador. Se utiliza el error cuadrado medio como función de pérdida. Si recuerda el tutorial sobre regresión lineal, sabe que el MSE se calcula con la diferencia entre la salida prevista y la etiqueta real. Aquí, la etiqueta es la entidad porque el modelo intenta reconstruir la entrada. Por lo tanto, desea la media de la suma de la diferencia del cuadrado entre la salida prevista y la entrada. Con TensorFlow, puede codificar la función de pérdida de la siguiente manera:

Luego, debe optimizar la función de pérdida. Utiliza Adam optimizador para calcular los gradientes. La función objetivo es minimizar la pérdida.

Un ajuste más antes de entrenar el modelo. Desea utilizar un tamaño de lote de 150, es decir, alimentar la canalización con 150 imágenes cada iteración. Necesita calcular el número de iteraciones manualmente. Esto es trivial de hacer:

Si desea pasar 150 imágenes cada vez y sabe que hay 5000 imágenes en el dataset, el número de iteraciones es igual a. En python puede ejecutar los siguientes códigos y asegurarse de que la salida sea 33:

Paso 5) Ejecute el modelo

Por último, pero no menos importante, entrenar al modelo. Estás entrenando al modelo con 100 épocas. Es decir, el modelo verá 100 veces las imágenes a pesos optimizados.

Ya está familiarizado con los códigos para entrenar a un modelo en Tensorflow. La ligera diferencia es canalizar los datos antes de ejecutar el entrenamiento. De esta manera, el modelo entrena más rápido.

Usted está interesado en imprimir la pérdida después de diez épocas para ver si el modelo está aprendiendo algo (es decir, la pérdida está disminuyendo). La formación dura de 2 a 5 minutos, dependiendo del hardware de la máquina.

Paso 6) Evaluar el modelo

Ahora que tiene su modelo entrenado, es hora de evaluarlo. Debe importar el sert de prueba desde el archivo /cifar-10-batches-py/.

NOTA: Para una máquina Windows, el código se convierte en test_data = unpickle (R”:CIFar-10-batches-pytest_batch»)

Usted puede tratar de imprimir las imágenes 13, que es un caballo

Para evaluar el modelo, utilizará el valor de píxel de esta imagen y verá si el codificador puede reconstruir la misma imagen después de reducir 1024 píxeles. Tenga en cuenta que, define una función para evaluar el modelo en diferentes imágenes. El modelo debería funcionar mejor solo en caballos.

La función toma dos argumentos:

  • df: Importar los datos de prueba
  • image_number: indicar qué imagen importar

La función se divide en tres partes:

1. Cambiar la forma de la imagen a la dimensión correcta, es decir, 1, 1024
2. Alimenta el modelo con la imagen invisible, codifica/descodifica la imagen
3. Imprime la imagen real y reconstruida

Ahora que la función de evaluación está definida, puede echar un vistazo a la imagen reconstruida número trece

 

Resumen

El propósito principal de un autocodificador es comprimir los datos de entrada y luego descomprimirlos en una salida que se parece a los datos originales.

Arquitectura de un autoencoder simétrico con una capa de pivote denominada capa central.

Puede crear el autoencoder usando:

  • Parcial: para crear las capas densas con la configuración típica:
  • dense_layer (): para hacer la multiplicación de la matriz

puede definir la función de pérdida y optimización con:


Última ejecución de una sesión para entrenar el modelo.
0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *