Análisis de componentes independientes en Tensorflow

Podemos capturar cambios locales utilizando el análisis de componentes, sin embargo, los datos de imágenes que encontramos en la vida real tienen un amplio espacio dimensional. Quería ver si podemos realizar análisis de componentes independientes con una combinación de deep learning.

Tenga en cuenta que esta publicación es solo por diversión y autoaprendizaje.

Análisis de componentes independientes de datos faciales o MRI

Como se vio anteriormente, cuando realizamos Análisis de componentes independientes en la imagen de rostros o Brain MRI, podemos notar que podemos capturar (claramente) los cambios locales.

Sin embargo, ¿funcionaría esto en las imágenes de la vida real?

Lo que quiero decir con esto es que podríamos capturar la estructura general de un objeto a partir del conjunto de imágenes que contiene muchas variaciones.

Como se vio anteriormente, puede haber mucha diferencia de cómo se ve una imagen para un objeto dado. (con escalas o varianza). Pero si pensamos en ello, la imagen de las caras y la resonancia magnética cerebral ya están centradas y no contienen muchas variaciones. ¿Qué tal un subconjunto de imágenes de aves del dataset de STL?

Como se ve arriba, todas ellas contienen imágenes de aves, pero algunas están volando y otras están sentadas. Hay variaciones en escala, rotación, ángulo, etc. …

Enfoque directo de PCA, KPCA e ICA (Análisis de componentes independientes)

Permite usar el enfoque API de alto nivel para realizar algunas técnicas de reducción de dimensionalidad en 500 imágenes de aves del conjunto de datos STL. (Voy a usar Sklearn.) Además, solo obtendré los primeros 40 componentes principales así como los componentes independientes “profundos” en Tensorflow.

Dejé todo el dataset del lado derecho y lo dividí en otro de 4 componentes

Podemos ver que en nuestra primera imagen de principio tenemos una mancha blanca en el centro de nuestra imagen. (Que en realidad se parece a un pájaro).

Y moviéndonos en el eje podemos observar que algunos de los componentes principales se asemejan a una figura parecida a un pájaro. Sin embargo, después de la tercera fila, no está claro qué es exactamente en la imagen.

Dejó todo el dataset del lado derecho y lo dividi en 4 componentes

Nuevamente, usemos el enfoque de API de alto nivel para realizar KPCA , resultados similares con PCA. De nuevo, las primeras pocas imágenes principales se asemejan a una figura parecida a un pájaro.

Dejó todo el conjunto de datos del lado derecho y lo dividi en otro de 4 componentes

Finalmente, en el enfoque de análisis de componentes independientes de alto nivel. Podemos ver que, en general, ha capturado los cambios locales en la imagen. Si miro lo suficientemente cerca puedo ver algunas figuras como de pájaro en la imagen.

Análisis de componentes independientes: Un enfoque de deep learning

Cuadro amarillo → Capa convolucional

Caja azul → Capa de análisis de componente principal

Caja roja → Capa de análisis de componentes independientes

Ahora, a partir del gráfico anterior, ya podemos saber lo que quería probar, solo tengo un par de capas de convolución para extraer un mayor nivel de características de la imagen y luego realizar PCA para reducir la dimensión, y usar análisis de componentes independientes para hacer estadísticamente esos componentes principales independientes uno del otro.

La razón por la que estoy usando PCA antes de ICA (Análisis de componentes independientes), es de mis experimentos anteriores, el uso de ICA como una reducción de dimensionalidad no convergió tan bien. Hay que tener en cuenta que hay varios métodos de análisis de componentes independientes que podemos elegir, como el ascenso gradual. Voy a utilizar FastICA.

Antes de seguir adelante, primero implementemos la capa de PCA, como se ve arriba, también otra cosa a tener en cuenta aquí es el hecho de que voy a usar Adam para optimizar el peso de Fast ICA en lugar de asignación directa.

Finalmente, en lugar de tener análisis de componentes independientes para optimizar para todos, quería dividirme en cuatro flujos diferentes.

Forma de las funciones que podemos usar para Fast ICA

Imagen de este sitio web

No entraré en los detalles, pero para Fast ICA hay un par de funciones de activación (no el nombre propio, pero así lo llamaré), que podemos elegir usar. Y quería visualizarlos.

Análisis de componentes independientes (ICA) como función de pérdida

Arriba izquierda → imagen original
Arriba derecha → Imagen después de primera capa
Parte inferior izquierda → Imagen después segunda capa
Parte inferior derecha → Imagen después de la tercera capa

De modo que a medida que la imagen avanza, parte de la imagen se oscurece, mientras que otras partes se vuelven más claras. Ahora veamos las 40 imágenes principales combinadas.

Algunas figuras negruzcas parecen pájaros, también cuando vemos 40 componentes independientes.

Podemos ver que algunas de las partes se parecen más a las aves, Sin embargo hay un largo camino por recorrer. El proceso de convergencia se puede ver a continuación.

Análisis de componentes profundos en Tensorflow: Código para esta publicación

Para Google Colab, necesitaría una cuenta de google para ver los códigos, además no puede ejecutar scripts de solo lectura en Google Colab, así que haga una copia en tu campo de juego. Finalmente, nunca pediré permiso para acceder a sus archivos en Google Drive, solo para su información. Happy Coding!

Para acceder a los códigos para sklearn High nivel, haga clic aquí.
Para acceder a los códigos de Tensorflow haga clic aquí.

Referencia
  1. ¿PIL? , H. (2018). ¿Cómo puedo guardar una imagen con PIL ?. Desbordamiento de pila. Consultado el 15 de septiembre de 2018, de https://stackoverflow.com/questions/14452824/how-can-i-save-an-image-with-pil
  2. PIL, S. (2018). Guardar imagen con PIL. Desbordamiento de pila. Consultado el 15 de septiembre de 2018, de https://stackoverflow.com/questions/19651055/saving-image-with-pil
  3. slow, S. (2018). Guardar gráficos usando Matplotlib es muy lento. Raspberry Pi Stack Exchange. Consultado el 16 de septiembre de 2018, desde https://raspberrypi.stackexchange.com/questions/72542/saving-graphs-using-matplotlib-is-very-slow
  4. Redes neuronales convolucionales CS231n para el reconocimiento visual. (2018) Cs231n.github.io. Consultado el 16 de septiembre de 2018, de http://cs231n.github.io/classification/

Dejá un comentario