Desbalanceo de datos en redes de clasificación binaria - Grado en Ingeniería Multimedia Trabajo Fin de Grado - RUA

Página creada Beltran Borréda
 
SEGUIR LEYENDO
Desbalanceo de datos en redes de clasificación binaria - Grado en Ingeniería Multimedia Trabajo Fin de Grado - RUA
Escuela
                                            Politécnica
                                            Superior

Desbalanceo de datos
en redes de
clasificación binaria
           Grado en Ingeniería Multimedia

Trabajo Fin de Grado
Autor:
Pablo Amorós Becerra
Tutor/es:
Antonio Javier Gallego Sánchez
Jorge Calvo Zaragoza

Septiembre 2021
Desbalanceo de datos en redes de
      clasificación binaria

                         Autor
                  Pablo Amorós Becerra

                       Tutor/es
             Antonio Javier Gallego Sánchez
     Departamento de Lenguajes y Sistemas Informáticos
                  Jorge Calvo Zaragoza
     Departamento de Lenguajes y Sistemas Informáticos

             Grado en Ingeniería Multimedia

           Escuela
           Politécnica
           Superior

              ALICANTE, Septiembre 2021
Preámbulo
   Con este proyecto se pretende estudiar las posibles mejoras a aplicar a una red neuronal
de clasificación binaria que ha sido entrenada con un conjunto de datos desbalanceado. Para
el estudio de estas mejoras se han utilizado los conjuntos de datos Modified National Insti-
tute of Standards and Technology database (MNIST), National Institute of Standards and
Technology database (NIST) y United States Postal Service database (USPS).
   La motivación que me ha llevado a escoger este trabajo, son mis ganas e interés para
iniciarme en el mundo del Deep Learning y la inteligencia artificial en general. Vi en este
proyecto la oportunidad perfecta para comenzar a aprender sobre el tema en cuestión.
Agradecimientos

  En primer Lugar, me gustaría agradecer a mis dos tutores, Jorge Calvo Zaragoza y Antonio
Javier Gallego Sánchez, por toda su ayuda con el proyecto y por proponerme un tema tan
interesante.
  Por otro lado, debo agradecer a mis amigos por apoyarme y por estar a mi lado en las
buenas y en las malas. En especial, quiero darle las gracias a Julio por estar ahí cuando lo he
necesitado.
  Por último, y más importante, papá, mamá, Sergio, gracias por todo el apoyo incondicional
durante todos estos años, sin vosotros esto no habría sido posible.
El fracaso es aquí una opción.
Si las cosas no fallan es que no estás innovando lo suficiente.

                                                   Elon Musk.

                                                            ix
Índice general
1 Introducción                                                                                                                             1
  1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                2
  1.2 Estructura del trabajo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                 2

2 Marco Teórico                                                                                                              5
  2.1 ¿Qué es una CNN? . . . . . . . . . . . . . . . . . . . . . . . . . .                                     . . . . . . . 5
      2.1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . .                                     . . . . . . . 5
      2.1.2 Arquitectura de una Convolutinal Neural Network (CNN)                                              . . . . . . . 5
             2.1.2.1 Convolución . . . . . . . . . . . . . . . . . . . .                                       . . . . . . . 5
             2.1.2.2 Reducción . . . . . . . . . . . . . . . . . . . . .                                       . . . . . . . 7
             2.1.2.3 Clasificación . . . . . . . . . . . . . . . . . . . .                                     . . . . . . . 7
      2.1.3 Backpropagation . . . . . . . . . . . . . . . . . . . . . . .                                      . . . . . . . 8
      2.1.4 Funciones de pérdida . . . . . . . . . . . . . . . . . . . . .                                     . . . . . . . 8
             2.1.4.1 ¿Qué son las funciones de pérdida? . . . . . . .                                          . . . . . . . 8
             2.1.4.2 Entropía cruzada (crossentropy) . . . . . . . . .                                         . . . . . . . 9
                    2.1.4.2.1 Entropía cruzada categórica (categorical                                         crossentropy) 9

3 Herramientas y recursos                                                                                                                  11
  3.1 Tecnologías . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      3.1.1 Python . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
             3.1.1.1 NumPy . . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
             3.1.1.2 Matplotlib . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
             3.1.1.3 TensorFlow . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
             3.1.1.4 Keras . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
             3.1.1.5 SciKit Learn . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
             3.1.1.6 Jupyter Notebook . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
             3.1.1.7 Google Colaboratory           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  3.2 Datasets . . . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
      3.2.1 MNIST . . . . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
      3.2.2 NIST . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
      3.2.3 USPS . . . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  3.3 Setup . . . . . . . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14

4 Desarrollo                                                                                                                               15
  4.1 Arquitectura . . . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
      4.1.1 Etapa de extracción de características                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
      4.1.2 Etapa de clasificación . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
      4.1.3 Red implementada en Keras . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16

                                                                                                                                           xi
xii                                                                                                                   Índice general

      4.2   Pipeline del script . . . . . . . . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
            4.2.1 Inicialización de parámetros . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
            4.2.2 Descarga del dataset . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
            4.2.3 Preparación y desbalanceo de los datos                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
            4.2.4 Entrenamiento de la red . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
            4.2.5 Evaluación . . . . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      4.3   Soluciones propuestas . . . . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
            4.3.1 Aumentado de datos . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
            4.3.2 Pesos de clase . . . . . . . . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
      4.4   Métricas utilizadas en el estudio . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
            4.4.1 Precisión . . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
            4.4.2 Exhaustividad(Recall) . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
            4.4.3 Valor-F(F1) . . . . . . . . . . . . . . . .             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22

5 Resultados                                                                                                                                  23
  5.1 Casos contemplados . . . . . . . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      5.1.1 Hiper-parámetros utilizados . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  5.2 Estructura de los resultados . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  5.3 Modelo base sin balancear . . . . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
      5.3.1 Resultados del entrenamiento .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
             5.3.1.1 MNIST . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
             5.3.1.2 NIST . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
             5.3.1.3 USPS . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   27
  5.4 Aplicando el aumentado de datos . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
      5.4.1 Resultados del entrenamiento .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
             5.4.1.1 MNIST . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
             5.4.1.2 NIST . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
             5.4.1.3 USPS . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   29
  5.5 Aplicando los pesos de clase . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
      5.5.1 Resultados del entrenamiento .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
             5.5.1.1 MNIST . . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
             5.5.1.2 NIST . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
             5.5.1.3 USPS . . . . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
  5.6 Tablas comparativas de los resultados           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   32

6 Conclusiones                                                                                                                                35
  6.1 Posibles mejoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                    35
      6.1.1 Aplicar porcentajes distintos a cada dataset . . . . . . . . . . . . . . .                                                        35
      6.1.2 Combinar las soluciones aplicadas . . . . . . . . . . . . . . . . . . . .                                                         35

Bibliografía                                                                                                                                  37

