Redes Neuronales

Python Machine Learning

Notebooks y Scripts de Python utilizando la libreria Tensorflow para entrenar y probar modelos de Aprendizaje Automatico.

Maxi Galoto
2022-06-28

react

Inicio



Aprendizaje Automatico

Volver al Inicio



Cualquier técnica que permita que la computadora replique de alguna forma procedimientos característicos de la inteligencia humana está encuadrada dentro de lo que llamamos inteligencia artificial.

Machine Learning es un subconjunto de metodologías de inteligencia artificial que permite a las computadoras aprender con la experiencia, estos algoritmos son capaces de identificar patrones en conjuntos masivos de datos y de realizar análisis predictivos.

Dentro del Machine Learning hay un subconjunto llamado Brain-inspired que se basan principalmente en modelos y métodos que se replican el mecanismo del cerebro.

Las redes neuronales son modelos simplificados que emulan el modo en el que el cerebro procesa la información, funciona basado en un número elevado de unidades de procesamiento simultaneas interconectadas que son versiones artificiales de las neuronas, y se organizan en capas.

El deep learning es un subconjunto de las redes neuronales, lleva a cabo un proceso de machine learning utilizando una red neuronal artificial.

El siguiente repositorio contiene trabajos sobre entrenamiento de modelos con redes neuronales utilizando la librería Tensorflow

Introduccion

Volver al Inicio



En este post voy a compartir un acceso directo al repositorio en done se encuentra un trabajo sobre Redes Neuronales. Se utilizo el data set cifar sobre imágenes para entrenar la Red y luego poder predecir los resultados.

El dataset CIFAR (Canadian Institute for Advanced Research) es una colección de conjuntos de datos ampliamente utilizados en el campo del Aprendizaje Automático y la Visión por Computadora. CIFAR tiene varias variantes, pero la más comúnmente conocida y utilizada es CIFAR-10.

CIFAR-10 consta de 60,000 imágenes a color de 32x32 píxeles, divididas en 10 clases distintas. Cada clase contiene 6,000 imágenes. Las 10 clases son:

El dataset CIFAR-10 se utiliza con frecuencia como un punto de referencia para probar algoritmos y modelos de Aprendizaje Automático, en particular para tareas de clasificación de imágenes. Debido a su tamaño relativamente pequeño y su variedad de clases, CIFAR-10 se considera un desafío adecuado para evaluar la capacidad de los modelos para reconocer y clasificar objetos en imágenes.

Además de CIFAR-10, también existe CIFAR-100, que contiene 100 clases distintas con 600 imágenes cada una. CIFAR-100 se utiliza para tareas de clasificación más fina y detallada.

Ambos conjuntos de datos CIFAR están ampliamente disponibles y se pueden descargar desde el sitio web oficial de CIFAR o a través de bibliotecas y frameworks de Aprendizaje Automático, como TensorFlow y PyTorch, que proporcionan funciones para cargar y utilizar estos conjuntos de datos en tus proyectos de redes neuronales.

cifar10.load_data()

El modelo base incluye muy pocos hyperparametros para ver sus resultados y compararlos con el ultimo modelo en donde se agregan Max Poolings, Batch Normalization, DropOut (Dismunuir el Sobre-Ajuste), Pooling y Data Augmentation.

Hyperparametros de Data Augmentation:

Los hiperparámetros de Data Augmentation son configuraciones que se utilizan para aplicar transformaciones a las imágenes durante el entrenamiento de un modelo de redes neuronales. Estas transformaciones se aplican de forma aleatoria y ayudan a aumentar la cantidad y la diversidad de datos de entrenamiento, lo que puede mejorar el rendimiento y la capacidad de generalización del modelo.

Rotación: La rotación implica girar la imagen en un cierto ángulo.

Desplazamiento: El desplazamiento se refiere a mover la imagen en una dirección específica, ya sea hacia los lados (izquierda/derecha) o hacia arriba/abajo. Esto puede simular variaciones en la posición del objeto en la imagen. Al igual que con la rotación, se pueden configurar rangos de desplazamiento y se aplicará un desplazamiento aleatorio a cada imagen durante el entrenamiento.

Brillo: El ajuste de brillo implica cambiar el nivel de iluminación de la imagen. Esto puede ser útil para simular diferentes condiciones de iluminación en las que las imágenes pueden ser capturadas. Al igual que con las transformaciones anteriores, se puede especificar un rango de valores de brillo y durante el entrenamiento, se aplicará un cambio de brillo aleatorio a cada imagen.

