Full text
Equation Chapter 1 Section 1 Proyecto Fin de Carrera Grado en Ingeniería de las Tecnologías de Telecomunicación Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Autor: Iván Matas González Tutor: Francisco José Simois Tirado Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
ii
iii Proyecto Fin de Carrera Grado en Ingeniería de las Tecnologías de Telecomunicación Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Autor: Iván Matas González Tutor: Francisco José Simois Tirado Profesor Contratado Doctor Dpto. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2021
iv
v Proyecto Fin de Carrera: Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Autor: Iván Matas González Tutor: Francisco José Simois Tirado El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
vi
vii Agradecimientos star escribiendo estas palabras significa que se acaba, se acaba esta preciosa etapa en la cual no solo he aprendido conocimientos teóricos, sino que también he podido aprender que soy capaz de todo lo que me proponga por muy difícil que sea, he aprendido que soy mucho más fuerte de lo que pensaba y que pese a las dificultades que se pongan en el camino siempre habrá una solución y con esfuerzo y disciplina se conseguirá. Dar las gracias a todos y cada uno de los profesores que me han dado clase durante estos cuatro años de grado por transmitirnos sus conocimientos de la mejor forma posible, intentando así hacernos personas lo más competentes posible dentro del campo de las comunicaciones. Sobre todo, me gustaría agradecerle a mi tutor, Francisco José Simois, haberme enseñado este maravilloso mundo del Deep Learning y porque pese a las dificultades me ha ayudado en todo lo posible y como no a Juan Antonio Becerra por ser como es, por siempre intentar hacernos mejores en todos los sentidos, por profesores como tú merece la pena esta etapa. También agradecer a los compañeros de carrera que gracias a vosotros todo esto ha sido más fácil, todas y cada una de las personas que me ha acompañado en este camino ha sido maravillosa y ha sabido aportar su granito de arena y como no, a mis amigos de Puertollano que pese a la distancia y a pasarme estudiando el 90% del tiempo siempre han estado ahí para apoyarme y hacer que todo esto sea mucho más fácil. Y como no podría ser de otra forma, dar las infinitas gracias a mis padres porque sin ellos nada de esto habría sido posible, porque siempre me han ayudado y apoyado, tanto en los momentos buenos, como en los malos, porque hasta cuando yo no tenía más fuerzas para continuar, ellos estaban ahí para darme esas fuerzas que necesitaba. Pero sobre todo a mi madre, Yolanda González Sánchez, que mejor que nadie sabe que sin ella no sería la persona que soy hoy ni estaría donde estoy hoy, simplemente gracias por ser tú, este TFG va por ti mamá allá donde estés. Iván Matas González Sevilla, 2021 E
viii
ix Resumen n este documento se profundizará en el campo del Deep Learning, desde los conceptos más básicos como son el modelo Perceptrón, las redes Multilayer Perceptron, etc. Hasta llegar a uno de los modelos más avanzados de la actualidad, como son las arquitecturas Transformer y Visual Transformer (ViT). Por lo cual este documento estará centrado prácticamente en su totalidad en la clasificación de imágenes, imágenes médicas en este caso. Para cada uno de los modelos que se verán durante el desarrollo del mismo se realizará tanto una explicación teórica profunda como un análisis matemático de sus partes más importantes. Además, una vez realizada dicha explicación se realizará una implementación en código Python de los conceptos desarrollados en los apartados anteriores y con una base de datos de imágenes médicas clasificándolas según la patología (normal - neumonía), pudiendo así ser capaces de realizar una comparación experimental de una Red Convolucional con una arquitectura ViT, poseyendo ambas las mismas condiciones de partida. Con la realización de este documento se pretende haber llegado a comprender el funcionamiento característico de esta nueva arquitectura (modelo codificador-decodificador) y ser capaces de mostrar el potencial de estas aun estando en un nivel de desarrollo muy temprano. E
xvi ÍNDICE DE FIGURAS Figura 1. Evolución histórica [4] 3 Figura 2. Modelo neuronal de McCulloch-Pitts [6] 4 Figura 3. Tipos de funciones de activación [9] 5 Figura 4. Red neuronal Feed-Forward o Multilayer Perceptron (MLP) [10] 6 Figura 5. Arquitectura de una CNN [17] 6 Figura 6. Uso del Kernel [15] 7 Figura 7. Cambio en la arquitectura de una CNN [16] 8 Figura 8. Mapa de características de una CNN [18] 8 Figura 9. Etapas durante el entrenamiento [19] 9 Figura 10. Centrado en cero y normalización de los datos [20] 9 Figura 11. Flip vertical y horizontal [21] 10 Figura 12. Rotación 180º en todas direcciones [21] 10 Figura 13. Reescalado positivo [21] 10 Figura 14. Zoom aleatorio [21] 11 Figura 15. Representación de Data Augmentation [22] 11 Figura 16. Representación por mapa del calor de la técnica Attention [26] 12 Figura 17. Distribución de los valores asignados por la técnica Attention 14 Figura 18. Esquemático de la técnica Attention 15 Figura 19. Arquitectura Transformer 16 Figura 20. Parte izquierda: Representación de las fórmulas 3.5, 3.6 y 3.7 gg ssssss v Parte derecha: Esquemático de Multi-Head Attention del codificador [29] 17 Figura 21. Ejemplo de implementación de las capas Multi-Head Attention y la MLP en el codificador 18 Figura 22. Representación de la implementación de la capa Mask Multi-Head Attention en el decodificador 19 Figura 23. Representación de la implementación de la capa Multi-Head Attention en el decodificador 20 Figura 24. Representación de la salida devuelta por la arquitectura 20 Figura 25. Preprocesado para ViT [34] 21 Figura 26. Codificador ViT [34] 22 Figura 27. Librería da de Deep Learning implementada 25 Figura 28. Codificación de las etiquetas 26 Figura 29. Implementación de la clase ImageDataGenerator 26 Figura 30. Implementación del paquete ImageDataGenerator 27
xvii Figura 31. Imports necesarios para la CNN 27 Figura 32. Creación de la parte convolucional 28 Figura 33. Creación de la red densa 29 Figura 34. Parámetros para el entrenamiento 29 Figura 35. Parámetros de optimización 29 Figura 36. Creación de las variables de train, test y value 30 Figura 37. Implementación de “Data augmentation” a x_train 31 Figura 38. Creación de la segmentación de 16x16 31 Figura 39. Ejemplo de la partición de 16x16 32 Figura 40. Patch + Position Embedding 32 Figura 41. Implementación del codificador ViT 33 Figura 42. Compilación, entrenamiento y monitorización de ViT. 34 Figura 43. Estructura de la primera CNN creada 35 Figura 44. Valores de Accuracy y Loss del 1er modelo CNN durante el entrenamiento 36 Figura 45. Estructura de la segunda CNN creada 37 Figura 46. Valores de Accuracy y Loss del 2º modelo CNN durante el entrenamiento 37 Figura 47. Estructura de la tercera CNN creada 38 Figura 48. Valores de Accuracy y Loss del 3er modelo CNN durante el entrenamiento 38 Figura 49. Estructura de la cuarta CNN creada 39 Figura 50. Accuracy y loss durante el entrenamiento óptimo CNN, respectivamente 39 Figura 51. Salida por la terminal durante el entrenamiento con la CNN 40 Figura 52. Representación de la salida de la CNN 40 Figura 53. Valores de Accuracy y Loss del 1er modelo ViT durante el entrenamiento 42 Figura 54. Valores de Accuracy y Loss del 2º modelo ViT durante entrenamiento 42 Figura 55. Valores de Accuracy y Loss del 3er modelo ViT durante entrenamiento 43 Figura 56. Valores de Accuracy y Loss del 4º modelo ViT durante entrenamiento 44 Figura 57. Resultados durante el entrenamiento con ViT. Accuracy y Loss, respectivamente 45 Figura 58. Salida por la terminal durante el entrenamiento con ViT 45 Figura 59. Representación de la salida del ViT 46
xviii
xix Lista de Acrónimos IA Intelligence Artificial ANN Artificial Neural Network CNN Convolutional Neural Network Tanh Tangente Hiperbólica ReLu Rectified Linear Unit RFF Red neuronal Feed-Forward FFN Feed-Forward Network NLP Natural Language Processing ViT Visual Transformers MLP Multi Layer Perceptron MSA Multi Self-Attention LN Layer Normalization
xx
xxi Notación 𝒃𝒌 Bias (sesgo) ∑ 𝒊 Sumatorio 𝒙𝒌𝒊 Señal i-ésima de entrada 𝒘𝒌𝒊 Peso i-ésimo α Valores de la diagonal en la técnica Attention Q Vector Query de la técnica Attention K Vector Key de la técnica Attention V Vector Value de la técnica Attention 𝑲𝑵 N-ésimo valor del vector Key de la técnica Attention 𝑽𝑵 N-ésimo valor del vector Value de la técnica Attention 𝑲𝑻 Vector Key de la técnica Attention traspuesto 𝒅𝒌 Dimensión del vector Query, Value o Key 𝑲𝒊 i-ésimo valor del vector Key de la técnica Attention 𝑽𝒊 i-ésimo valor del vector Value de la técnica Attention 𝑸𝒊 i-ésimo valor del vector Query de la técnica Attention ↔ Sí y solo sí ∀ Para todo | Tal que ∈ Perteneciente a [x,y] Intervalo entre x e y, ambos incluidos en el intervalo 𝒆𝒙 Exponencial de x 𝑾𝒊𝑸 i-ésima posición del vector de proyección para el vector Query 𝑾𝒊𝑲 i-ésima posición del vector de proyección para el vector Key 𝑾𝒊𝑽 i-ésima posición del vector de proyección para el vector Value
1 1 1 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 1 INTRODUCCIÓN urante el desarrollo de este apartado se detallarán los motivos por los cuales se tomó la determinación de realizar este TFG sobre el campo del Deep Learning y por qué la elección de las arquitecturas que han sido implementadas para tanto la parte experimental como para la explicación teórica. Por último, se mostrarán los objetivos que se pretenden cubrir con la realización del mismo y un breve resumen de la estructura del trabajo por puntos. 1.1 Motivación En los últimos años se está escuchando que en multitud de servicios o bien se ha implementado el Deep Learning o bien se está pensando cómo se podría implementar, por lo cual, el objetivo una vez vista la introducción, es implementar diferentes tipos de arquitecturas, Redes Neuronales Convolucionales y Transformer, con el fin de cubrir un mismo problema y así poder ver diferentes puntos de vista. En cuanto a la elección de la base de datos se tuvieron multitud de opciones, pero al final se eligió una base de datos con imágenes médicas. Estas presentaban radiografías con dos patologías, por un lado, se tienen radiografías de personas en estado “normal” y por otro lado personas con un estado de “neumonía”. Una vez realizadas las arquitecturas y visto como trabaja cada una de ellas, se puede hacer la técnica denominada “Transfer Learning”, es decir, coger la arquitectura y adaptarla a cualquier BBDD con la que se quiera implementar, ajustando también sus parámetros obviamente. Con ello, se pueden ajustar a diferentes objetivos como, por ejemplo, imágenes médicas con diferentes tipos de lunares y pudiendo así predecir cual puede conllevar a tumores de piel o bien un BBDD con resonancias magnéticas del cráneo pudiendo así detectar meningiomas peligrosos para la vida. Como se puede apreciar la cantidad de aplicaciones es innumerable. 1.2 Objetivos El principal de este objetivo de este trabajo es aprender y adentrarse en este maravilloso mundo del Machine Learning y del Deep Learning. Durante la realización de este se pretenden cubrir diferentes metas u objetivos dentro del trabajo: 1. Aprendizaje y aclaración de los conceptos principales del campo en cuestión. 2. Implementación de una red convolucional y el posterior análisis de los resultados. 3. Desarrollo teórico-matemático de la arquitectura Transformer. 4. Desarrollo teórico-matemático de la arquitectura ViT (Visual Transformer). 5. Implementación de la arquitectura ViT y el posterior análisis de los resultados. D
Introducción 2 2 1.3 Desarrollo del trabajo Para la correcta comprensión de este documento se recomienda leerlo en la forma en la cual se presenta, para ello se ha seguido una básica clasificación general, en primer lugar, se realizará una descripción teórica-matemática de los conceptos y de las arquitecturas que van a ser implementadas. En segundo lugar, se mostrará la implementación de ambas arquitecturas con sus diferentes resultados y, por último, se encontrarán los códigos de los cuales se han hablado durante el desarrollo de este último punto. Para ser más concreto en el contenido que se puede encontrar en este documento se muestra a continuación un breve resumen por puntos: 1. Introducción. Apartado en el cual se está desarrollando este punto. Se han detallado tanto la motivación como los objetivos de este TFG. 2. Conceptos básicos. En este apartado se pretenden repasar y aclarar los conceptos más básicos del campo del Deep Learning con los cuales serán desarrollados el resto de los apartados como son el perceptrón, la MLP (Multi Layer Perceptrón), las redes convolucionales y la técnica Data Augmentation. 3. Modelos propuestos. Con el desarrollo de este apartado se pretende dar una clara explicación de los modelos que se han propuesto para este trabajo los cuales son las redes convolucionales y la nueva arquitectura Transformer. 4. Propuesta de trabajo. Se hace una aclaración del equipo Hardware empleado para la realización del documento y la realización del código y su posterior experimentación, además, se hará una aclaración del Software empleado tanto las librerías empleadas, como los paquetes y los programas extras. 5. Código y resultados. En este apartado se muestran diferentes capturas del código y se realiza una detallada explicación de cada uno de los fragmentos intentando así solventar cualquier tipo de dudas que puedan surgir. 6. Conclusiones y líneas futuras. Como último apartado se realizará una evaluación final tanto del trabajo como de cada una de las arquitecturas y, por último, se hablará de las líneas futuras de trabajo de las redes Transformer que como se verá es muy amplio.
3 3 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 2 CONCEPTOS BÁSICOS urante el desarrollo de ese apartado, se detallará tanto la evolución histórica como los diferentes modelos que han sido desarrollados para las diferentes necesidades que han surgido a lo largo de la evolución tecnológica, desde el modelo más básico, el perceptrón, hasta uno de los cambios más revolucionarios en este campo, las redes neuronales convolucionales. 2.1 Historia Alrededor del año 1950 comenzó la evolución de la informática y con ella se empezó a hablar del término Inteligencia Artificial (IA). Alan Turing fue de los primeros en preguntarse si un ordenador era o no, una maquina inteligente. En 1950 inició su investigación, la cual fue anotada en el artículo “Computing machinery and intelligence”. Para llevar a cabo dicha investigación creó el denominado, test de Turing, dicho test consiste en meter a varias personas en una habitación cerrada herméticamente y ponerlas a conversar mediante un chat con otra persona o un ordenador, si esas personas no son capaces de identificar que detrás de ese chat era un ordenador, entonces, se considera que el ordenador es inteligente. [1] Como se puede apreciar, esta definición no tiene nada que ver con la actual sobre inteligencia artificial, es por esto por lo que del terminó IA apareció el nuevo subconjunto denominado Machine Learning que a su vez se subdividió en el famoso Deep Learning. Sobre el año 1980 comenzó el desarrollo del Machine Learning, este subconjunto se centra en la capacidad que tiene una determinada computadora para recibir datos preprocesados con antelación ser capaz de aprender por si sola, ofreciendo al final de dicho entrenamiento el modelo más óptimo posible. El primero en implementar dicha tecnología fue Gerald Dejong mediante el método “Explanation Based Learning” en el año 1981, dicho método era capaz una vez finalizado el entrenamiento, crear unas reglas para descartar los datos menos importantes de cualquier base de datos dada. [2] [3] En 2006, Geoffrey Hinton fue el primero en hacer uso de la palabra Deep Learning para definir un nuevo de tipo de redes neuronales capaces de aprender mucho mejor y más rápido. La creciente evolución de esta tecnología se vio fomentada por el aumento de la computación gracias a las tarjetas gráficas. En el año 2011 el ordenador Watson (de la empresa IBM) fue el primero en derrotar a humanos en el concurso Jeopardy contestando preguntas formuladas por el presentador, es decir, reconocimiento de voz humana a tiempo real. [2] [3] D Figura 1. Evolución histórica [4]
Conceptos Básicos 10 10 2. Técnica denominada “Data augmentation”, con esta técnica se consiguen principalmente dos objetivos, el primero de ellos es el que ya se ha comentado, conseguir que la red no aprenda linealmente al darle diferentes puntos de vista como se verá a continuación y, en segundo lugar, se consigue aumentar la BBDD (Base de datos), que en el caso de tener una BBDD relativamente pequeña es de vital importancia. Esta técnica se puede implementar con múltiples librerías como son Keras, Scikit-Learn entre las más famosas, pero ambas librerías permiten realizar las mismas modificaciones a las imágenes, a continuación, veremos las más importantes y usuales: [21] [22] • Voltear. Esta técnica como bien su nombre indica, no consiste más que en darle la vuelta a la imagen tanto verticalmente como horizontalmente. • Rotación. Permite rotar la imagen 180 grados en cualquier dirección, por lo cual hay hasta cuatro posibilidades y si se realizan dos rotaciones en la misma dirección se tiene una operación de voltear. Además, se puede especificar un porcentaje de inclinación en concreto en vez de dejar el de por defecto (180º). • Reescalado. Permite reescalar la imagen tanto positivamente como negativamente, es decir, hacerla más pequeña o hacerla más grande. Figura 11. Flip vertical y horizontal [21] Figura 12. Rotación 180º en todas direcciones [21] Figura 13. Reescalado positivo [21]
11 11 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers • Zoom. Esta característica realiza zoom a una zona aleatoria de la imagen, teniendo que posteriormente reescalar al tamaño original de la imagen. La parte negativa de esta técnica es que se pierde calidad debido al reescalado. Estos solo son algunos ejemplos de todas las características que se pueden aplicar. En el caso de este trabajo se ha implementado mediante la librería Keras con la clase ImageDataGenerator en el caso de la CNN y con la librería de TensorFlow para la segunda arquitectura. Todo ello se puede ver con detalle en el apartado 4.2.2. En la figura 15 se puede ver una representación visual de como se hace más grande la BBDD. Figura 14. Zoom aleatorio [21] Figura 15. Representación de Data Augmentation [22]
Arquitectura Transformer 12 12 3 ARQUITECTURA TRANSFORMER n el año 2017 fue presentado el paper “Attention Is All You Need” publicado por el autor Ashish Vaswani y su equipo de Google Brain. [29] En este documento se detallaba una nueva estructura basada en una técnica ya existente anteriormente denominada “Attention” y presentaba datos muy prometedores comparando este modelo con las redes neuronales convencionales y con las redes neuronales recurrentes. Al estar basada en la técnica “Attention” antes de explicar cómo funciona este nuevo modelo se verá detalladamente dicha técnica. Esta arquitectura está centrada en el NLP (Natural Language Processing), pero es necesario verla para posteriormente ver la arquitectura Transformer para reconocimiento de imágenes (ViT). 3.1 Técnica Attention La técnica “Attention” fue creada para el ámbito de la traducción mediante Deep Learning y posteriormente fue adaptada al mundo del reconocimiento de imágenes con las CNN. Cuando se comenzó su desarrollo se hizo respondiendo a la siguiente pregunta ¿cómo traduce la mente humana? Cuando se realiza una traducción hay partes de las oraciones que son más importantes que otras y oraciones que necesitan el contexto anterior para tener un sentido, por ejemplo, si se quiere traducir la frase: Juan es un buen chico, al idioma Ingles, las palabras Juan, buen y chico son las más importantes y hay que tenerlas en cuenta conforme se avance durante la traducción si se mantiene le contexto. Posteriormente esta idea se extrapoló al reconocimiento de imágenes y es que, cuando se quiere reconocer una fotografía de un retrato de una persona, los elementos característicos son los ojos, la boca, la nariz, etc. A su vez, es importante tener todas estas características presentes mientras se analiza dicha fotografía para terminar clasificándola como una persona. En la figura 16 se puede apreciar como esta técnica se centra en diferentes zonas de la imagen conforme va pasando por las diferentes capas. E Figura 16. Representación por mapa del calor de la técnica Attention [26]
13 13 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Como se puede apreciar en la figura anterior conforme se avanza de época la técnica se va focalizando las partes más importantes de la fotografía de entrada y le va asignando diferentes probabilidades para cada una de las características predefinidas (esquina superior izquierda en cada uno de los mapas de calor). Al contrario que con una ANN convencional, con la cual la entrada serían los valores de cada píxel de la imagen como si de una variable independiente se tratara, por lo cual, no se tendría en cuenta la posición de estos. Como es obvio, el concepto de la posición espacial de los elementos es muy importante en el reconocimiento de imágenes. A continuación, se va a detallar tanto matemáticamente como visualmente el algoritmo empleado detrás de esta técnica. Para realizar dicha explicación se va a usar un ejemplo de NLP (Procesamiento del Lenguaje Natural), debido a que en un primer momento fue modelado para este fin y es más visual a la hora de realizar los esquemas. Se va a usar un ejemplo básico con la frase: Me gusta ir de vacaciones. En la tabla 1 anterior se puede apreciar un ejemplo de los valores que asignaría esta técnica para cada una de las relaciones entre las diferentes palabras, cabe destacar que cada uno de los colores representa un valor diferente asignado cuanto más oscuro sea un valor más bajo tendrá y por el contrario cuanto más vivo sea tendrá un valor más alto, la diagonal tiene asignado un valor α ya que dependerá del resultado final, lo ideal sería que este fuese el valor máximo de la tabla. Para realizar estas asignaciones se emplea un símil con la técnica de proyección SQL, ya que es empleada en dicho lenguaje, esta técnica consiste en una tabla Key-Value, vectores K y V respectivamente. Una vez obtenida la llave se busca en la tabla y te devuelve el valor Value (véase la tabla 2), solo quedaría definir el vector Q (Query) que serán cada una de las palabras de la oración anterior. [24] [25] [27] Me gusta ir de vacaciones Me α gusta α ir α de α vacaciones α Tabla 1. Representación de los valores asignados por Attention Key Value 𝐾1 𝑉1 𝐾2 𝑉2 . . . . . . 𝐾𝑁 𝑉𝑁 Tabla 2. Proyección SQL
Arquitectura Transformer 14 14 Para calcular el valor del vector 𝑉𝑖 que se está buscando, es necesario buscar la similitud más grande entre el vector Q y el vector K, para ello se usa la herramienta matemática del producto escalar entre ambos vectores, dicho producto calcula el ángulo entre ambos y dará un valor próximo a 1 si la similitud es alta y 0 si no. Para normalizar los valores se hace uso de la función Softmax la cual devuelve los valores normalizados entre los valores 0 y 1, consiguiendo así un valor de 1 o muy próximo a 1 para el valor de la Key correcta y un valor de 0 o muy cercano a 0 para el resto de las posibilidades. Una vez obtenida la probabilidad normalizada solo quedaría multiplicarla por el valor de 𝑉𝑖 correspondiente para la 𝐾𝑖 obtenida. La ecuación que define todo lo comentado anteriormente es la ecuación 3.1 y la figura 17 representa la distribución de los diferentes valores de la técnica Attention una vez encontrada la 𝐾𝑖 correspondiente para un valor de 𝑄𝑖 analizada. 𝐴𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛 (𝑄,𝐾,𝑉)=𝑆𝑜𝑓𝑡𝑚𝑎𝑥 (𝑄𝐾𝑇 √𝑑𝑘)𝑉 (3.1) Cabe destacar que la ecuación 3.1 se encuentra normalizada por 𝑑𝑘, dicho valor representa la dimensión del vector Key, Value o Query (tabla 2). A continuación, se muestra un esquemático que muestra el funcionamiento del algoritmo descrito en los párrafos anteriores. Para entender la notación, los valores 𝐾𝑁 representan los valores correspondientes al vector Key. Los valores de Query son cada uno de los valores que se quieran comparar con el vector Key, para comparar la dicha similitud entre ambos se emplea la fórmula descrita anteriormente en 3.1, esta operación devuelve el valor 𝑎𝑁, el cual se encuentra entre los valores 0 y 1 debido a la función Softmax, definición de la operación realizada en la ecuación 3.2. Por último, estos valores 𝑎𝑁 son multiplicados uno a uno por cada uno de los valores del vector Value, al existir uno de los valores de 𝑎𝑁 de valor 1 o muy próximo al mismo y el resto valdrá 0 o prácticamente 0 y el valor de Attention final será el que corresponda al valor del vector Value en la posición donde se encuentra el 1. [28] 𝑎𝑖= 𝑒𝑆𝑖 ∑𝑒𝑆𝑗 𝑗 ∀𝑖,𝑗 ↔𝑖≠𝑗 | 𝑎𝑁∈[0,1] (3.2) Figura 17. Distribución de los valores asignados por la técnica Attention
15 15 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Figura 18. Esquemático de la técnica Attention Para terminar este apartado, quedaría hacer una última aclaración, la fórmula matemática formulada para calcular la similitud entre el Query y cada uno de los parámetros del vector Key (fórmula 3.1) puede ser sustituida por la expresión 3.3, en la cual se realiza una proyección de los vectores en un mismo subespacio vectorial gracias a la matriz de proyección dominada “W”, posteriormente se le denominará embedding. 𝐴𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛 (𝑄,𝐾,𝑉)=𝑆𝑜𝑓𝑡𝑚𝑎𝑥 (𝑄𝑊𝐾𝑇)𝑉 (3.3) Una vez realizada la explicación teórica se realizará una explicación cuantitativa de lo visto hasta el momento sobre la técnica Attention con el ejemplo propuesto anteriormente. El vector Query será cada palabra de la frase una vez esté tokenizada (se le haya realizado el embedding), es decir, en una primera iteración será la palabra “Me”, en segundo lugar, será la palabra “gusta”, en tercer lugar “ir”, en cuarto lugar, será la palabra “de” y por último será la palabra “vacaciones”. El vector de Key corresponde a la otra parte de la tabla, es decir, al embedding total que tenga la red que ha ido almacenando durante los entrenamientos como si de una BBDD se tratase, de ahí la analogía con la proyección SQL. En cada iteración cada uno de los valores de Query correspondiente es comparado con el vector Key mediante el producto escalar como se muestra en la ecuación 3.1, este producto devuelve un 1 en la posición correcto o en la que más se parezca y al ser multiplicado por el Vector Value, esto devolverá el valor de Key correspondiente a dicha posición ya que el resto será 0 o muy próximo a 0 gracias a la función Softmax.
Arquitectura Transformer 16 16 3.2 Arquitectura Transformer A continuación, una vez visto cómo funciona la técnica Attention, se puede entrar en detalle en cómo funciona esta nueva arquitectura de Deep Learning. Como se comentó en la introducción del apartado 3 esta técnica promete suplir a las antiguas redes neuronales recurrentes para el procesado de texto (NLP). En primer lugar, en la figura 19 se puede apreciar la arquitectura con cada parte que conforma a los Transformers. En la parte izquierda se tiene el codificador y en la derecha se tiene el descodificador, esta división en dos partes de la arquitectura hacer que sea tan eficiente. A continuación, se van a detallar las características de cada una de ellas por separado. Antes de comenzar con la descripción vamos a suponer el ejemplo en el que se quiere traducir del inglés a francés la oración: The big red dog. Figura 19. Arquitectura Transformer
17 17 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers • Codificador En cuanto a la entrada se puede encontrar la primera gran diferencia con las redes convencionales, en esta ocasión la entrada es toda la oración a la vez en, al contrario que con las redes recurrentes con las cuales la entrada era palabra a palabra, de forma secuencial. Dicha entrada es convertida a “Input Embedding”, es decir, se crea un espacio vectorial (un diccionario) con las palabras aprendidas por la red, las palabras que tengan un significado en común estarán más cercanas que las que no, esto permite poder mapear las diferentes palabras y poder encontrar el valor de similitud más fácilmente. La segunda diferencia que nos encontramos es la denominada “Positional Encoding”, esta herramienta permite tener un control de la posición de las palabras en todo momento. Esto se debe a que, si solo se tuviese la técnica de Attention sería como tener una bolsa con palabras (embedding) y se buscaría la más parecida, por lo que el resultado sería el mismo. Pero ¿y en el caso de que importe el orden? En ese caso al entrar toda la frase a la vez y no de forma secuencial (de palabra en palabra) es importante saber en qué posición iban cada una de las palabras antes de entrar en la capa embedding, es decir, si se busca la forma matemática, esto no es más que un vector el cual indica la distancia entre las palabras. A continuación, el resultado de la capa anterior (una vez realizado el Encoding) se introduce en las capas Multi-Head Attention, esto no son más que múltiples capas que implementan la técnica Attention vista en el apartado 3.1. La estructura de esta capa está representada en la figura 20, donde “h” indica el número de heads deseado. Con cada una de estas capas se realiza una proyección entre el Query de entrada y el vector Key de dicha capa, esta operación devolverá el valor correspondiente que Value (fórmulas 3.5, 3.6, 3.7). 𝑚𝑢𝑙𝑡𝑖ℎ𝑒𝑎𝑑 (𝑄,𝐾,𝑉)=𝑊0𝑐𝑜𝑛𝑐𝑎𝑡(ℎ𝑒𝑎𝑑1,ℎ𝑒𝑎𝑑2,…,ℎ𝑒𝑎𝑑ℎ) (3.5) ℎ𝑒𝑎𝑑𝑖=𝑎𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛(𝑊𝑖𝑄𝑄,𝑊𝑖𝐾𝐾,𝑊𝑖𝑉𝑉) (3.6) 𝑎𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛(𝑄,𝐾,𝑉)=𝑆𝑜𝑓𝑡𝑚𝑎𝑥 (𝑄𝑊𝐾𝑇)𝑉 (3.7) Figura 20. Parte izquierda: Representación de las fórmulas 3.5, 3.6 y 3.7 gg ssssss Parte derecha: Esquemático de Multi-Head Attention del codificador [29]
Arquitectura Transformer 18 18 En concatenación con las capas Multi-Head Attention se realiza una concatenación de los valores de entrada y una normalización de los valores de los vectores Query, Key y Value obtenidos para cada uno de los tokens de la entrada. Una vez normalizados estos valores son introducidos a una red neuronal MLP, esto se hace para pasarle unos valores más sencillos al decodificador. Para esta red, es usada la función de activación ReLu y la salida vendrá dada por la ecuación 3.8 la cual indica que la salida no será más que una especie de regresión lineal, la cual dependerá de las matrices de proyección. Una representación de todo lo anterior es lo mostrado en la figura 21. 𝐹𝐹𝑁(𝑥)=max(0,𝑥𝑊1+𝑏1)𝑊2+ 𝑏2 (3.8) Para terminar la explicación del codificador quedaría por añadir al igual que a la salida de las capas Multi-Head Attention, una capa de normalización de los valores obtenidos y una capa full connected la cual generará los valores de Value a partir de los valores de Attention provenientes de la capa Multi-Head Attention correspondiente que a su vez, ambos valores, tanto los valores Attention como los generados por la MLP serán la entrada de una de las partes de decodificador que se verá a continuación. • Descodificador Al igual que en el codificador, se realizará el análisis de abajo hacia arriba, ya que este es el mismo proceso que seguiría la información. En primer lugar, durante el entrenamiento se tiene la entrada de información (del descodificador) que correspondería a la salida perfecta que tendría que devolver la red en un futuro. Es decir, al descodificador hay que darle como entrada la frase: Le gros chien rouge. Al contrario que en el codificador en el cual se introducía toda la información a la vez en todo momento, en esta ocasión se hace igual pero solo hasta un cierto punto en el tiempo, esto quiere Figura 21. Ejemplo de implementación de las capas Multi-Head Attention y la MLP en el aaaaaaaaaa codificador
19 19 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers decir que en el inicio del entrenamiento si se realiza de la misma forma, pero conforme se va realizando el entrenamiento y se va creando un embedding mayor esto se cambia, en un inicio se introduce únicamente la palabra Le, a continuación, se introduce Le gros, después, Le gros chien y así sucesivamente hasta terminar, de esta forma hacemos que la red en cada iteración vaya terminando la frase con las diferentes palabras y corrigiendo los errores. Como en el codificador cada una de estas palabras es proyectada (Output Embedding) en un subespacio vectorial para así pasar de palabras a vectores con números. Y se mantiene el positional Encoding para no perder la referencia con el codificador a la hora de relacionar palabras con la técnica Attention en la siguiente capa. En la siguiente capa se encuentra la gran primera característica de esta arquitectura, la salida de la proyección embedding es introducida en las capas Masked Multi-Head Attention, estas capas tienen la característica de “enmascarar” la información no producida todavía, es decir, en cada una de las capas solo se tiene en cuenta la información recibida hasta ese instante temporal, poniendo a un valor de null el resto, este efecto se consigue mediante la fórmula 3.9 en la cual la matriz M incrementa la posibilidad de obtener un 0 con la función Softmax, o lo que es lo mismo, es como si se quitasen conexiones futuras. Como ya se ha comentado con anterioridad, a cada capa le entra una parte de la sentencia, por lo cual esta capa convierte en null las palabras futuras (del codificador) de la secuencia temporal por la que se encuentra. Se puede ver una representación de esta explicación en la figura 22. 𝑀𝑎𝑠𝑘𝑒𝑑𝐴𝑡𝑡𝑒𝑛𝑡𝑖𝑜𝑛 (𝑄,𝐾,𝑉)=𝑆𝑜𝑓𝑡𝑚𝑎𝑥 (𝑄𝐾𝑇+𝑀 √𝑑𝑘)𝑉 𝑀 𝑒𝑠 𝑢𝑛𝑎 𝑚𝑎𝑡𝑟𝑖𝑧 𝑑𝑒 0′𝑠 𝑦 − ∞ (3.9) Una vez obtenidos los vectores de la técnica Attention enmascarada para cada una de las secuencias temporales se pasan a otra capa de Multi-Head Attention como la que se tenía en el codificador, esta capa posiblemente sea la más importante de toda la arquitectura y esto es debido a que es el momento en el cual se van a juntar las dos partes que conforman el Transformer. Aunque sea muy importante no deja de ser una capa con la técnica Attention y es por ello por lo que se necesitan los tres vectores característicos de la misma. - Vector Query: Se corresponderá a la salida de la capa anterior Masked Multi-Head Attention. - Vector Key: Será una de las dos salidas devuelta por el codificador. - Vector Value: Es el otro vector que se recibe del codificador. Figura 22. Representación de la implementación de la capa Mask Multi-Head Attention en aaaaaaaa el decodificador
Propuesta de trabajo 26 26 4.3 Red Convolucional 4.3.1 Tratamiento de los datos Para el tratamiento de la BBDD se realizó la siguiente asignación: normal → ‘0’, neumonía → ‘1’ (figura 28). De esta forma se conseguía bajar la computación en la parte de las etiquetas. Por último, para el tratamiento de la información se usó el paquete ImageDataGenerator importado desde la librería Keras, véase el apartado 4.2.2 para ver las librearías usadas y el Anexo para verlas en el propio código. Como se acaba de comentar, el tratamiento de la información se realizó con la clase ImageDataGenerator y se le realizó el preprocesamiento que se aprecia en la figura 29, dicho tratamiento de los datos es la solución óptima, la evolución temporal que se ha seguido se puede ver en el apartado 5.1. Como se puede apreciar, a las imágenes de entrenamiento se les realizó cuatro tipos de procesados de imagen, en primer lugar, una normalización de los pixeles entre 0 y 1, una inclinación del 30%, un zoom relativo del 30% y se permitió el giro horizontal (apartado 2.3). Con esto se consigue que la red neuronal no aprenda de forma lineal, si no que sea capaz de aprender cuando las condiciones de las imágenes no sean las más apropiadas, además de aumentar la cantidad de datos de la BBDD. Tanto para los datos de validación como para los datos de test solo se le aplicó la normalización de los pixeles para asegurarse de que la red está aprendiendo de forma correcta. A continuación, en la figura 30 se aprecia el siguiente paso en el tratamiento de las imágenes, a todas las imágenes, independientemente del dataset de procedencia, se les aplica una normalización tanto en altura como en anchura (130 x 130), se seleccionó un batch size (número de imágenes cogidas por época) de 64 imágenes y se le asignó una clasificación categórica ya que solo existen dos tipos de clases. Figura 29. Implementación de la clase ImageDataGenerator Figura 28. Codificación de las etiquetas
27 27 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Figura 31. Imports necesarios para la CNN 4.3.2 Creación de la red Para el primer modelo a implementar se implementaron las todas las librerías vistas en el apartado 4.2.2 y tanto en la figura 31 como en el apartado Anexo se pueden ver las implementaciones. Hay que destacar que los valores mostrados en ese subapartado son los óptimos y toda la evolución de cada uno de los parámetros se detalla en el apartado 5.1 Figura 30. Implementación del paquete ImageDataGenerator
Propuesta de trabajo 28 28 Como se vio anteriormente en la parte teórica (apartado 3.1) las CNN están formadas por dos partes principalmente: 1. Parte convolucional, donde se ha implementado un Kernel de 3x3 por ser esta dimensión óptima recomendada por los profesionales en este campo del Deep Learning [12]. Como se puede ver en la figura 32 se implementaron 3 capas, siendo cada una de ellas más ancha que la anterior, consiguiendo cada una de ellas más características que en la anterior. Además de capas “MaxPooling” entre cada una de las capas anteriores, esta capa permite reducir el tamaño de la matriz de cada una de las salidas (al tamaño indicado) y por lo tanto la computación de la capa siguiente, para conseguir este fin se divide la matriz de salida en tantos cuadrantes como se le indique y únicamente selecciona el valor máximo que por norma general será el que está relacionado con el hallazgo de un patrón. Figura 32. Creación de la parte convolucional Cabe destacar varios aspectos más que se han seleccionado para este modelo, el primero de ellos es que se tiene el argumento input_shape, este argumento solo se indica en la primera capa ya que sirve para decirle a la red la altura como el ancho de las imágenes que va a recibir, es importante recordar que en el preprocesado se reescalaron todas las imágenes a esa dimensión, a continuación se le indica el número de canales (RGB), la primera idea sería poner el número de canales igual a dos ya que son imágenes en blanco y negro, pero esto es incorrecto debido a que el toque de los grises es muy importante y puede ser determinante en la detección de enfermedades en imágenes de este tipo, como se ha comentado en el apartado anterior, cuando se intentó implementar dicho cambio la red mostraba un error por la terminal y por lo tanto se volvió a los tres canales RGB. Por último, se indica la función de activación, la cual en este caso es la ReLu, pero ¿por qué ReLu y no otras? Cómo ya vimos existen funciones mejores que esta, como son la Leky-ReLu, ELU, etc. Pero en el caso de las CNN conviene anular los valores negativos y las características encontradas han de ser pasadas a la siguiente capa tal y como se detecten. 2. Red neuronal densa, esta red no es más que una ANN común, la cual se encarga de recibir la salida de la última capa de la parte convolucional, habiendo realizado un flatten (aplanamiento de la salida de la parte convolucional), y realizando una clasificación normal y corriente. En este caso se crearon 4 capas con 128, 64, 32 y 2 neuronas respectivamente. La más importante es la última de las capas, ya que esta tiene que tener el mismo número de neuronas que categorías ha de clasificar. A cada una de las capas se le aplicó la técnica denominada dropout, esta técnica tiene la finalidad de desactivar un porcentaje de neuronas (80%, 60% y 40% respectivamente) aleatorias en cada una de las iteraciones, de esta manera se consigue que la red no aprenda a memorizar caminos para realizar la predicción ya que esto empeoraría el resultado final, a este fenómeno se le denomina overfitting. En cuanto a la función de activación se mantuvo la implementación de la ReLu en las dos primeras capas y en la última se tomó la Softmax para normalizar el resultado final entre 0 y 1, eligiendo así cual es el resultado final correcto. Todo lo comentado en este párrafo se puede ver en la figura 33.
29 29 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Figura 33. Creación de la red densa s Para alcanzar el óptimo se seleccionaron un total de 75 épocas y dentro de cada época se seleccionaron un número en concreto de pasos, este número vino determinado por la línea “(len(x_train)//batch_size)//3”, donde con “len(x_train)” se consigue saber el número de imágenes con el cual se va a entrenar, este es dividido entre el batch_size para saber con certeza así que en todas las etapas se van a tener el mismo número de imágenes para entrenar, por último se dividió este número entre 3 para conseguir bajar así la computación en cada una de las épocas y 66% (figura 34). Por último, para optimizar la red, se le pasó como parámetro de perdidas categorical_crossentropy ya que se tiene dos clases únicamente, como optimizador se usó Adam, ya que este es el optimizador por excelencia haciendo uso de la técnica del descenso del gradiente para alcanzar el valor óptimo y la métrica para saber cómo de bien va nuestra red fue accuracy definida en la ecuación 4.1 y la implementación puede verse en la figura 35. 𝐴𝑐𝑐𝑢𝑟𝑎𝑐𝑦= 𝑇𝑃+𝑇𝑁 𝑇𝑃+𝑇𝑁+𝐹𝑃+𝐹𝑁 (4.1) En cuanto a la notación que proporciona el resultado de accuracy definida anteriormente en la ecuación 4.1 y suponiendo un caso binario de 1-0 para el ejemplo, destacar que TP hace referencia a “True Negative” es decir el número de veces que la red ha predicho un 0 y se ha equivocado; TP hace referencia a “True Positive” es decir el número de veces que la red ha predicho un 0 y ha sido correcta dicha predicción; FP quiere decir “False Positive” que indica el número de veces que la red ha predicho un 1 y ha acertado; FN hace referencia a “False Negative” que es el número de veces que la red ha predicho un 1 y dicha predicción era incorrecta. Figura 35. Parámetros de optimización Figura 34. Parámetros para el entrenamiento
Propuesta de trabajo 30 30 4.4 Arquitectura ViT Para la realización de este apartado se ha usado el modelo ViT creado por Khalid Salama [38] como esqueleto. Tanto el tratamiento de los datos como la evaluación de los resultados fueron realizados de forma exclusiva para este trabajo y el modelo ViT fue adaptado para el mismo. 4.4.1 Tratamiento de los datos El tratamiento de los datos que se realizó en esta ocasión fue un tanto distinto respecto al que se realizó en la anterior ocasión para la CNN (apartado 4.3.1). Para este apartado no se hizo uso de la clase “ImageDataGenerator” por incompatibilidad con el resto de las clases que formarán la estructura, los cuales serán visto en detalle en el siguiente apartado (apartado 4.4.2). En un primer lugar, se creó la función give_set (figura 36) con la cual se extraerán las imágenes de cada una de las carpetas, extrayendo también sus etiquetas correspondientes (normal y neumonía), y guardándolas en las variables correspondientes ya se corresponda con las imágenes (x_carpeta) o con las etiquetas (y_carpeta), realizándose el mismo proceso que para la CNN, se asignó la etiqueta 1 si era normal y la etiqueta 0 si presentaba neumonía. Para el preprocesamiento de las imágenes si se le han dado las mismas características para estar en igualdad respecto a la red anterior, se han habilitado los tres canales RGB y se reescalaron a un tamaño de 130 x 130. Todo ello se puede ver en detalle en la figura que se muestra a continuación. A continuación, se hizo uso de “Data Augmentation” para conseguir una base de datos más extensa de la que ya se tenía como se vio en el apartado 2.3. Primero se normalizan los datos y posteriormente se realiza el reescalado de las imágenes al tamaño comentado anteriormente (130 x 130), posteriormente se habilita el giro horizontal, una rotación de un 2% y un zoom digital de un 20% tanto en altura como en anchura, si se compara con los valores aplicados en la CNN se puede ver que no son los mismos, esto se debe a que son los parámetros con los cuales mejores resultados se obtuvieron con esta red. Todo esto es aplicado a la variable x_train que es la que contiene las imágenes de entrenamiento. La implementación de todo esto se puede ver en la figura 37. Figura 36. Creación de las variables de train, test y value
31 31 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Figura 38. Creación de la segmentación de 16x16 Figura 37. Implementación de “Data augmentation” manualmente a x_train Por último, como se vio en el apartado 3.3 en el cual se explicó en detalle el funcionamiento de la arquitectura ViT, cada una de las imágenes ha de ser segmentada en particiones de 16x16 para posteriormente ser analizados por la red. En la figura 38, se puede apreciar el código de este paso ya que hace uso de diferentes funciones. En primer lugar, hace uso de la clase “Patches” la cual se encargará de devolver las particiones de cada imagen, si se hace uso del índice [1] devuelve el número de arrays que forman la imagen total, es decir, el número de particiones y si se hace uso del índice [-1] indica el número de elementos que hay dentro de cada array, devolviendo así el número de pixeles que forma cada imagen. Las particiones serán de 16x16 como así se indicó, este valor viene dado en la variable “patch_size” que se configura al inicio del código.
Propuesta de trabajo 32 32 Figura 40. Patch + Position Embedding Para mostrar cómo se vería estas particiones en una imagen cualquiera, se realizó un ejemplo de este código con una imagen random devuelta de “x_train”. Véase la figura 39. 4.4.2 Creación del modelo En este subapartado se va a implementar el desarrollo teórico que se desarrolló en el apartado 3.3 y se representó en la figura 25. Para ello, se va a comenzar por la parte izquierda de dicha figura, es decir, por crear los segmentos (patches) y el embedding de la posición. Antes de entrar con la arquitectura, es necesario crear la codificación de los segmentos y el embedding de la posición, con esto se consigue la entrada del denominado codificador. Para conseguir esta codificación se hace uso de una clase llamada “PatchEncoder”, al ser llamada esta clase proyecta cada uno de los segmentos y crea el embedding de la posición que ocupa del segmento en cuestión. Una vez creadas las clases y funciones características de este modelo, se puede empezar con la arquitectura Transformer en cuestión. Para los códigos que se presentarán a continuación es recomendable recordar la figura 26 ya que será el modelo por seguir a partir de este momento. La estructura ViT fue definida en la función “create_vit_classifier”, en dicha función en primer lugar se llama a las clases y funciones vistas anteriormente data_augmentation, Patches y PatchEncoder, respectivamente. Si se mira la figura 26, hasta ahora se ha conseguido la entrada del codificador Transformer. El número de capas que tendrá el codificador (“L” en la figura 26) viene determinado por la variable “transformer_layer”. Figura 39. Ejemplo de la partición de 16x16
33 33 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Siguiendo el esquema, el siguiente paso es realizar una normalización de la salida devuelta por las clases y funciones anteriores, esta normalización es denominada “x1”, importante recalcar que esta normalización se ha realizado con una épsilon=1e-6, este valor se le suma a la varianza para evitar así que al dividir se divida entre cero. Después, el resultado es la entrada de las capas Multi-Head Attention, el número de capas vendrá delimitado por “num_heads” (ver figura 20), la dimensión de esta capa ha de coincidir con la entrada, es decir, ha de tener el mismo tamaño que la proyección realizada en el apartado anterior y se aplica un dropout de un 10% para evitar overfitting, estas capas son denominadas attention_output. En el código “x2” únicamente representa la suma de la salida del párrafo anterior con estas Multi-Head Attention siguiendo la realimentación que se muestra en la figura. La salida de Multi-Head Attention es normalizada al igual que “x1” y en este caso es denominada “x3”, esta normalización es analizada por una MLP que tendrá el tamaño que se le indique mediante la variable “transformer_units” y con un dropout de un 10% de nuevo. Por último, hay volver a sumar estas dos últimas capas siguiendo de nuevo la realimentación que se indica. Toda la explicación detallada en este párrafo es la implementación de la figura 41. Para terminar, quedaría “representar” la salida de alguna forma, esto en el paper original no se especifica como tal, por lo cual cada autor es libre de hacer lo que crea mejor, en este caso el creador de este modelo creó la siguiente estructura: 1. Normalización de la salida 2. Aplanamiento de los datos a un vector de 1D. 4. Creación el objeto “model” que será el devuelto por la función en cuestión y donde se guardará el modelo final. 3. El resultado es analizado por una red MLP la cual tendrá tantas capas como se le indique en la variable “mlp_head_units”, esta red es la que se encargará de realiza la decisión final mediante una función Softmax, que en nuestro caso es perfecta ya que solo tenemos dos clases. Todo lo descrito anteriormente es la implementación mostrada en la figura 41. Figura 41. Implementación del codificador ViT
Propuesta de trabajo 34 34 Figura 42. Compilación, entrenamiento y monitorización de ViT. Una vez creado el modelo, solo queda entrenarlo y para este fin se creó la función “run_experiment”, en dicha función se realizan todos los ajustes necesarios para la compilación, entrenamiento y monitorización. El optimizador elegido es AdamW, este optimizador es una subversión del optimizador Adam y puede recibir dos parámetros: 1. Learning rate: Este parámetro indica cada cuanto son actualizados los pesos de nuestra arquitectura. Para esta ocasión fue seleccionado un valor muy bajo (0.0005) ya que el parecido entre todas las fotos que conforman la base de datos es muy grande. 2. Weight decay: Este parámetro se encarga de penalizar los cambios grandes en los pesos con un determinado valor (menor que uno) si estos superan el umbral. Con esto se consigue el entrenamiento sea más lineal y no tendrá grandes picos durante el entrenamiento evitando entre otras cosas el overfitting. El valor usado fue 0.001. Gracias a la manipulación de estos dos parámetros se consiguen unos resultados más precisos. Para la función de perdidas (loss) se implementó “SparseCategoricalCrossentropy” que gracias a tener solo dos clases las cuales son representadas mediante números enteros (0-1) es la más eficiente. Y para la monitorización se implementó el accuracy, como no podía ser de otra forma mediante “SparseCategoricalAccuracy”. La diferencia entre “CategoricalCrossentropy” y “SparseCategoricalCrossentropy” o “CategoricalAccuracy” y “SparseCategoricalAccuracy”, es la versión de TensorFlow con la que se trabaje, sin embargo, ambas son válidas y ambas se pueden usar, la gran diferencia entre ambas funciones (dando igual la pareja que se elija), es que si no presenta el prefijo “Sparse” la función compara si el índice del valor real máximo y el máximo predicho son iguales y por el contrario si presenta el prefijo “Sparse” la función comprueba si el valor real máximo es igual al índice del valor máximo predicho. A continuación, en la figura 42 se representa el código tanto de la compilación como del entrenamiento y de la monitorización durante el entrenamiento de la arquitectura ViT.
35 35 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 5 RESULTADOS OBTENIDOS omo ya se comentó en el apartado 1, para la resolución de este problema se han propuesto dos modelos y en el apartado 4.3 y 4.4 se ha detallado su implementación en Python, en primer lugar se detalló la implementación de la CNN y en segundo lugar se implementó la arquitectura ViT. A continuación, se detallará tanto la evolución temporal que se ha seguido con cada una de las arquitecturas como los resultados finales obtenidos con cada uno de los modelos que se han ido creado para cada una de las arquitecturas y al final del apartado se hará una breve comparación de las dos arquitecturas, aunque su discusión se verá en detalle en el apartado 6. 5.1 Red Convolucional En el aparado anterior se ha podido ver el código de la estructura final de esta red, pero como es obvio este resultado no fue el primero con el cual se probó si no que a lo largo de los entrenamientos conforme se iban analizando los resultados y se iban realizando los cambios pertinentes para intentar solventarlos. En primer lugar, no se sabía la dificultad que tenían las imágenes médicas en cuanto al tratamiento de los datos que como se verá a continuación es muy delicado ni tampoco la dificultad que tendría la red en un futuro para entrenar ya que al ser imágenes en escala de grises se tenía una concepción errónea. 5.1.1 Primer modelo Para el primer tratamiento de los datos, no se realizó la técnica “Data Augmentation” que se explicó en el apartado 2.3 por simple desconocimiento de la existencia de la misma y la red que se creó fue la mostrada en la figura 43, que como se puede apreciar es demasiado pequeña ya que como se ha comentado en la primera parte del apartado el primer pensamiento fue que el análisis de este tipo de imágenes era muy sencillo. Como se puede apreciar la red presenta únicamente seis capas en total, cuatro capas para la parte convolucional (dos capas convolucionales y dos capas Max Pooling) y únicamente dos capas para la parte densa de la CNN de 32 y 2 neuronas. Como ya se comentó en el apartado 4.3.2 en la parte densa de la red se especificaron dos capas “Max Pooling” para reducir el tamaño de las salidas C Figura 43. Estructura de la primera CNN creada
Resultados Obtenidos 42 42 Figura 54. Valores de Accuracy y Loss del 2º modelo ViT durante entrenamiento 5.2.1 Primer modelo En un primer lugar se pecó un poco de avaricioso y aunque ya se ha comentado anteriormente que la estructura sería lo más básica posible dentro de unos límites, pero en la parte de las MLP que serán las encargadas de generar la clasificación mediante la entrada de los valores Attention (𝑎𝑁) al inicio sí que se tomó una red demasiado extensa, formada por tres capas de 64, 32, 2 neuronas, respectivamente. Además, como ya se explicó en el apartado 4.4.2 se hace uso de un nuevo parámetro que no fue usado en la CNN denominado “weight_decay” (apartado 4.4.2.), este parámetro era desconocido hasta el momento y por lo cual hasta llegar al valor óptimo se fueron probando diferentes valores y ajustándolo, en un primer lugar se seleccionó un valor de 0.01. Como se puede apreciar en la figura 53 los resultados no eran nada prometedores. Los valores de validación eran muy malos en comparación al primer resultado obtenido para la CNN (figura 44) no tenían nada que ver, además, no se sabía muy bien como analizar los resultados ya que nunca se habían visto unos resultados parecidos en ningún otro experimento. Se optó por seguir modificando los parámetros un poco a ciegas hasta conseguir unos resultados con los cuales poder avanzar. 5.2.2 Segundo modelo Para este segundo modelo se cambiaron los parámetros “weight_decay” (apartado ) a un valor de 0.001 y la red MLP se modificó a 128, 32, 2 neuronas por capa, respectivamente, con esto se pretendía penalizar menos los cambios bruscos de los pesos, que en principio no deberían existir porque los cambios entre imágenes no serían muy grandes y conseguir una mayor diversificación de los valores devueltos por la técnica Attention gracias a las 128 neuronas intentando así que cada neurona “cargue con menos peso durante el entrenamiento”. Figura 53. Valores de Accuracy y Loss del 1er modelo ViT durante el entrenamiento
43 43 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Como se puede apreciar en la figura 54 los valores no mejoraban con los cambios realizados, los valores del Accuracy no respondía, se mantenía constante en un 75% aproximadamente y en caso del Loss también se mantenía constante durante prácticamente todo el entrenamiento en torno al 69%, todo esto en la gráfica de “training”, en la gráfica de “Validation” los resultados son peores si cabe, en resumen, todos los resultados eran demasiado lineales y esto puede ser caso de overfitting ya que la red puede haber aprendido de memoria y no a clasificar. 5.2.3 Tercer modelo Con intención de solventar el overfitting la MLP se redujo drásticamente y se cambiaron los valores de dropout que traía por defecto el modelo, fueron seleccionadas tres capas de 32, 16 y 2 neuronas cada una de ellas respectivamente y se seleccionó un dropout de un 50% para todas las capas ya que no era posible seleccionar distintos valores para cada una de las capas. Y, el valor de “weight_decay” se mantuvo en su valor anterior ya que parecía lo suficientemente bajo. El resultado de estos cambios está representado en la figura 55. Como se puede apreciar los valores de “Validation” fueron capaces de responder ante el entrenamiento por lo cual, se sabe con certeza que los resultados obtenidos anteriormente estaban mal y los cambios efectuados han sido beneficiosos para la experimentación, aunque como se puede ver todavía no era una gráfica como la obtenida en la experimentación de la CNN. Además, El accuracy en la gráfica de training alcanzaba más del 90% de precisión demasiado deprisa por lo cual se le realizó una evaluación con el set “Value” y el resultado confirmó dicha sospecha: - Accuracy = 28% - Loss = 87% 5.2.4 Cuarto modelo Hasta el momento, no se habían obtenido los resultados deseados y no se sabía muy bien el por qué ya todo lo que se modificaba no funcionaba. Uno de los cambios que se realizaron en este apartado fue en el apartado del tratamiento de los datos y es en la función give_set, hasta el momento se tenía “return x, y” y al mirar la documentación de Keras se descubrió que la función empleada con la CNN automáticamente barajaba los dataset para volverlos así aleatorios y por lo tanto se cambió dicha salida por la salida mostrada en la figura 36. En segundo lugar, se pensó que si estaba aplicando un dropout del 50% de las neuronas en cada capa incluida la del final, cabía la posibilidad de que al solo tener dos neuronas y aplicar el dropout no realizase bien la clasificación, en principio esto no debería de ser un problema ya que como se explicó en el apartado 2.2.1 una única neurona puede realizar una clasificación de dos clases pero la mayoría de autores siempre recomienda tener tantas neuronas activas en la capa final como clases se tengan que clasificar, es decir, dos neuronas Figura 55. Valores de Accuracy y Loss del 3er modelo ViT durante entrenamiento
Resultados Obtenidos 44 44 en la capa de salida. Y por último quedaba saber él por qué de los resultados tan raros en la gráfica de “Validation”, por lo que se tomó la determinación de analizar con detenimiento los resultados obtenidos por Khalid Salama durante su experimentación y ahí se obtuvo una grata sorpresa, sus resultados en la parte de “Validation” tampoco eran nada buenos y sin embargo él en sus comentarios mostraba su alegría con los resultados obtenidos siendo realista de que no es para nada un modelo final, pero no era un parámetro que le importarse, por lo cual, a partir de este momento, ese parámetro pasó a un segundo plano, solo se tendría en cuenta para ver que no hubiese overfitting como pasaba en los apartados 5.2.1 y 5.2.2. Como se puede apreciar en la figura 56, los resultados son mucho más prometedores, por un lado, el accuracy no parte directamente del 80-90% lo cual es bastante positivo, el entrenamiento no es lineal como si se mostraba anteriormente y los valores de “Validation” no son planos por lo cual no presenta overfitting en principio. Una vez visto los resultados devueltos por la arquitectura quedaba verificar los resultados mediante una evaluación con el set “Value”. - Accuracy = 85’96% - Loss = 37’47% Ahora sí, los resultados eran mucho mejores y eran más o menos los esperados al iniciar este proyecto, pero… ¿Cuál de los dos cambios ha sido el causante de la mejora? 5.2.5 Quinto modelo La creación de este modelo no era del todo necesaria ya que los resultados obtenidos anteriormente eran más que satisfactorios, pero se realizó por simple curiosidad de cuál de los dos cambios había sido el que causó la mejora. Por lo cual, para este apartado únicamente se modificó la última capa de la MLP y se volvió a poner únicamente dos neuronas ya que el cambio de realizar un shuffle de los datos antes de entrenar a la red parecía mucho más coherente. En la figura 57 se pueden apreciar que los resultados no son muy dispares de los mostrados por el anterior modelo, por lo cual se puede llegar a la conclusión de que el error principal, entre otros muchos, era la falta de la inclusión shuffle a la hora de pasarle los datos a la red para ser entrenado. Ambos modelos, tanto este quinto modelo como el anterior, cumplen con las expectativas y son capaces de ofrecer resultados muy interesantes. Figura 56. Valores de Accuracy y Loss del 4º modelo ViT durante entrenamiento
45 45 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers Figura 58. Salida por la terminal durante el entrenamiento con ViT En la figura 57, se puede apreciar este último modelo con la diferencia respecto al anterior de presentar únicamente dos neuronas en la capa final. Como se puede apreciar los resultados no son muy dispares unos de otros por lo cual se llega a la conclusión de que el cambio que hizo que la red comenzase a funcionar correctamente fue el shuffle de los datos y no esta modificación. Entre estos dos últimos modelos no existe una gran diferencia y ambos son totalmente válidos como resultado final de este proyecto fin de carrera, aunque como es obvio se tomará la que ha dado un mejor porcentaje de acierto como es el cuarto modelo para la comparación con la CNN en el siguiente apartado. Al igual que con el resto de las experimentaciones se realizó una evaluación del modelo para comprobar el resultado final del modelo que como se ha adelantado anteriormente es ligeramente peor que cuarto modelo. - Accuracy: 85’65% - Loss: 40’94% Por último, para tener una visión de lo que la red estaba devolviendo, se adaptó el código creado para el apartado 5.1.4 que devolvió la figura 52 para esa arquitectura y el resultado, como es obvio, es muy parecido y se muestra en la figura 59. Figura 57. Resultados durante el entrenamiento con ViT. Accuracy y Loss, respectivamente
Resultados Obtenidos 46 46 Figura 59. Representación de la salida del ViT 5.3 Resumen Como resumen se presenta la tabla 5, en dicha tabla se muestran tanto los resultados finales de accuracy y loss de las dos arquitecturas como tiempos de computación. Hay que destacar que, aunque a primera vista numéricamente pueda parecer que la CNN es mucho mejor en cuanto a resultados, en el siguiente apartado de Conclusiones y líneas futuras se verán en detalle las conclusiones y las líneas futuras en las cuales se detalla que este tipo de arquitectura aún está en una fase muy temprana del desarrollo por lo cual hay que tomar los datos con cierta cautela. En primer lugar, se puede apreciar que los valores de accuracy no difieren demasiado, pero en esta ocasión la CNN es mejor que la arquitectura ViT. En segundo lugar, se pueden apreciar la comparación de los valores de loss en los cuales se puede ver que la CNN sí que es mucho mejor que la nueva arquitectura ViT. Por último, se tienen los tiempos de computación durante el entrenamiento de ambas arquitecturas y en esta ocasión la arquitectura ViT es la clara vencedora consiguiendo unos tiempos muchos menores. CCNN ViT Accuracy 88’9% 85’96% Loss 32% 37’47% Tiempo computación ~ 21 min ~ 4 min Tabla 5. Comparación de las dos arquitecturas
47 47 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 6 CONCLUSIONES Y LÍNEAS FUTURAS unque a primera vista (tabla 5) pueda parecer que la CNN es mucho mejor que el ViT en términos de rresultados, como ya se comentó las figuras 39 y 49 han sido realizadas con un pequeño código, el ccual, una vez entrenada la red en cuestión, recibía una imagen y mediante la clase predict del paquete de Keras intentaba predecir de que tipo era la imagen. Cuando se realizaba dicho experimento en bloques de 12 tiempos con cada una de las redes, la red ViT devolvía muchos mejores resultados que la red CNN, por ello, se subieron las iteraciones a 24 y el resultado era similar, la red ViT devolvía mejores resultados que la CNN, aproximadamente de cada 24 intentos la red ViT fallaba 3 o 4 y la red CNN hasta 9 en sus peores resultados. Aun así, con este trabajo únicamente se tenía el objetivo de introducir al mundo de las arquitecturas Transformer ya que son el nuevo presente dentro de este apasionante mundo del Deep Learning. Es tanto así que, Google, en su conferencia anual Google I/O 2021 en la cual presentan todas las novedades en las que han estado trabajando en los últimos años y en las que siguen trabajando, su mayor novedad fue la implementación de la arquitectura Transformer para la gran mayoría de servicios que ofrecen hoy en día como es el motor de búsqueda de Google, Google Translate, Google Lens para el reconocimiento de texto en tiempo real, etc. Además, de presentar LaMDA que hace competencia directa a la actual GPT-3, dicho modelo también implementa una arquitectura Transformer para NLP en tiempo real. No cabe duda de que en cuanto la arquitectura ViT esté tan madura como lo está a día de hoy las redes Transformer, las CNN lo tendrán muy difícil para no ser desplazadas de este campo del Deep Learning, ya que como se puede ver en la tabla 5, los tiempos de computación son mucho más pequeños y los resultados pese a ser un modelo en estado “Beta” o incluso “Alpha” ha conseguido ponérselo muy difícil. Como trabajos futuros respecto a este proyecto existen varias posibilidades, una de ellas, es continuar con el desarrolle e implantación de las redes ViT con paquetes optimizados por bibliotecas como PyTorch la cual, recientemente ha lanzado uno para las redes ViT con el cual es mucho más fácil su implementación además de no tener que optimizar capa a capa manualmente. También se puede intentar optimizar aún más la red de Khalid Salama concatenando de forma distinta las capas o usando otro algoritmo para la creación de las múltiples capas Transformer en vez de hacer uso del for o cualquier otro cambio que permita mejorar el rendimiento de la red sin perjudicar los resultados. Por otro lado, al estar el mundo del Deep Learning en constante desarrollo se pueden intentar implementar otras nuevas arquitecturas como pueden ser un Perciber de la compañía DeepMind o una MLP Mixer, arquitectura que ha sido desarrollada a partir del ViT y hace uso de su procesado de imagen en patches de 16x16 pero en vez de hacer uso de un codificador únicamente hace uso de múltiples MLPs. Como uno se puede imaginar este campo tiene multitud de opciones, para acotar un tanto por ciento los resultados, únicamente se nombrarán los proyectos más grandes hoy en día en análisis de imágenes médicas en los cuales puede ser usada la red ViT y de NPL con el uso del Transformer. Por ejemplo, Watson, la IA de IBM para el reconocimiento de Melanomas que actualmente está siendo entrenada con aproximadamente 30.000 millones de imágenes trabaja con CNNs, por lo cual la computación que ha de soportar la infraestructura que rodea dicha tecnología ha de ser muy elevada. Una vez la arquitectura ViT sea lo suficientemente estable y sea capaz de devolver unos resultados tan buenos como las CNN, ya se ha visto que no está muy lejos, con un 400% menos de computación como aseguraba Alexey Dosovitskiy es más que probable que sea reemplazada. Si se quiere buscar una referencia de los resultados que obtendría esta arquitectura con una base de datos tan grande, es recomendable irse al paper original [34] y buscar la tabla 5 en el apartado C “Additional Results”, en dicha tabla podemos ver los resultados obtenidos para la BBDD JFT- 300M la cual presenta como se puede intuir 300 millones de imágenes que son menos de las cuales tiene IBM pero aun así es un número enorme, y presenta unos resultados con accuracies en torno al 90%, 84% en el peor resultado obtenido. Por otro lado, si nos centramos en el NPL con la arquitectura Transformer la A
Conclusiones y líneas futuras 48 48 presentación más reciente e innovadora ha sido “GitHub Copilot”, esta herramienta ha sido desarrollada por GitHub, OpenAI y Azure (Microsoft) las cuales posiblemente sean 3 de las empresas tecnológicas más fuertes en este campo. Esta herramienta está formada en su interior por una arquitectura Transformer que en vez de ser entrenada con texto normal y corriente ya sea en un idioma en concreto para crear un modelo como GPT-3 o en varios idiomas para generar un modelo de traducción, ha sido entrenada con una base de datos de código principalmente en Python ofrecida por GitHub como no podría ser de otra forma, de esta forma, esta herramienta permite que mediante una entrada de texto natural en forma de comentario o incluso únicamente poniendo el nombre de la función que se quiera desarrollar, ella automáticamente es capaz de crear todo el código de forma automática incluso si ya se ha creado un código intentará mejorarlo en la medida de lo posible haciendo el código más legible para futuros desarrolladores que necesiten leer dicho código o haciéndolo más óptimo. Aunque, su presentación se ha centrado principalmente en Python debido a su gran potencial en el mundo del desarrollo de software, pero también puede ser usado para otro con otros lenguajes como son JavaScript, TypeScript, Ruby and Go, han sido seleccionados estos lenguajes debido a la cantidad de gente que los usa. Actualmente, según el propio paper presentado por GitHub, este modelo presenta un acierto del 43% para la creación de código en una primera iteración, es decir, que es capaz de crear el código perfecto que se le ha indicado de una solo vez sin necesidad de repetir la iteración, en caso de hacerlo, el porcentaje de acierto está en torno al 55%. Como se puede ver, el campo del desarrollo de estas dos tecnologías no acaba nada más que empezar.
49 49 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers REFERENCIAS [1] A. García Serrano, INTELIGENCIA ARTIFICIAL: FUNDAMENTOS, PRACTICA Y APLICACIONES, 2nd ed. Madrid, 2016, p. 296. [2] A. Pant, "Introduction to Machine Learning for Beginners", Medium, 2019. [Online]. Available: https://towardsdatascience.com/introduction-to-machine-learning-for-beginners-eed6024fdb08. [Accessed: 17- Apr- 2021]. [3] F. Chollet, Deep learning with Python. 2018, p. Chapter 1: What is Deep Learning? [4] M. Gorini, "¿Cuál es la diferencia entre el machine learning y el deep learning?", Blog.bismart.com, 2020. [Online]. Available: https://blog.bismart.com/es/diferencia-machine-learning-deep-learning. [Accessed: 17 - Apr - 2021]. [5] "Types of Neural Networks and Definition of Neural Network", GreatLearning Blog: Free Resources what Matters to shape your Career!, 2020. [Online]. Available: https://www.mygreatlearning.com/blog/types-of-neural-networks/#Perceptron. [Accessed: 20 – Apr - 2021]. [6] L. Guesmi, "Researchgate", Researchgate, 2018. [Online]. Available: https://www.researchgate.net/figure/McCulloch-Pitts-computational-model-of-a- neuron_fig2_323465059 [Accessed: 20- Apr- 2021]. [7] "Types of Neural Networks and Definition of Neural Network", GreatLearning Blog: Free Resources what Matters to shape your Career!, 2020. [Online]. Available: https://www.mygreatlearning.com/blog/types-of-neural-networks/#Perceptron. [Accessed: 20- Apr- 2021]. [8] “Redes Neuronales,” Github.io, 2012. https://ml4a.github.io/ml4a/es/neural_networks/ [Accessed 24 – May – 2021]. [9] P. Jain, "Laptrinhx", Laptrinhx, 2019. [Online]. Available: https://laptrinhx.com/complete-guide-of- activation-functions-574622854/. [Accessed: 20- Apr- 2021]. [10] Hamed Rahimi Nohooji, “Dynamic analysis and intelligent control techniques for flexible manipulators: a review,” ResearchGate, Aug. 2018. https://www.researchgate.net/publication/326735709_Dynamic_analysis_and_intelligent_control_tec hniques_for_flexible_manipulators_a_review (accessed Jun. 30, 2021). [Accessed: 20- Apr- 2021]. [11] Y. Manolopoulos, B. Hammer, L. Iliadis and E. Maglogiannis, "Artificial Neural Networks and Machine Learning", in 27th International Conference on Artificial Neural Networks, Rhodes (Greece), 2018, p. Chapter: A Convolutional Neural Network Approach for Modeling Semantic Trajectories and Predicting Future Locations. [12] F. Chollet, Deep learning with Python. 2018, p. Chapter 5: Deep Learning for computing vision.
Referencias 50 50 [13] R. Venkatesan and B. Li, Convolutional Neural Network in visual computing. Arizona State University, Phoenix,(USA): CRC Press, 2018, pp. Chapters 4 and 5. [14] A. Géron, Hands on machine learning with scikit-learn and TensorFlow. O'Reilly Media, Inc., 2017, pp. Pages: 358 - 360. [15] E. Decena, “Entendiendo las redes neuronales PART 1 - Eddy Decena - Medium,” Medium, Jun. 25, 2019. https://medium.com/@eddydecena/entendiendo-las-redes-neuronales-part-1-fca3adf78c5b (accessed Jul. 11, 2021). [16] Y. Sai Palaghat, "What can convolutional neural network do? - Quora", Quora.com, 2019. [Online]. Available: https://www.quora.com/What-can-convolutional-neural-network-do. [Accessed: 21- Apr-2021]. [17] "Understanding of Convolutional Neural Network (CNN) — Deep Learning", Medium, 2018. Available: https://medium.com/@RaghavPrabhu/understanding-of-convolutional-neural-network-cnn-deep- learning-99760835f148. [Accessed: 21- Apr- 2021]. [18] "(1/3) El rol del Open Source en el desarrollo de la Inteligencia Artificial y el Deep Learning | GUTL", GUTL, 2019. [Online]. Available: https://gutl.jovenclub.cu/rol-open-source-inteligencia-artificial- deep-learning/. [Accessed: 21- Apr- 2021]. [19] “Is overfitting okay if the test accuracy is high enough? - Quora,” Quora.com, 2021. https://www.quora.com/Is-overfitting-okay-if-the-test-accuracy-is-high-enough [Accessed 23-May-2021). [20] “CS231n Convolutional Neural Networks for Visual Recognition,” Github.io, 2014. https://cs231n.github.io/neural-networks-2. [Accessed 23-May-2021]. [21] Arun Gandhi, “set Augmentation | How to use Deep Learning when you have Limited Data,” AI & Machine Learning Blog, May 19, 2021. https://nanonets.com/blog/data-augmentation-how-to-use- deep-learning-when-you-have-limited-data-part-2/ [Accessed 23-May-2021]. [22] Data augmentation, “Aumento de datos | TensorFlow Core,” TensorFlow, 2021. https://www.tensorflow.org/tutorials/images/data_augmentation [Accessed 23-May-2021]. [23] L. Taylor and G. Nitschke, "Improving Deep Learning with Generic Data Augmentation", Bangalore (India), 2018. [24] N. Adaloglou, "How Attention works in Deep Learning: understanding the attention mechanism in sequence models", Theaisummer.com, 2019. [Online]. Available: https://theaisummer.com/attention/. [Accessed: 25- Apr- 2021]. [25] W. Wang and J. Shen, "Deep Visual Attention Prediction," in IEEE Transactions on Image Processing, vol. 27, no. 5, pp. 2368-2378, May 2018, doi: 10.1109/TIP.2017.2787612. [26] P. Rajpurkar, "Visualizing A Convolutional Neural Network's Predictions", mlx, 2017. [Online]. Available: https://rajpurkar.github.io/mlx/visualizing-cnns/. [Accessed: 25- Apr- 2021]. [27] A. Everyone, "Attention Mechanism In Deep Learning | Attention Model Keras", Analytics Vidhya, 2021. [Online]. Available: https://www.analyticsvidhya.com/blog/2019/11/comprehensive-guide-attention- mechanism-deep-learning/. [Accessed: 03- May- 2021].
51 51 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers [28] M. Luong, H. Pham and C. D. Manning, "Effective Approaches to Attention-based Neural Machine Translation", Computer Science Department (Stanford University), Stanford, 2015. [29] A. Vaswani et al., "Attention is all you need", no. 1706037625, 2017. Available: https://arxiv.org/abs/1706.03762. [30] Maxime. "What is a Transformer?" Medium. https://medium.com/inside-machine-learning/what-is-a- transformer-d07dd1fbec04 [Accessed 28 – May - 2021]. [31] J. Alammar. "The Illustrated Transformer". Jay Alammar – Visualizing machine learning one concept at a time. https://jalammar.github.io/illustrated-transformer/ [Accessed 28 - May - 2021]. [32] "Transformers from scratch | peterbloem.nl", Peterbloem.nl, 2019. [Online]. Available: http://peterbloem.nl/blog/transformers. [Accessed 29-May-2021]. [33] “Transformers for Image Recognition at Scale,” Google AI Blog, Dec. 03, 2020. https://ai.googleblog.com/2020/12/transformers-for-image-recognition-at.html [Accessed 4-Jun-2021]. [34] A. Dosovitskiy et al., " An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale", no. 2010.11929, 2020. Available: https://arxiv.org/abs/2010.11929v2. [35] “Data-efficient image Transformers: A promising new technique for image classification,” Facebook AI Blog, Dec. 23, 2020. https://ai.facebook.com/blog/data-efficient-image-transformers-a- promising-new-technique-for-image-classification/ [Accessed 4-Jun-2021]. [36] Keras Team, “Keras documentation: Keras API reference,” Keras.io, 2021. https://keras.io/api/ [Accessed all the time]. [37] “TensorFlow Core,” TensorFlow, 2019. https://www.tensorflow.org/tutorials [Accessed all the time] [38] Keras Team, “Keras documentation: Image classification with Vision Transformer,” Keras.io (Khalid Salama), 2021. https://keras.io/examples/vision/image_classification_with_vision_transformer/ [Accessed 18-Jun-2021].d [39] Shen, D., Wu, G., & Suk, H. I. (2017). Deep learning in medical image analysis. Annual review of biomedical engineering, 19, 221-248. [40] J. Ker, L. Wang, J. Rao and T. Lim, "Deep Learning Applications in Medical Image Analysis," in IEEE Access, vol. 6, pp. 9375-9389, 2018, doi: 10.1109/ACCESS.2017.2788044. [41] Lundervold, A. S., & Lundervold, A. (2019). An overview of deep learning in medical imaging focusing on MRI. Zeitschrift für Medizinische Physik, 29(2), 102-127. [42] Lundervold, A. S., & Lundervold, A. (2019). An overview of deep learning in medical imaging focusing on MRI. Zeitschrift für Medizinische Physik, 29(2), 102-127.
Anexo B 58 58 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 classifier #cambiado """ ## Use data augmentation """ data_augmentation = keras.Sequential( [ layers.experimental.preprocessing.Normalization(), layers.experimental.preprocessing.Resizing(image_size, image_size), layers.experimental.preprocessing.RandomFlip("horizontal"), layers.experimental.preprocessing.RandomRotation(factor=0.02), layers.experimental.preprocessing.RandomZoom( height_factor=0.2, width_factor=0.2 ), ], name="data_augmentation", ) # Compute the mean and the variance of the training data for normalization. data_augmentation.layers[0].adapt(x_train) """ ## Implement multilayer perceptron (MLP) """ def mlp(x, hidden_units, dropout_rate): for units in hidden_units: x = layers.Dense(units, activation=tf.nn.gelu)(x) x = layers.Dropout(dropout_rate)(x) return x """ ## Implement patch creation as a layer """ class Patches(layers.Layer): def __init__(self, patch_size): super(Patches, self).__init__() self.patch_size = patch_size def call(self, images): batch_size = tf.shape(images)[0] patches = tf.image.extract_patches( images=images, sizes=[1, self.patch_size, self.patch_size, 1], strides=[1, self.patch_size, self.patch_size, 1], rates=[1, 1, 1, 1], padding="VALID",) patch_dims = patches.shape[-1] patches = tf.reshape(patches, [batch_size, -1, patch_dims])
59 59 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 return patches plt.figure(figsize=(8, 8)) image = x_train[np.random.choice(range(x_train.shape[0]))] plt.imshow(image.astype("uint8")) plt.axis("off") resized_image = tf.image.resize( tf.convert_to_tensor([image]), size=(image_size, image_size)) patches = Patches(patch_size)(resized_image) print(f"Image size: {image_size} X {image_size}") print(f"Patch size: {patch_size} X {patch_size}") print(f"Patches per image: {patches.shape[1]}") print(f"Elements per patch: {patches.shape[-1]}") n = int(np.sqrt(patches.shape[1])) plt.figure(figsize=(8, 8)) #4, 4 for i, patch in enumerate(patches[0]): ax = plt.subplot(n, n, i + 1) patch_img = tf.reshape(patch, (patch_size, patch_size, 3)) plt.imshow(patch_img.numpy().astype("uint8")) plt.axis("off") print ('Creando particiones') class PatchEncoder(layers.Layer): def __init__(self, num_patches, projection_dim): super(PatchEncoder, self).__init__() self.num_patches = num_patches self.projection = layers.Dense(units=projection_dim) self.position_embedding = layers.Embedding( input_dim=num_patches, output_dim=projection_dim ) def call(self, patch): positions = tf.range(start=0, limit=self.num_patches, delta=1) encoded = self.projection(patch) + self.position_embedding(positions) return encoded print ('Particiones creadas') def create_vit_classifier(): inputs = layers.Input(shape= (130, 130, 3)) # Augment data. augmented = data_augmentation(inputs) # Create patches. patches = Patches(patch_size)(augmented) # Encode patches. encoded_patches = PatchEncoder(num_patches, projection_dim)(patches) # Create multiple layers of the Transformer block. for _ in range(transformer_layers): # Layer normalization 1. x1 = layers.LayerNormalization(epsilon=1e-6)(encoded_patches)
Anexo B 60 60 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 # Create a multi-head attention layer. attention_output = layers.MultiHeadAttention( num_heads=num_heads, key_dim=projection_dim, dropout=0.1)(x1, x1) # Skip connection 1. x2 = layers.Add()([attention_output, encoded_patches]) # Layer normalization 2. x3 = layers.LayerNormalization(epsilon=1e-6)(x2) # MLP. x3 = mlp(x3, hidden_units=transformer_units, dropout_rate=0.1) # Skip connection 2. encoded_patches = layers.Add()([x3, x2]) # Create a [batch_size, projection_dim] tensor. representation = layers.LayerNormalization (epsilon=1e-6)(encoded_patches) representation = layers.Flatten()(representation) representation = layers.Dropout(0.5)(representation) # Add MLP. features = mlp(representation, hidden_units=mlp_head_units, dropout_rate=0.5) # Classify outputs. logits = layers.Dense(num_classes)(features) # Create the Keras model. model = keras.Model(inputs=inputs, outputs=logits) return model """ ## Compile, train, and evaluate the mode """ def run_experiment(model): optimizer = tfa.optimizers.AdamW( learning_rate=learning_rate, weight_decay=weight_decay ) model.compile( optimizer=optimizer, loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=[ keras.metrics.SparseCategoricalAccuracy(name="accuracy"), keras.metrics.SparseTopKCategoricalAccuracy(5, name="top-5- accuracy")]) checkpoint_filepath = "/tmp/checkpoint" checkpoint_callback = keras.callbacks.ModelCheckpoint( checkpoint_filepath, monitor="val_accuracy", save_best_only=True, save_weights_only=True, ) history = model.fit( x=x_train, y=y_train,
61 61 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 274 275 276 277 278 279 280 281 282 283 284 285 286 287 batch_size=batch_size, epochs=num_epochs, validation_data= (x_value, y_value), callbacks=[checkpoint_callback], ) model.load_weights(checkpoint_filepath) _, accuracy, top_5_accuracy = model.evaluate(x_test, y_test) print(f"Test accuracy: {round(accuracy * 100, 2)}%") print(f"Test top 5 accuracy: {round(top_5_accuracy * 100, 2)}%") return history vit_classifier = create_vit_classifier() history = run_experiment(vit_classifier)
Anexo C 62 62 ANEXO C Parte del código correspondiente al código para la comprobación visual de los resultados. Este código se puede encontrar al final de los dos ficheros anteriores en su formato online, tanto en el Anexo 1 y Anexo 2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 """ Created on Tue May 18 07:44:51 2021 @author: imata """ import numpy as np import tensorflow as tf from keras.preprocessing.image import load_img, img_to_array from keras.models import load_model import matplotlib as plt import os import sys import numpy as np import random import pandas as pd import keras import tensorflow as tf import sklearn import matplotlib.pyplot as plt from keras import layers from keras import models from keras.utils.vis_utils import plot_model from keras.utils.vis_utils import plot_model from keras.utils.vis_utils import model_to_dot from keras.preprocessing.image import load_img from keras.layers import Dropout, Flatten, Dense, Activation from keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split from sklearn.preprocessing import normalize from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import OneHotEncoder from tqdm import tqdm from PIL import Image long, altura = 130, 130 modelo ='./modelo4/modelo.h5' pesos = './modelo4/pesos.h5' train_data_normal = os.listdir('train/NORMAL') train_data_neumonia = os.listdir('train/PNEUMONIA') test_data_normal = os.listdir('test/NORMAL') test_data_neumonia = os.listdir('test/PNEUMONIA') val_normal = os.listdir('val/NORMAL')
63 63 Clasificación de imágenes mediante Redes Neuronales Convolucionales y técnicas de Deep Learning avanzadas: Transformers 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 val_neumonia = os.listdir('val/PNEUMONIA') CNN = load_model(modelo) CNN.load_weights(pesos) def predictor(archivo): # image1 = tf.keras.preprocessing.image.load_img(archivo, target_size=(altura, long)) # image = img_to_array(image1) image = np.expand_dims(img_to_array(tf.keras.preprocessing.image.load_img(archivo, target_size=(altura, long))), axis = 0) solucion = CNN.predict(image) resultado = solucion[0] indice = np.argmax(resultado) print(solucion) if indice == 0: etiqueta = "Normal" print("Normal") elif indice == 1: etiqueta = "Neumonía" print("Neumonía") return etiqueta img_normal = 'test/NORMAL/' + test_data_normal[random.randrange(0, len(test_data_normal))] img_neumonia = 'test/PNEUMONIA/' + test_data_neumonia[random.randrange(0, len(test_data_neumonia))] img_normal1 = load_img('test/NORMAL/' + test_data_normal[random.randrange(0, len(test_data_normal))]) img_neumonia1 = load_img('test/PNEUMONIA/' + test_data_neumonia[random.randrange(0, len(test_data_neumonia))]) etiqueta1 = predictor(img_normal) etiqueta = predictor(img_neumonia) fig, axs = plt.subplots(1,2,figsize=(10,6)) axs[0].imshow(img_normal1) axs[0].set_title(etiqueta1) axs[1].imshow(img_neumonia1) axs[1].set_title(etiqueta)