Lista de Acrónimos y Abreviaturas                                                                                                             39
Índice de figuras
 1.1    Esquema de la Inteligencia Artificial. Fuente: Ionos (s.f.) . . . . . . . . . . . .                        1

 2.1    Representación matricial de la imagen de entrada y el kernel. Fuente: Na8 (2018)                           6
 2.2    Representación de la matricial imagen de entrada y el mapa de características.
        Fuente: Na8 (2018) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                       6
 2.3    Representación matricial de aplicación de ReLU. Fuente: Na8 (2018) . . . . .                               7
 2.4    Representación pictorial del Max-Pooling. Fuente: Wiki (s.f.) . . . . . . . . .                            7

 3.1    Imágenes de muestra del conjunto de validación de MNIST. Fuente: Wikipedia
        (s.f.-b) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                  13

 4.1    Captura del formulario de parámetros . . . . . . . . . . . . . . . . . . . . . .                          17
 4.2    Algunas muestras del dataset USPS y las dimensiones de este. . . . . . . . . .                            18

 5.1    Learning rate bajo . . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .    25
 5.2    Learning rate correcto . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .    25
 5.3    Learning rate alto . . . . . . . . . . . . . . . . . . . . . . . . .     .   .   .   .   .   .   .   .    25
 5.4    Gráficas del dataset MNIST utilizando el modelo base. . . . . .          .   .   .   .   .   .   .   .    26
 5.5    Gráficas del dataset NIST utilizando el modelo base. . . . . . .         .   .   .   .   .   .   .   .    27
 5.6    Gráficas del dataset USPS utilizando el modelo base. . . . . . .         .   .   .   .   .   .   .   .    27
 5.7    Gráficas del dataset MNIST utilizando el aumentado de datos.             .   .   .   .   .   .   .   .    28
 5.8    Gráficas del dataset NIST utilizando el aumentado de datos. . .          .   .   .   .   .   .   .   .    29
 5.9    Gráficas del dataset USPS utilizando el aumentado de datos. .            .   .   .   .   .   .   .   .    29
 5.10   Gráficas del dataset MNIST utilizando los pesos de clase. . . .          .   .   .   .   .   .   .   .    30
 5.11   Gráficas del dataset NIST utilizando los pesos de clase. . . . . .       .   .   .   .   .   .   .   .    31
 5.12   Gráficas del dataset USPS utilizando los pesos de clase. . . . .         .   .   .   .   .   .   .   .    31

                                                                                                                 xiii
Índice de tablas
 5.1   Tabla   comparativa   del   dataset   MNIST de las clases 3 y 5.    .   .   .   .   .   .   .   .   .   .   .   32
 5.2   Tabla   comparativa   del   dataset   MNIST de las clases 7 y 9.    .   .   .   .   .   .   .   .   .   .   .   32
 5.3   Tabla   comparativa   del   dataset   NIST de las clases C y G. .   .   .   .   .   .   .   .   .   .   .   .   32
 5.4   Tabla   comparativa   del   dataset   NIST de las clases V e Y. .   .   .   .   .   .   .   .   .   .   .   .   33
 5.5   Tabla   comparativa   del   dataset   USPS de las clases 3 y 5. .   .   .   .   .   .   .   .   .   .   .   .   33
 5.6   Tabla   comparativa   del   dataset   USPS de las clases 7 y 9. .   .   .   .   .   .   .   .   .   .   .   .   33

                                                                                                                       xv
1 Introducción

   El Deep Learning (DL) es un concepto que cada día está mas presente en nuestra sociedad.
En un mundo cada vez más conectado y en permanente evolución, donde el Big Data es
uno de los recursos más valiosos en nuestra sociedad, el DL tiene un papel fundamental,
aunque pasa desapercibido para la mayoría de personas, que hacen uso de él diariamente sin
ni siquiera saberlo.
   Éstas técnicas se están aplicando en distintos ámbitos con el fin de realizar tareas del día
a día. Por ejemplo, el DL se utiliza para el reconocimiento automático de objetos, en los
algoritmos de recomendación de anuncios en medios digitales, conducción autónoma y otros
muchos campos.
   La Inteligencia Artificial, como bien dice su nombre, se trata de la creación de sistemas
informáticos que traten de imitar el pensamiento y comportamiento humano. Este concepto es
algo abstracto y amplio ya que existen muchas técnicas y ramas muy distintas de Inteligencia
Artificial. En concreto, nos vamos a enfocar en el Machine Learning (ML) o aprendizaje
automático, que es la disciplina de la Inteligencia Artificial que se basa en utilizar una gran
cantidad de datos de ejemplo para entrenar modelos de predicción.
   Como el ML es un concepto bastante extenso al igual queInteligencia Artificial (IA), vamos
a especificar un poco más este término y nos vamos a centrar en el aprendizaje profundo o
DL , que se basa en la simulación de un cerebro humano utilizando redes neuronales que
emulan su comportamiento.

              Figura 1.1: Esquema de la Inteligencia Artificial. Fuente: Ionos (s.f.)

                                                                                             1
2                                                                               Introducción

   Una red neuronal está constituida, al igual que un cerebro, por una serie de neuronas
organizadas en capas interconectadas entre sí que trabajan en conjunto para desempeñar
una labor. Cada neurona tiene na serie de parámetros o pesos, que son variables durante el
entrenamiento, de forma que se puede dar menor o mayor importancia a cada neurona según
estos valores.
   Generalmente, estas redes neuronales suelen funcionar bien para problemas comunes y en
los que los datos de entrada están controlados y balanceados. El problema aparece cuando
intentamos entrenar a una red con un conjunto de datos desbalanceado y dispar, es decir,
cuando hay mucha diferencia en la cantidad de datos de las clases a identificar. En estos
casos, la red tiende a predecir únicamente las muestras a la clase dominante.
   Para resolver este problema, se proponen una serie de posibles modificaciones que resuelvan
los casos de clasificación errónea.

1.1 Objetivos
  En esta sección se exponen todos los objetivos que se desean alcanzar con el desarrollo de
este Trabajo Final de Grado (TFG):

    • Conocer y entender qué es y cómo funciona el Deep Learning (DL): Con este
      proyecto se pretenden conocer los métodos que se utilizan en el DL, como la creación y
      estudio de redes neuronales y la interpretación de los datos que estas arrojan.

    • Aprendizaje de los lenguajes y frameworks utilizados en el trabajo: En este
      proyecto se utiliza Python, con varias librerías y frameworks como Tensorflow, NumPy
      y Keras, que previamente desconocía.

    • Entender los problemas de desbalanceo en redes neuronales: En el proyecto
      se utilizarán datasets desbalanceados, por lo que se debe comprender la pérdida de
      rendimiento por este debalanceo y por qué se produce.

    • Experimentación con posibles modificaciones de una red neuronal: Se van a
      realizar ciertas modificaciones en una red neuronal previamente creada con el fin de
      mejorar su rendimiento.

    • Establecer un primer contacto con la investigación: En cuanto a nivel acadé-
      mico, con este trabajo se espera establecer un primer contacto con los proyectos de
      investigación, qué metodología se sigue, cómo se deben estructurar este tipo de proyec-
      tos, etc.