Zoom: El zoom implica ajustar el nivel de zoom de la imagen, es decir, ampliar o reducir la imagen. Esto puede ayudar a simular diferentes distancias de captura de imágenes o variaciones en el tamaño del objeto de interés. Al igual que con las transformaciones anteriores, se puede especificar un rango de valores de zoom y se aplicará un zoom aleatorio a cada imagen durante el entrenamiento.

Early stopping:

Early stopping es un proceso que detiene el entrenamiento de la Red Neuronal cuando una de las metricas seleccionadas no tiene mas performance, es decir, no mejora por mas que se incrementen las epocas. Se puede poner como variable la metrica y la cantidad de epocas maximas.

Batch Normalization:

Dentro de las capas ocultas se pueden hacer normalizaciones en cada una de ellas a lo largo del entrenamiento. Los pesos estan variando constantemente en el transcurso de las epocas a lo largo de la Red Neuronal, estos valores se pueden estandarizar dentro de las mismas capas ocultas. Este proceso se llama Batch Normalization.

Estas técnicas de Data Augmentation son especialmente útiles cuando el conjunto de datos de entrenamiento es limitado, ya que permiten generar nuevas muestras a partir de las existentes, introduciendo variaciones realistas que ayudan al modelo a generalizar mejor a nuevos ejemplos. Al aplicar estas transformaciones de manera aleatoria, el modelo se expone a una mayor diversidad de imágenes, lo que puede mejorar su capacidad para reconocer y clasificar objetos en diferentes condiciones.

DropOut y Pooling:

Dropout es una técnica de regularización utilizada en redes neuronales para reducir el sobreajuste (overfitting). Consiste en desactivar aleatoriamente un porcentaje de las neuronas en una capa durante el entrenamiento. Al desactivar temporalmente estas neuronas, se evita que coadaptan y dependan demasiado de las neuronas vecinas, lo que ayuda a mejorar la generalización del modelo.

La idea detrás de Dropout es que al desactivar algunas neuronas durante el entrenamiento, el modelo se vuelve más robusto y no depende demasiado de neuronas específicas, lo que conduce a una mejor generalización y un menor riesgo de sobreajuste.

Pooling (agrupamiento) es una operación comúnmente utilizada en redes neuronales convolucionales para reducir la dimensionalidad de los datos espaciales. El pooling se realiza utilizando ventanas o filtros de tamaño fijo que se deslizan por la imagen o la salida de una capa convolucional y realizan una operación resumida en cada región cubierta por el filtro.

El objetivo del pooling es reducir la cantidad de parámetros y la complejidad computacional de la red, al mismo tiempo que se conservan las características más importantes de la imagen. Las operaciones más comunes de pooling son el Max Pooling y el Average Pooling.

El Pooling reduce la dimensionalidad espacial de las características y ayuda a hacer que el modelo sea más invariante a pequeñas variaciones en la posición de las características en la imagen. También contribuye a reducir el overfitting y el cálculo requerido en la red.

En resumen, Dropout y Pooling son técnicas que se utilizan en el entrenamiento de redes neuronales para reducir el sobreajuste y mejorar la generalización del modelo. Dropout desactiva aleatoriamente algunas neuronas durante el entrenamiento, mientras que Pooling reduce la dimensionalidad de las características espaciales en las capas convolucionales. Ambas técnicas son útiles para mejorar el rendimiento y la eficiencia de la red.

Librerias

Volver al Inicio



  • {Matplotlib}
  • {Seaborn}
  • {Scikit-Learn}
  • {Tensorflow}
  • {NLTK}
  • Inputs

    Volver al Inicio



    A continuación se muestra una parte del código que se utiliza para generar los inputs de las Redes Neuronales:

    class Model():
        def __init__(self):
            self.links = []
    
        def _colored(self, r, g, b, text):
            return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text)
          
        def _input(self):
            while True:
                modelo = input('\nDesea entrenar una Red Neuronal? (Si/No): \n')
                if modelo == 'No':
                    print('Muchas gracias\n')
                    break
                elif modelo == 'Si':
                    print('Excelente...')
                    scaler   = input('Desea escalar los valores? (Si/No)').lower()
                    neuronas = int(input(f'Ingrese la cantidad de Neuronas:'))
                    outputs  = int(input(f'Ingrese la cantidad de Outputs:'))
                    capas    = int(input(f'Ingrese la cantidad de Capas Ocultas:'))
                    epocas   = int(input(f'Ingrese la cantidad de Epocas:'))
                        
                if modelo == 'Si': break
                else:
                    print(self._colored(238, 75, 43, '\nADVERTENCIA: Por favor colocar (Si/No)\n'))
            if modelo == 'Si':
                diccionario = {'capas' : capas, 'neuronas' : neuronas, 'outputs': outputs, 'scaler' : scaler, 'epocas' : epocas}
                print(self._colored(238, 75, 43,f'La cantidad de Capas es: {capas}'))
                print(self._colored(238, 75, 43,f'La cantidad de Neuronas es: {neuronas}'))
                print(self._colored(238, 75, 43,f'La cantidad de Epocas es: {epocas}'))
                return diccionario
            else:
                return None

    Red Neuronal Plot

    Volver al Inicio



    
    def _plot_neuronal_net(ax, left, right, bottom, top, layer_sizes):
            n_layers = len(layer_sizes)
            v_spacing = (top - bottom)/float(max(layer_sizes))
            h_spacing = (right - left)/float(len(layer_sizes) - 1)
            # Nodes
            for n, layer_size in enumerate(layer_sizes):
                layer_top = v_spacing*(layer_size - 1)/2. + (top + bottom)/2.
                for m in range(0 , layer_size + 1):
                    circle = plt.Circle((n*h_spacing + left, 
                                         layer_top - m*v_spacing), 
                                        v_spacing/4.,
                                        color='w', 
                                        ec='k', 
                                        zorder=3)
                    ax.legend([circle], ['Inputs - Hidden Labels - Outputs'], loc='upper left')
                    ax.add_artist(circle)
            # Edges
            for n, (layer_size_a, layer_size_b) in enumerate(zip(layer_sizes[:-1], layer_sizes[1:])):
                layer_top_a = v_spacing*(layer_size_a - 1)/2. + (top + bottom)/2.
                layer_top_b = v_spacing*(layer_size_b - 1)/2. + (top + bottom)/2.
                
                for m in range(0 ,layer_size_a +1):
    
                    for o in range(0, layer_size_b + 1):
                        line = plt.Line2D([n*h_spacing + left, (n + 1)*h_spacing + left],
                                        [layer_top_a - m*v_spacing, layer_top_b - o*v_spacing], 
                                          c='b', alpha=0.3)
                        ax.add_artist(line)
    
    fig = plt.figure(figsize=(10, 10))
    ax = fig.gca()
    ax.axis('off')
    _plot_neuronal_net(ax, .01, .75, .05, .9, [10, 15, 15, 15, 15, 10])
    plt.title('Red Neuronal', loc = 'left', fontsize=16)

    Metrics

    Volver al Inicio



    Una de las métricas mas importantes para problemas de clasificación es el Accuracy. A continuación se muestra un código de ejemplo para poder visualizar los cambios de esta métrica a medida que se incrementan las épocas de la red neuronal sobre los datos de entrenamiento y testeo. Con este gráfico podemos visualizar lo bueno que es el modelo y si existe o no sobre-ajuste.

    
    def _get_plots(metricas_train, metricas_test, hyper_p, y_label = 'Metrics'):
        capas = hyper_p['capas']
        epocas = hyper_p['epocas']
        plt.figure(figsize = (8,5))
        plt.plot(
                metricas_train,
                color = 'blue', 
                linestyle = 'dashed', 
                marker = '*', 
                markerfacecolor = 'black', 
                markersize = 5,
                label = 'Training')
        plt.plot(
                metricas_test,
                color = 'red', 
                linestyle = 'dashed', 
                marker = '*', 
                markerfacecolor = 'black', 
                markersize = 5,
                label = 'Test')
        plt.title(f'Datos {y_label}', fontsize=16)
        plt.suptitle(f'Capas: {capas}, Epocas: {epocas}', fontsize=16)
        plt.xlabel('Epocas', fontsize=16); plt.ylabel(y_label, fontsize=16)
        leg = plt.legend(loc='upper left')
        return plt.grid(); plt.show()

    Repositorio

    Volver al Inicio