1.2 Estructura del trabajo
  Este trabajo está estructurado en 6 capítulos bien diferenciados. Primeramente, encontra-
mos la introducción, donde se explica brevemente en qué va a consistir el trabajo y se explican
aspectos básicos sobre el tema que se va a tratar. En segundo lugar, se encuentra el marco
teórico, en este capitulo se exponen nociones más avanzadas sobre DL y la problemática del
desbalanceo de datos en el entrenamiento de redes neuronales.
1.2. Estructura del trabajo                                                                    3

  El tercer capítulo consta de una explicación sobre todas las herramientas utilizadas para
realizar el trabajo, exponiendo desde tecnologías empleadas hasta los conjuntos de datos que
se han destinado a estudiar el desbalanceo.
  Siguiendo este capitulo, se inicia el desarrollo, en el cual se dan detalles de la red neuronal
utilizada, los problemas producidos por el uso de datasets desbalanceados y las soluciones
aplicadas.
  Como es lógico, posteriormente al desarrollo, se sitúa el capítulo de resultados, en el que se
indican los resultados de la red neuronal en el reconocimiento de caracteres antes y después
de aplicar cada una de las técnicas propuestas para mejorar los resultados.
  Por último, se incluye un pequeño apartado que consta de las conclusiones que se han
sacado al realizar este trabajo.
2 Marco Teórico
   Para entender mejor el proyecto, primeramente es necesario exponer algunos conceptos
básicos sobre las redes neuronales, con ello se entenderá el problema en el que está enfocado
el proyecto y el por qué de la implementación elegida.

2.1 ¿Qué es una CNN?
2.1.1 Introducción
   Una CNN es una red multicapa que está inspirada en el cortex visual de los animales, ya que
las neuronas artificiales se disponen de una manera muy similar a como se hace en la corteza
visual de un cerebro. La primera CNN fue creada por Yann LeCun en 1998 basandose en el
Neocognitron de Kuinhiko Fukushima, este a su vez se basó en el estudio que se menciona a
continuación.
   En la corteza visual, tal y como estudiaron Hubel y Wiesel en 1959, se encuentran las células
responsables de la orientación y detección de bordes. En esta zona del cerebro se encontraron
dos tipos de neuronas distintas, las denominadas células simples y células complejas.

  • Las células simples tienen un patrón de posición, rotación y tamaño determinado de
    forma que si un estimulo visual coincide con el patrón de la célula, esta se activa y
    manda una señal.

  • Las células complejas únicamente tienen una rotación particular, por lo cual si el
    estímulo tiene la misma rotación que la célula esta será activada.

2.1.2 Arquitectura de una CNN
  Una CNN está constituida por dos bloques bien diferenciados. Primeramente, se encuen-
tra un bloque de extracción de características que está constituidos por múltiples capas de
neuronas convolucionales seguidas por capas de completamente conectadas de neuronas que
son las que realizan la clasificación final.

2.1.2.1 Convolución
  El proceso de convolución consiste en tomar un grupo de píxeles de la imagen del mismo
tamaño que el kernel y realizar un sumatorio del producto escalar con este mismo kernel.
  El kernel o núcleo consiste en una matriz que se utiliza como filtro para obtener las ca-
racterísticas o patrones importantes de una imagen, inicialmente este kernel toma valores
aleatorios, pero estos valores se ajustan durante el entrenamiento mediante backpropagation,
término que se explicará posteriormente.

                                                                                              5
6                                                                                Marco Teórico

    Figura 2.1: Representación matricial de la imagen de entrada y el kernel. Fuente: Na8 (2018)

  Esta convolución se realiza para todos los píxeles de la imagen, de izquierda a derecha
y de arriba a abajo, de forma que el resultado de la convolución es una nueva matriz que
representa las características de la imagen, dejando con un valor numérico más alto a las
zonas más dominantes de la imagen.

Figura 2.2: Representación de la matricial imagen de entrada y el mapa de características. Fuente:
            Na8 (2018)

   La matriz resultante(mapa de características) tiene un tamaño igual al tamaño original de
la matriz de la imagen menos el tamaño de la matriz menos uno. De forma, que si se tiene
una imagen de tamaño 5x5 y utilizamos un kernel de tamaño 3x3 obtendremos un mapa de
características de tamaño 3x3 puesto que:

                                       Tm = Ti − (Tk − 1)

  Siendo Tm el tamaño del mapa de características, Ti el tamaño de la imagen y Tk el tamaño
del kernel.
   Una vez se realiza la convolución, se aplica una función de activación sobre este resultado,
para esta aplicaciones se suele utilizar la función rectificador ReLU( por sus siglas en inglés,
Rectified Linear Unit). Esta función tiene como salida el valor máximo entre el valor del
elemento y 0, de forma que podríamos decir que esta función ”elimina” los valores negativos
del mapa de características.
2.1. ¿Qué es una CNN?                                                                           7

         Figura 2.3: Representación matricial de aplicación de ReLU. Fuente: Na8 (2018)

2.1.2.2 Reducción
   Posteriormente, una vez se ha realizado la convolución, se procede a reducir el tamaño de
la capa. Esta se realiza para sintetizar la información proveniente del mapa de características.
De esta forma, las mismas características corresponden a una región más amplia de la imagen
original, lo cual da una cierta tolerancia para imágenes muy similares.
   Primeramente, para realizar esta reducción de muestreo, se utilizaban procesos de sub-
sampling, pero tras varias investigaciones se ha demostrado que es más eficiente utilizar
operaciones de max-pooling que, además, se asemejan más al comportamiento de la corteza
visual.
   La operación de max-pooling consiste en buscar el mayor valor dentro de una ventana
seleccionada, es decir, sustituir una ventana de tamaño m x n por un valor que sea el máximo
encontrado en dicha ventana.

            Figura 2.4: Representación pictorial del Max-Pooling. Fuente: Wiki (s.f.)

  Por último, aclarar que este proceso de reducción de características puede repetirse varias
veces según la complejidad del problema que se esté abordando.

2.1.2.3 Clasificación
   Una vez finalizada la fase de extracción de características, comienza la fase de clasificación.
En esta etapa, la red obtiene mapas de características muy depurados que esta debe clasificar,
es decir, dar una etiqueta u otra según los criterios establecidos. En el caso de este proyecto,
la red deberá clasificar únicamente en dos conjuntos de datos, puesto que se va a trabajar
con clasificaciones binarias.
   Esta subred(la parte final utilizada para la clasificación) tiene forma de perceptrón multi-
capa, que como bien dice su nombre, es una red formada por múltiples capas, que suelen ser
redes totalmente conectadas.
   Este tipo de redes están divididas en tres partes:
8                                                                              Marco Teórico

    • Por un lado se encuentra la capa de entrada que conecta la red con las entradas. En
      esta capa encontraremos tantas neuronas como valores de entrada se envíen a la red.
    • Las capas ocultas, suelen ser múltiples capas, en ellas se encuentran una o más neu-
      ronas las cuales están conectadas con las neuronas de la capa anterior para recibir la
      entrada, y se conectan con la capa posterior para enviar su resultado.
    • Por último, se encuentra la capa de salida, que es la encargada de conectar las capas
      ocultas con la salida de la red y muestra los resultados que esta ha calculado. En esta
      última capa se suele utilizar la función de activación softmax.

2.1.3 Backpropagation
   En las redes neuronales tradicionales, como el perceptrón multicapa visto anteriormente,
el backpropagation o retropropagación de errores consiste en modificar el valor de los pesos
de las interconexiones entre capas de neuronas, para reducir el error cometido a la salida.
   El algoritmo consta de los siguientes pasos:
    1. Se calcula la salida de la red o a partir de un conjunto de prueba x.
    2. Se compara la salida con los valores correctos (t) y se calcula el error con la siguiente
       fórmula.
                                                    1∑
                                                       m
                                                                 (2)
                                        (1))
                                E(x; W ; W =  (2)
                                                          (ti − oi )2
                                                    2
                                                       i=1

       Siendo m el número de muestras.
    3. Se calculan las derivadas parciales del error con respecto a los pesos W (2) que unen la
       última capa oculta con la de salida.
    4. Se calculan las derivadas parciales del error con respecto a los pesos W (1) que unen la
       capa de entrada con la oculta.
    5. Se ajustan los pesos de cada neurona.
    6. Se repite el proceso varias veces por cada par de valores del conjunto de prueba.
  En las CNN el proceso es similar, pero tiene algunas diferencias, ya que en este caso se
ajustan los pesos de los kernels utilizados en las convoluciones.

2.1.4 Funciones de pérdida
2.1.4.1 ¿Qué son las funciones de pérdida?
  Las funciones de pérdida modifican el valor de salida de cada neurona y, de esta forma,
permiten aprender funciones no lineales con las que se definen modelos de discriminación
más complejos. En dependencia del tipo de arquitectura y del problema a resolver se pueden
utilizar distintos tipos de funciones de pérdida. Por ejemplo, para las capas intermedias u
ocultas de la red se suele utilizar la función ReLU, mientras que para la capa de salida
se suelen utilizar las funciones tangente hiperbólica, sigomide o lineal para problemas de
regresión, y la función softmax cuando se trata de problemas de clasificación.
2.1. ¿Qué es una CNN?                                                                             9

2.1.4.2 Entropía cruzada (crossentropy)
   Antes de hablar de la entropía cruzada, previamente se debe conocer que significa el término
entropía. En el mundo de la teoría de la información, a la entropía se le conoce como la medida
de incertidumbre a las posibles variables de resultado. De forma que, la entropía es máxima
cuando todas las diferentes clases están igualmente distribuidas en cantidad, por el contrario,
la entropía es mínima cuando solo una de las clases aparecen en el conjunto de datos que se
entrena. Esta definición de la entropía fue presentada por Claude Shannon en 1948.
   Conociendo el término entropía, se procede a definir en qué consiste la entropía cruzada
en redes neuronales. La entropía cruzada compara la probabilidad de cada clase (que ha
sido previamente devuelta por la red neuronal mediante la función softmax) con la clase real
(teniendo esta clase las mismas dimensiones que los valores devueltos por la función softmax,
un array de 2 posiciones en este caso, en el que la clase correcta tendrá el valor 1 y la incorrecta
el 0), calculando la pérdida de forma que penaliza la probabilidad según la lejanía que esta
tenga con el valor esperado. Esta pérdida tiene forma logarítmica por lo que se genera una
pérdida grande para las diferencias grandes cercanas al 1 y una pérdida pequeña para las
diferencias pequeñas que tienden a 0.
   Esta pérdida es utilizada para ajustar los pesos de la red durante el entrenamiento, consi-
guiendo así hacer mínima esta misma. Por lo tanto, un modelo perfecto tendrá una entropía
igual a 0.
   La entropía cruzada se define de la siguiente forma:

                                                ∑
                                                n
                                      LCE = −          ti log(pi )
                                                 i=1

Siendo n el numero de clases, ti el valor real de la clase i y pi la probabilidad de que el
elemento pertenezca a la clase i devuelta por la función softmax.

2.1.4.2.1 Entropía cruzada categórica (categorical crossentropy) La entropía cruzada ca-
tegórica es una ampliación de la función de la entropía cruzada adaptada a problemas en los
que se tienen que clasificar los datos en más de dos conjuntos.
3 Herramientas y recursos
  En este apartado se exponen todas las herramientas utilizadas para realizar este trabajo.

3.1 Tecnologías
  Hoy en día existen un gran número de tecnologías a nuestra disposición para trabajar con
redes neuronales, a continuación se detallan las que han sido seleccionadas para realizar este
trabajo y el por qué de su elección.

3.1.1 Python
   Este es un lenguaje de programación interpretado que, como vamos a ver más adelante,
tiene un gran número de herramientas para trabajar con redes neuronales. Aunque no sea el
lenguaje con el que mayor rendimiento se obtiene (para ello utilizaríamos lenguajes de más
bajo nivel, como C++) nos permite un prototipado rápido y flexible en lo que construcción
y análisis de redes neuronales se refiere.

3.1.1.1 NumPy

  Esta es una biblioteca para Python que nos permite operar con vectores y matrices de
grandes dimensiones de una manera más cómoda y sencilla que la que permite Python por
defecto. A parte, nos ofrece una gran cantidad de funciones matemáticas predefinidas para
operar con estas matrices.

3.1.1.2 Matplotlib

  De esta librería utilizamos sobretodo la estructura de datos ndarray, ya que permite crear
matrices optimizadas (en cuanto a tamaño y rendimiento) en comparación con el rendimiento
de Python nativo.

3.1.1.3 TensorFlow

  TensorFlow o TensorFlow (TF) es una biblioteca de código abierto para Python que fue
desarrollada por Google. Incorpora un gran número de herramientas para construir y entrenar
redes neuronales con gran flexibilidad.
  TF además permite ejecutarse en tarjetas gráficas o Graphics Processing Unit (GPU)s (por
sus siglas en inglés Graphics Processor Unit), por lo que podemos acelerar enormemente el
proceso de entrenamiento de nuestra red.

                                                                                           11
12                                                                 Herramientas y recursos

3.1.1.4 Keras
  Keras, al igual que las anteriores, es una librería de código abierto escrita en Python que
puede ejecutarse basándose en varias tecnologías de DL de más bajo nivel. En el caso de este
trabajo se utilizará apoyándose en TF.
  Esta librería nos facilita la creación de redes neuronales ya que cuenta con varios bloques
preestablecidos con los que podemos trabajar directamente (como las capas, funciones de
activación, etc.), si se trabajara únicamente con TF muchos de estos bloques deberían de
programarse desde cero.
  Esta librería nos proporciona dos formas de trabajar, la Application Programming interface
(API) secuencial y la funcional que es la que se utiliza en este trabajo.

3.1.1.5 SciKit Learn
  Es una librería de código abierto escrita en y para Python, que contiene varias herramientas
de data science, como algoritmos de clasificación y reordenación, los cuales se utilizan en este
proyecto.

3.1.1.6 Jupyter Notebook
  Se trata de una aplicación con estructura cliente-servidor creada por la organización sin
ánimo de lucro Proyecto Jupyter, que permite crear y ejecutar archivos basado en celdas que
pueden contener distinta información, como: código, texto enriquecido, fórmulas matemáticas,
etc.
  Del lado del cliente es accesible por cualquier navegador web moderno, por lo que podemos
modificar y ejecutar los notebooks de forma remota en el servidor donde esté instalada la
versión servidor de Jupyter Notebook.
  Esta aplicación es compatible con una gran variedad de lenguajes de programación como
C++, JavaScript, R, entre otros. Esto es posible ya que cuenta con más de 50 interpretes,
aunque nosotros utilizaremos el interprete por defecto (IPython) ya que vamos a trabajar
con Python.

3.1.1.7 Google Colaboratory
  Esta es una plataforma web desarrollada por Google que nos permite editar y ejecutar
Jupyter Notebooks directamente desde la web, sin necesidad de tener nada instalado excepto
un navegador compatible con JavaScript, puesto que todo el código se ejecuta en servidores
de Google.
  Es importante recalcar tres características que hacen de Google Colaboratory una herra-
mienta de gran valor para la realización de este trabajo:
     • Compartición y edición colaborativa de proyectos: Permite compartir el proyecto
       con otras cuentas de Google e incuso editarlo al mismo tiempo.
     • Conexión sencilla con Google Drive: Nos permite guardar los archivos con los
       datos devueltos por la red neuronal de una forma rápida y sencilla.
     • Acceso a GPUs: Permite conectarse a servidores de Google que tienen GPU, por lo
       que podemos acelerar el entrenamiento de la red considerablemente.
3.2. Datasets                                                                                13

3.2 Datasets
   Para el estudio del desbalanceo se han utilizado tres datasets, dos en los que hay un gran
número de imágenes que contienen caracteres numéricos y otro que está formado por miles
de caracteres alfabéticos manuscritos escaneados.
   De estos datasets se han seleccionado dos pares de clases para clasificar. En cuanto a las
cifras se han seleccionado los pares:

  • 3y5

  • 7y9

Las letras seleccionadas para ser clasificadas son las siguientes:

  • CyG

  • VeY

  Se han seleccionado estos pares puesto que se considera que son los caracteres que más se
parecen entre sí visualmente, por lo tanto, serán los más difíciles de diferenciar por la red
neuronal.

3.2.1 MNIST
  Modified National Institute of Standards and Technology database, se trata de una base
de datos creada por Chris Burges y Corinna Cortes que contiene 60000 muestras de entrena-
miento y 10000 muestras de validación de caracteres numéricos escritos a mano.
  Las muestras son imágenes binarias (únicamente tienen dos niveles de color, blanco y negro)
con un tamaño de 28x28 píxeles, en las que el dígito se encuentra centrado en la imagen.

Figura 3.1: Imágenes de muestra del conjunto de validación de MNIST. Fuente: Wikipedia (s.f.-b)

  Esta base de datos es ampliamente utilizada en el entrenamiento de redes neuronales debido
a su gran cantidad de muestras y la diversidad entre ellas.
14                                                               Herramientas y recursos

3.2.2 NIST
   Se ha seleccionado la Special Database 19 del National institute of Standards and Techno-
logy, que consta de 810000 imágenes de caracteres escritos por 3600 personas diferentes, con
lo que obtenemos una gran heterogeneidad en los datos. En esta base de datos se encuentran
letras en minúsculas y mayúsculas, pero en el trabajo se han utilizado únicamente letras
mayúsculas, que son en las que se encuentran las similitudes.

3.2.3 USPS
   Se trata de un dataset recopilado por J.J. Hull en 1994 y está formado por imágenes de
cifras escaneadas de sobres del U.S. Postal Service, de ahí el nombre del conjunto. Es un
dataset que cuenta con 7291 muestras de entrenamiento y 2007 muestras de validación. Está
conformado por imágenes en escala de grises con una resolución espacial de 16x16 píxeles.

3.3 Setup
  Se han utilizado las siguientes versiones de las herramientas previamente mencionadas:

                         Especificaciones del entorno   de ejecución
                       Sistema operativo                 Ubuntu 18.04
                       Versión de Python                 3.7.11
                       Versión de Jupyter Notebook       5.2.2
                       Versión de NumPy                  1.19.5
                       Versión de matplotlib             3.2.2
                       Versión de TensorFlow             2.5.0
                       Versión de Keras                  2.5.0
                       Versión de SciKit Learn           0.22.2.post1
4 Desarrollo
   En este apartado se describe la arquitectura de la red utilizada, los problemas que presenta
y, por último, las posibles soluciones que se han aplicado para mejorar el rendimiento de la
red.

4.1 Arquitectura
  La arquitectura de red que se ha utilizado para realizar este proyecto es la de una CNN o
red neuronal convolucional, puesto que es la más indicada para el reconocimiento de imágenes.
  La estructura de las CNN se divide en dos etapas, como ya se ha visto previamente en el
marco teórico. La etapa de extracción de características y la etapa de clasificación.

4.1.1 Etapa de extracción de características
   En esta primera etapa convolucional, se ha utilizado una red bastante simple debido a que
las imágenes de los dataset son sencillas y de una resolución baja, además estas imágenes se
encuentran en escala de grises por lo que se simplifica el proceso al contar solo con un canal
para los colores, en lugar de los 3 que se utilizarían en caso de tener imágenes en color.
   Primeramente, encontramos la capa de entrada (Input en keras), a la que se le indica
la forma (shape) que deben tener los datos de entrada. En este caso, se utilizan 3 formas
distintas para los 3 datasets:
  • MNIST: Al tener imágenes en escala de grises y de 28x28 píxeles, indicaremos la forma
    (28, 28, 1), siendo la primera dimensión el número de píxeles de ancho, la segunda el
    número de píxeles de alto, y la tercera y última dimensión se refiere al número de canales
    que utiliza la imagen.
  • NIST: Igualmente, se tienen imágenes en escala de grises pero en este caso de 32x32
    píxeles, por lo que se indica la forma (32, 32, 1).
  • USPS: Como en los dos casos anteriores, las imágenes de este dataset se encuentran
    en escala de grises, pero esta vez la resolución espacial es de 16x16 píxeles, por lo que
    la forma pasada a la red es (16, 16, 1).
  A continuación de esta capa, se sitúa una primera capa convolucional (Conv2D en Keras),
en la que se indica como primer parámetro (filters) la cantidad de filtroso kernels en la
convolución, para este caso se ha seleccionado 8 como valor. El siguiente parámetro es el
tamaño del núcleo o kernel_size,para el que se ha utilizado un núcleo 3x3. Por último se pasa
por parámetro la función de activación, en este caso ReLU.
  Posteriormente, se añade una capa de reducción de muestreo, en concreto, se ha utilizado
MaxPooling2D, en la que se indica que el tamaño de la ventana sobre el que tomar el máximo,
en este caso se selecciona 2x2.

                                                                                            15
16                                                                                 Desarrollo

  Una vez finalizado este ciclo de convolución, se repite la misma estructura una segunda
vez, estableciendo esta vez en la capa de convolución la cantidad de filtros a 2.
  Por último, para que la etapa de clasificación pueda leer los datos que ha manipulado la
etapa de extracción de características se deben de aplanar los datos, por ello se utiliza la capa
Flatten de Keras.

4.1.2 Etapa de clasificación
  En el caso que se está tratando, únicamente se necesita una capa en la etapa de clasificación
(es decir, en la parte final de la red), ya que se trata un problema básico.
  Para esta etapa, se utiliza una capa densa, es decir, que todas las neuronas de esta capa
están conectadas con todas las salidas de las neuronas de la capa anterior. Además, en esta
capa se utiliza la función de activación softmax. Esta función devuelve las probabilidades
para cada clase en un array de la siguiente forma: [0.95, 0.05], siendo 95% la probabilidad de
que la imagen tratada sea de la clase 1 y 5% de que, por el contrario, pertenezca a la clase 2.

4.1.3 Red implementada en Keras
  En el siguiente fragmento de código se puede encontrar la red neuronal previamente descrita
implementada con la API funcional de Keras.

Código 4.1: Red implemennatda en Keras
 1   input = Input(shape=input_shape)
 2
 3   x = Conv2D(4, kernel_size=(3,3), activation=”relu”) (input)
 4   x = MaxPooling2D(pool_size=(2,2)) (x)
 5
 6
 7   x = Conv2D(2, kernel_size = (3,3), activation=”relu”) (x)
 8   x = MaxPooling2D(pool_size=(2,2)) (x)
 9
10   x = Flatten() (x)
11
12   output = Dense(2, activation=’softmax’)(x)
13
14   model = Model(inputs = input, outputs = output, name=”modelo”)

4.2 Pipeline del script
  Para implementar esta red previamente descrita y experimentar con ella se ha creado un
script en Python compuesto por los siguientes pasos:

4.2.1 Inicialización de parámetros
  En este paso, se inicializan todos los parámetros que van a ser posteriormente utilizados
por el script. Para manipularlos y editarlos con mayor facilidad se crean una serie de controles
de Jupyter Notebook que permiten modificar estos datos más fácilmente.
 Posteriormente, se explica la función de cada uno de estos parámetros:
4.2. Pipeline del script                                                                    17

                      Figura 4.1: Captura del formulario de parámetros

  • DBNAME: Se trata de una variable que contiene el nombre del dataset utilizado,
    posteriormente servirá para indicar qué dataset debe ser utilizado.
  • FILTER: Esta variable consiste en un array de dos posiciones que contiene las dos
    clases que se quieren comparar, por ejemplo, si se desean clasificar los números 3 y 5,
    el array contendrá el 3 en la posición 0 y el 5 en la posición 1, de esta forma [3,5].
  • CHAR_TO_SKEW: En este parámetro se indica el número/carácter que se desea
    desbalancear, siguiendo el ejemplo anterior, si se indicada el 3, esta sería la clase mino-
    ritaria en el dataset que se envía a la red.
  • PERCENT: Esta variable indica qué porcentaje (en tanto por 1) de la clase minoritaria
    se desea mantener, de forma que si se indica un 1 ambas clases tendrán la misma
    cantidad de imágenes, y si se indica un 0 se eliminarán todas las imágenes de la clase
    minoritaria.
  • EPOCHS: Esta variable indica durante cuantas épocas se desea entrenar la red. Tras
    varios ensayos, se decidió que lo óptimo es indicar 50 ya que se probó con 100 épocas,
    lo que provocaba overfitting (se producía un sobreentrenamiento en la red) y con 10
    épocas, lo que provocaba un underfitting (la red no estaba lo suficientemente entrenada).
    Por ello, en todos los entrenamientos este parámetro se mantendrá en 20.
  • BATCH_SIZE: Esta variable contiene el tamaño del lote que se enviará a la red,
    es decir, cuantas imágenes se utilizarán en cada paso para ajustar los pesos de la red
    durante el entrenamiento. Se decidió dejar este parámetro en 16 puesto que es un
    número razonable teniendo en cuenta el tamaño total de los datasets que se utilizan.
    Se una ventaja trabajar con lotes pequeños ya que la red necesita menos memoria y
    generalmente las redes entrenan más rápido.
  • DATA_AUGMENTATION: Este parámetro es utilizado para activar o desactivar
    el aumentado de datos, que es una de las soluciones que se propondrán en el apartado
    4.3.1.
18                                                                                 Desarrollo

     • CLASS_WEIGHT: Este parámetro es utilizado para activar o desactivar el class
       weight, que es una de las soluciones que se propondrán en un apartado posterior.

4.2.2 Descarga del dataset

  Una vez se han inicializado todos los parámetros necesarios para el correcto funcionamiento
del experimento, se descarga el dataset que previamente ha sido seleccionado en el formulario.
  En este bloque también se inicializa la semilla de Numpy para que todos los números
aleatorios que se generen en el script sean los mismos en las diferentes pruebas realizadas.
  Y por último, se muestra por pantalla la forma del dataset descargado y algunos ejemplos
de este, como se puede ver en la siguiente imagen.

            Figura 4.2: Algunas muestras del dataset USPS y las dimensiones de este.

4.2.3 Preparación y desbalanceo de los datos

   Como se puede ver en la figura 4.2 el dataset que se ha descargado en este momento
aun cuenta con todos los dígitos, por lo que en este paso se reduce el dataset guardando
solo los dígitos que han sido seleccionados en la variable FILTER previamente mencionada.
Seguidamente, después de ”filtrar” el dataset para dejar únicamente las clases que interesan,
se pasa a reducir el tamaño de la clase minoritaria. Para ello, primeramente se utiliza la
función shuffle que nos brinda la librería sklearn, que permite mezclar aleatoriamente las
imágenes del array. Posteriormente se devuelven las primeras posiciones del array hasta llegar
a la cantidad deseada, que se calcula multiplicando la variable PERCENT por el tamaño del
array que contiene las imágenes de la clase minoritaria. Por último, se formatean los datos
tal y como los debe recibir la red neuronal. convirtiendo las etiquetas de los datos de integer
encoding a one-hot encoding, es decir, se pasa de tener el valor del número a tener un array
binario en el que el 1 representa la posición del valor correcto, como se expone en la siguiente
tabla que representa el número 3 en ambas codificaciones.

                  Integer encoding                One-hot encoding
                          3              0   0   0 1 0 0 0 0            0   0

  Por lo tanto, se pasa de tener un array con los valores, a tener una matriz con la configu-
ración mencionada anteriormente. Para ello se utiliza la función to_categorical de la librería
keras.utils.
4.3. Soluciones propuestas                                                                   19

4.2.4 Entrenamiento de la red
  Una vez se tienen los datos tal y como se necesitan para enviar a la red neuronal, se
procede a la creación y al entrenamiento de esta. Esta red neuronal tiene la estructura descrita
previamente en la sección 4.1.

4.2.5 Evaluación
  Cuando la red ya está entrenada se hace una predicción con el conjunto de test para ser
evaluada y posteriormente se utiliza la función classification_report de sklearn.metrics para
mostrar de una forma más amigable los resultados de la red con el conjunto de test.

4.3 Soluciones propuestas
   Como se ha comentado en varias ocasiones previamente, cuando una red de este tipo es
entrenada con dos clases de las que se dispone un número de muestras muy diferente tiende
a identificar todas las muestras como las de la clase mayoritaria, dejando así gran número de
muestras de la clase minoritaria etiquetadas como pertenecientes a la clase mayoritaria.
   Con el fin de intentar mejorar el rendimiento de esta red, se proponen dos técnicas distintas
a aplicar.

4.3.1 Aumentado de datos
   Esta solución consiste en generar imágenes a partir de las que ya se tienen. En este caso se
propone generar solo de la clase minoritaria, con el fin de equilibrar las dos clases para que
la red funcione correctamente.
   El proceso consta de los siguientes pasos:

  1. Se aíslan en un array todos los elementos de la clase minoritaria.

  2. Se inicializa el generador de imágenes (ImageDataGenerator) de la librería keras.preprocessing.image.

  3. Se genera un iterador que continene una tupla con la imagen modificada y la clase a la
     que pertenece (label).

  4. Se itera y se guarda el contenido devuelto por el iterador en el array descrito en el paso
     1.

  5. Si el tamaño del array de la clase minoritaria es igual al de la clase mayoritaria se pasa
     al siguiente paso, de lo contrario se vuelve al paso 4.

  6. Por último, se une el array con la clase minoritaria al que contiene la clase mayoritaria
     y se reordena aleatoriamente.

Una vez finaliza este proceso, el conjunto de datos ya se encontraría balanceado y listo para
ser enviado a la red neuronal.
  El generador de imágenes previamente comentado normalmente se utilizaría en tiempo real
en la ejecución de cada lote de datos en la red neuronal, pero en este caso se deben generar
previamente las imágenes, puesto que solo se desean generar imágenes de una clase.
20                                                                                Desarrollo

  Este generador de imágenes consiste realmente en modificar de forma aleatoria las imáge-
nes que se tienen de la clase minoritaria mediante las siguientes transformaciones: traslación,
rotación, escalado y desencajado (shear). Estas cuatro transformaciones se realizan dentro de
unos límites enviados por parámetro al inicializar la clase. Para este trabajo se han seleccio-
nado los siguientes parámetros:

     • rotation_range: 15

     • width_shift_range: 0.2

     • height_shift_range: 0.2

     • shear_range: 0.1

     • zoom_range: 0.1

Estos parámetros han sido seleccionados ya que, tras diversas pruebas con las imágenes se ha
observado que son los parámetros óptimos para los datos con los que se ha trabajado.

4.3.2 Pesos de clase
  Esta técnica consiste en indicar a la red neuronal un peso para cada clase, de esta forma
la red neuronal prestará más atención a la clase que tenga un peso más alto. Para ello,
primeramente, estos pesos deben ser calculados mediante la siguiente fórmula de regresión
logística ponderada.
                                                   s
                                        Wj =
                                                (c ∗ sj )
  Siendo:

     • Wj el peso de la clase j

     • s el número total de muestras

     • c el número total de clases

     • Sj el número de muestras de la clase j

  Estos pesos son utilizados en el cálculo de la pérdida, ya que una vez se ha calculado la
pérdida de cada clase, esta es multiplicada por el peso indicado de la misma. De esta forma
conseguimos ”balancear” la importancia de ambas clases al entrenar la red.
  Para la implementación en Python se ha utilizado primeramente la función compute_class_weight
de sklearn.utils.class_weight, que permite automatizar el proceso de cálculo de los pesos para
cada clase. Y posteriormente, se han enviado como parámetros estos datos formateados como
diccionario.
4.4. Métricas utilizadas en el estudio                                                     21

4.4 Métricas utilizadas en el estudio
  En esta sección se exponen las métricas que se han tenido en cuenta para realizar la
experimentación de este trabajo.
  Para comenzar, antes de explicar las métricas, deben quedar claros los siguientes conceptos:

  • Verdaderos positivos (TP): Son los resultados que la red ha predicho correctamente y
    en los que se indica que una muestra pertenece al conjunto que se le ha predicho. Por
    ejemplo, si la red predice que una imagen de muestra del número 3 pertenece a la clase
    3.

  • Verdaderos negativos (TN): Son los resultados que la red ha predicho correctamente y
    en los que se indica que una muestra no pertenece al conjunto descrito. Por ejemplo, si
    la red predice que una imagen de muestra del número 3 no pertenece a la clase 5.

  • Falsos positivos (FP): Son los resultados en los que la red actúa erróneamente y predice
    que una muestra corresponde a una clase que no es la real. Por ejemplo, si la red predice
    que una imagen de muestra del número 3 pertenece a la clase 5.

  • Falsos negativos (FN): Son los resultados en los que la red actúa erróneamente y predice
    que una muestra no corresponde a una clase que es la real. Por ejemplo, si la red predice
    que una imagen de muestra del número 3 no pertenece a la clase 3.

Se pueden clasificar estos términos en dos conjuntos, los dos primeros elementos están agrupa-
dos dentro del término de la sensibilidad y en cambio, los dos últimos encajan con el término
de especificidad.

4.4.1 Precisión
  Esta métrica permite medir la calidad del modelo y consiste como su propio nombre indica
en medir la precisión de las predicciones hechas por la red.
  Esta métrica es calculada de la siguiente forma:
                                                    TP
                                   P recision =
                                                  TP + FP
  Como se puede ver, en esta métrica únicamente se tienen en cuenta los positivos por lo que
esta indica la proximidad de las distintas medidas entre sí.

4.4.2 Exhaustividad(Recall)
  Esta métrica permite medir la cantidad de elementos que el modelo es capaz de identificar.
  Esta métrica es calculada de la siguiente forma:
                                                 TP
                                    Recall =
                                               TP + FN
  Permite identificar la cantidad de verdaderos positivos que la red consigue predecir.
22                                                                               Desarrollo

4.4.3 Valor-F(F1)
   Esta es la métrica más importante que encontramos en este estudio debido a la disparidad
en la cantidad de datos de los conjuntos a diferenciar. Esta métrica es una combinación de
las dos anteriores en un solo valor, lo cual permite obtener una comparación más sencilla del
recudimento combinado entre las dos métricas anteriores.
   Esta métrica es calculada como un valor único ponderado de la precisión y la exhaustividad:
                                       2 ∗ P recision ∗ Recall
                                F1 =
                                        P recision + Recall
5 Resultados
  En este capítulo se van a exponer los diferentes experimentos realizados para los 3 datasets
con el fin de resolver el problema planteado en este proyecto.

5.1 Casos contemplados
   Para comenzar a exponer la experimentación y sus resultados previamente se van a detallar
todas las casuísticas estudiadas y los porcentajes de desbalanceo utilizados para el estudio.
   En primer lugar, se debe aclarar que se ha realizado la misma experimentación que se va
a describir a continuación para los 3 datasets que son caso de estudio.
   Para estudiar este problema, en cuanto a desbalanceo se refiere, primeramente se ha rea-
lizado un entrenamiento con las clases de estudio totalmente balanceadas, es decir, con el
mismo número de elementos, para comprobar que la red neuronal se comporta correctamente
y para poder comparar los resultados con los de los siguientes experimentos.
   Una vez realizado este entrenamiento con los datos totalmente balanceados, se hace un
estudio con los siguientes porcentajes: 10, 1, 0.5, 0.1.
   Previamente en el estudio, se concretó que los porcentajes utilizados serían los siguientes:
100, 80, 60, 40, 20. Pero se optó por modificarlos y considerar desbalanceos todavía más
drásticos ya que la red se comportó mucho mejor de lo esperado con desbalanceos leves.
   Por otro lado, en cuanto a las clases seleccionadas para el estudio, las podemos dividir en
dos según la naturaleza del dataset.

  • Caracteres numéricos, en lo que respecta a este conjunto, se han seleccionado para
    estudio los siguientes pares de clases:
        – 3-5
        – 7-9

  • Caracteres alfabéticos, para este tipo de caracteres se han seleccionado los siguientes
    pares:
        – C-G
        – V-Y

  Estos conjuntos han sido seleccionados debido a que presentan grandes similitudes en la
apariencia de su escritura a mano.
  Se realizarán 2 conjuntos de pruebas de todos los pares. En la primera de ellas, el primer
valor del conjunto será la clase minoritaria y en la segunda prueba el segundo valor será el
que contenga menos elementos.

                                                                                            23
24                                                                                        Resultados

5.1.1 Hiper-parámetros utilizados
  En todos los casos de este estudio se han utilizado los mismos hiper-parámetros con el fin
de que todos los resultados obtenidos sean comparables entre sí. Únicamente se ha cambiado
un parámetro, el class weigths, que solo es utilizado en la solución propuesta con el mismo
nombre.
  Estos hiper-parámetros son los siguientes:

      • Número de épocas = 50

      • Batch size = 16

      • Learning rate = 0.001

      • Optimizador = Adam

      • Validation split = 0.2

   Algunos de estos parámetros, fueron previamente explicados en la sección 4.2.1, el resto de
parámetros se expondrán a continuación.
   En lo que respecta al optimizador, este hace referencia al algoritmo de aprendizaje utili-
zado durante el entrenamiento del modelo. El algoritmo de aprendizaje utilizado es conocido
como descenso del gradiente y Adam (ADAptative Moment stimation) es un optimizador
del descenso del gradiente, que en realidad es una combinación de otros dos optimizadores,
Adagrad y RMSProp. Es un algoritmo eficiente y que utiliza poca memoria, por lo que es
uno de los optimizadores más popoulares de la actualidad.
   En cuanto al learning rate, este valor nos permite ajustar el factor de error que se corrige
en cada iteración del entrenamiento, de forma que, cuanto más pequeño es el valor, más lento
entrena la red y cabe la posibilidad de que quede atrapada en un mínimo local y por lo
tanto no pueda encontrar su ”pérdida mínima”. Por el contrario, si el valor es muy grande,
la red podría no encontrar nunca el mínimo global, ya que daría saltos muy grandes y nunca
convergería.1
   Ejemplos de learning rate realizados en An Interactive Tutorial on Numerical Optimization
   Por último, el validation split se refiere a que porcentaje del conjunto de entrenamiento se
desea utilizar como conjunto de validación al final de cada época. En Keras, al indicar este
porcentaje, se extraerá la cantidad de elementos correspondiente al porcentaje seleccionado y
ese conjunto no será utilizado para el entrenamiento, únicamente se utilizará como validación
al final de cada época.

5.2 Estructura de los resultados
   A continuación de esta sección, se van a mostrar una serie de gráficos y resultados cuya
estructura va a ser expuesta en este apartado. Por un lado se mostrarán gráficos de las medias
de la métrica F1 entre las clases comparadas, la media está compuesta por la métrica f1 de
la clase 1 cuando esta es minoritaria y la métrica F1 de la clase 2 cuando esta es minoritaria.
 1
     En las Figuras 5.1, 5.2 y 5.3 se ouede ver un ejemplo gráfico de esta explicación.
5.2. Estructura de los resultados                              25

                            Figura 5.1: Learning rate bajo

                          Figura 5.2: Learning rate correcto

                            Figura 5.3: Learning rate alto
26                                                                                        Resultados

Correspondiendo la clase 1 al primer elemento de los conjuntos anteriormente mencionados
y la clase 2 al segundo elemento.
   Por otro lado, se mostrarán gráficos de precisión y errores de los conjuntos de entrenamiento
y los de validación de cada época. En ellos, se podrá apreciar como, una vez entrenada la
red los resultados en estos datos cuando las clases están desbalanceadas siguen siendo buenos
en algunos casos, eso se debe a que el conjunto de validación por época es un subconjunto
del de entrenamiento, por ello este conjunto también tendrá este desbalanceo, por lo tanto,
la mayoría de sus muestras corresponderán a la clase predominante y por ello acertará la
mayoría y, por consecuencia, se obtendrán buenos resultados.

5.3 Modelo base sin balancear
  La primera prueba realizada en el proyecto, consiste en entrenar a la red sin aplicar ninguna
de las soluciones que previamente se han descrito para comprobar como se comporta la red sin
ningún tipo de modificación y así poder comparar los resultados con las soluciones aplicadas
posteriormente.

5.3.1 Resultados del entrenamiento
5.3.1.1 MNIST

(a) Gráfica de la métrica F1 de las clases 3 y 5 de (b) Gráfica de la métrica F1 de las clases 7 y 9 de
    MNIST utilizando el modelo base.                    MNIST utilizando el modelo base.

                Figura 5.4: Gráficas del dataset MNIST utilizando el modelo base.

   Como se puede ver en la Figuras 5.4a y 5.4b con este conjunto de datos la red se ha
comportado realmente bien aun con un desbalanceo muy notable, esto es debido a que este
dataset es realmente grande por lo que al dejar un pequeño porcentaje de la clase minoritaria,
la red sigue teniendo suficientes muestras como para poder entrenarse de una forma correcta
y ofrece un rendimiento muy notable.
   Aun así, se puede observar que cuando la cantidad de muestras es realmente pequeña,
algunas decenas, la red deja de clasificar correctamente ya que no tiene las muestras suficientes
como para poder diferenciar correctamente ambos conjuntos.
También puede leer