Proyecto Final – QM2515

Spread the love

Proyecto Guiado

¿Qué es una Red Neuronal?

Una red neuronal es un modelo computacional inspirado en el funcionamiento del cerebro humano. Está formada por unidades llamadas neuronas que trabajan en conjunto para procesar información. Las redes neuronales son un componente fundamental en el campo del aprendizaje automático y la inteligencia artificial.

¿Para qué Sirve?

Las redes neuronales se utilizan para abordar una amplia gama de problemas, desde reconocimiento de patrones hasta procesamiento de lenguaje natural y toma de decisiones. Pueden aprender patrones complejos y representaciones de datos, lo que las hace efectivas en tareas como reconocimiento de imágenes, traducción automática, juegos y más.

close up photography of yellow green red and brown plastic cones on white lined surface

¿Cómo se Usa una Red Neuronal?

El uso de una red neuronal implica varios pasos:

  1. Definición del Modelo: Se elige la arquitectura de la red, que incluye el número de capas y neuronas en cada capa. También se seleccionan funciones de activación y otros hiperparámetros.
  2. Recopilación de Datos: Se recopilan datos de entrenamiento que incluyen ejemplos de entrada y las salidas correspondientes. Cuantos más datos de calidad se tengan, mejor será el rendimiento del modelo.
  3. Entrenamiento: La red se entrena ajustando sus pesos y sesgos en función de los datos de entrenamiento. Se utiliza un algoritmo de optimización para minimizar la diferencia entre las predicciones del modelo y las salidas reales.
  4. Validación y Ajuste: Se utiliza un conjunto de datos de validación para evaluar el rendimiento del modelo durante el entrenamiento. Se ajustan los hiperparámetros según sea necesario para evitar el sobreajuste.
  5. Predicción: Una vez entrenada, la red neuronal puede realizar predicciones en nuevos datos de entrada sin etiquetar.

Partes de una Red Neuronal:

  1. Neurona: La unidad básica de una red neuronal. Recibe entradas, aplica una función de activación y produce una salida.
  2. Capa de Entrada: La capa inicial que recibe las características de entrada y las pasa a las capas ocultas.
  3. Capas Ocultas: Capas intermedias entre la entrada y la salida. Cada neurona en una capa oculta realiza operaciones complejas para aprender representaciones más abstractas de los datos.
  4. Capa de Salida: La capa final que produce las predicciones o resultados deseados. El número de neuronas en esta capa depende del tipo de problema (clasificación, regresión, etc.).
  5. Pesos y Sesgos: Parámetros ajustables que la red aprende durante el entrenamiento. Los pesos controlan la influencia de las entradas, y los sesgos proporcionan cierto grado de flexibilidad.
  6. Funciones de Activación: Funciones no lineales aplicadas a la salida de las neuronas. Introducen no linealidades en la red, permitiéndole aprender patrones más complejos.
  7. Función de Pérdida: Mide la diferencia entre las predicciones del modelo y las salidas reales durante el entrenamiento. El objetivo es minimizar esta pérdida.
  8. Optimizador: Algoritmo que ajusta los pesos y sesgos de la red para minimizar la función de pérdida durante el entrenamiento.
  9. Época y Lote: Una época es un pase completo a través de todo el conjunto de entrenamiento. Los datos se dividen en lotes para acelerar el entrenamiento mediante el uso eficiente de la memoria.
  10. Redes Neuronales Convolucionales (CNN) y Recurrentes (RNN): Variantes especializadas de redes neuronales diseñadas para tareas específicas como visión por computadora y procesamiento de secuencias, respectivamente.
  11. Backpropagation: Algoritmo utilizado para calcular los gradientes y ajustar los pesos de la red durante el entrenamiento.

Entender y utilizar una red neuronal implica una combinación de conocimientos teóricos, habilidades de programación y experiencia práctica. A medida que ajustas la arquitectura y los hiperparámetros, y experimentas con diferentes conjuntos de datos, puedes mejorar el rendimiento de la red en tareas específicas.

Conociendo las Neuronas

Neurona: Una Explicación con Matemáticas

Una neurona es la unidad básica de una red neuronal, y su funcionamiento se basa en la combinación lineal de entradas ponderadas, seguida de la aplicación de una función de activación no lineal. Aquí te proporcionaré una descripción detallada con las matemáticas asociadas:

Estructura de una Neurona:

Entradas ((x_1, x_2, …, x_n)): Representan las características o señales de entrada. Cada entrada está ponderada por un peso.

Pesos ((w_1, w_2, …, w_n)): Son parámetros ajustables que indican la importancia relativa de cada entrada para la neurona. Se asocia un peso a cada conexión de entrada.

Sumador Ponderado ((z)): La suma ponderada de las entradas y los pesos. Se calcula como:

$z=\sum_{i=1}^n(x_i\cdot w_i)+b$z=ni=1(xi​·wi​)+b

Donde (b) es el sesgo (un parámetro adicional que proporciona cierto grado de flexibilidad a la neurona). (Esto se parece mucho a una regresión Lineal)

Función de Activación ((f)):

Introduce no linealidad en la salida de la neurona. La salida de la neurona ((a)) se calcula aplicando la función de activación al sumador ponderado:

$a=f(z)$a=f(z)​

Matemáticas Detalladas:

Sumador Ponderado:

[𝑧=∑𝑖=1𝑛(𝑥𝑖⋅𝑤𝑖)+𝑏][z=i=1∑n​(xi​⋅wi​)+b]

(x_i) son las entradas.

(w_i) son los pesos asociados a las entradas.

(b) es el sesgo.

Función de Activación:

La función de activación introduce no linealidad y determina la salida de la neurona. [ a = f(z) ] Algunas funciones de activación comunes son la función sigmoide, la función tangente hiperbólica (tanh), y la función de rectificación lineal (ReLU).

Funcionamiento General:

  1. Entrada y Pesos: Las entradas ((x_i)) y los pesos ((w_i)) representan la información que la neurona procesa.
  2. Sumador Ponderado: La neurona calcula la suma ponderada ((z)) de las entradas y los pesos, incluyendo el sesgo.
  3. Función de Activación: La salida ((a)) se obtiene aplicando una función de activación al sumador ponderado ((z)).
  4. Salida de la Neurona: La salida de la neurona se utiliza como entrada para las siguientes capas en una red neuronal.

Ejemplo con Función Sigmoide:

Si utilizamos la función de activación sigmoide

$((f(z)=\frac{1}{1+e^{-z}}))$((f(z)=11+ez​))​

la salida de la neurona sería:

[𝑎=11+𝑒−(∑𝑖=1𝑛(𝑥𝑖⋅𝑤𝑖)+𝑏)][a=1+e−(∑i=1n​(xi​⋅wi​)+b)1​]

Esto representa la probabilidad de activación de la neurona.

Resumen:

  • Una neurona realiza una combinación lineal ponderada de entradas, seguida de la aplicación de una función de activación no lineal.
  • Los pesos determinan la influencia de cada entrada en la salida.
  • La función de activación introduce no linealidad y permite a la red aprender patrones complejos.

Este es el concepto básico de una neurona en una red neuronal. En redes más complejas, múltiples neuronas trabajan en conjunto para aprender y representar patrones en los datos.

Creando una Red Neuronal con Python

Hay varias formas de crear una red neuronal con Python, y la elección depende de diversos factores, como la complejidad del problema, el nivel de control que necesitas sobre la arquitectura de la red y tu familiaridad con las herramientas. A continuación, se presentan algunas de las formas comunes:

1. TensorFlow y Keras:

  • Descripción: TensorFlow es una biblioteca de aprendizaje automático de código abierto desarrollada por Google. Keras es una interfaz de alto nivel que se ejecuta sobre TensorFlow y facilita la construcción y entrenamiento de redes neuronales.
  • Ventajas:
  • Facilidad de uso con Keras.
  • Amplia comunidad y documentación.
  • Compatibilidad con GPU para entrenamiento acelerado.
  • Ejemplo:

2. PyTorch:

  • Descripción: PyTorch es una biblioteca de aprendizaje automático de código abierto desarrollada por Facebook. Se centra en la programación dinámica, lo que facilita la construcción y experimentación con modelos de redes neuronales.
  • Ventajas:
  • Flexibilidad y extensibilidad.
  • Adopción creciente en la comunidad de investigación.
  • Ejemplo:

3. Scikit-Learn:

  • Descripción: Scikit-learn es una biblioteca de aprendizaje automático que proporciona herramientas sencillas y eficientes para análisis de datos y modelado predictivo. Aunque no es tan especializada como TensorFlow o PyTorch, es adecuada para problemas más simples.
  • Ventajas:
  • Sintaxis simple y fácil de usar.
  • Integración con otras herramientas de análisis de datos.
  • Ejemplo:

4. Keras (standalone):

  • Descripción: Keras también se puede utilizar como una biblioteca independiente sin depender de TensorFlow. En este caso, se utiliza el back-end de Keras para proporcionar la implementación de bajo nivel.
  • Ventajas:
  • Simplifica la construcción de redes neuronales.
  • Compatible con varias bibliotecas de backend, incluyendo TensorFlow y Theano.
  • Ejemplo:

Estas son solo algunas de las opciones disponibles para construir redes neuronales en Python. La elección entre ellas dependerá de tus necesidades específicas, preferencias y nivel de experiencia.

Capas de Redes Neuronales

Las capas son bloques fundamentales en la construcción de redes neuronales, y diferentes tipos de capas desempeñan roles específicos en el procesamiento de datos. A continuación, se describen algunos tipos comunes de capas en una red neuronal junto con explicaciones detalladas:

1. Capa de Entrada (Input Layer):

  • Función:
  • Recibe las características de entrada y transmite la información a las capas ocultas.
  • Características:
  • No realiza ningún cálculo.
  • Tiene tantas neuronas como características de entrada.
  • Ejemplo:

2. Capa Densa (Fully Connected o Dense Layer):

  • Función:
  • Cada neurona en esta capa está conectada a todas las neuronas de la capa anterior.
  • Realiza una combinación lineal de las entradas ponderadas y aplica una función de activación.
  • Características:
  • Cada conexión tiene un peso asociado.
  • Ejemplo:

3. Capa de Activación:

  • Función:
  • Introduce no linealidad al aplicar una función de activación a la salida de las neuronas.
  • Características:
  • Puede ser colocada después de una capa densa u otra capa que produzca una salida.
  • Ejemplo:

4. Capa de Dropout:

  • Función:
  • Aleatoriamente “apaga” (pone a cero) algunas unidades durante el entrenamiento para prevenir el sobreajuste.
  • Características:
  • Introduce regularización al modelo.
  • Ejemplo:

5. Capa de Salida (Output Layer):

  • Función:
  • Produce la salida final de la red neuronal.
  • Características:
  • Número de neuronas depende del tipo de problema (clasificación binaria, clasificación multiclase, regresión, etc.).
  • Ejemplo:

6. Capa Convolucional (Convolutional Layer):

  • Función:
  • Utilizada en redes neuronales convolucionales (CNN) para el procesamiento de datos bidimensionales, como imágenes.
  • Aplica filtros convolucionales a regiones locales de la entrada.
  • Características:
  • Conserva la estructura espacial de los datos.
  • Ejemplo:

7. Capa de Agrupación (Pooling Layer):

  • Función:
  • Reduce la dimensionalidad espacial de la entrada para reducir la cantidad de parámetros y cálculos.
  • Características:
  • Operaciones comunes: Max pooling, Average pooling.
  • Ejemplo:

Estos son solo algunos ejemplos de tipos de capas en una red neuronal. La elección de las capas y su arquitectura dependerá del tipo de tarea que estés abordando y la naturaleza de tus datos. Experimentar con diferentes configuraciones de capas y funciones de activación es una parte esencial del desarrollo de modelos de redes neuronales efectivos.

Algunos ejemplos adicionales de tipos de capas que se utilizan comúnmente en el diseño de redes neuronales:

8. Capa de Normalización por Lotes (Batch Normalization Layer):

  • Función:
  • Normaliza la salida de una capa anterior para estabilizar y acelerar el entrenamiento.
  • Características:
  • Mejora la convergencia y reduce la dependencia de la inicialización de pesos.
  • Ejemplo:

9. Capa de Concatenación (Concatenation Layer):

  • Función:
  • Concatena las salidas de varias capas.
  • Características:
  • Útil para modelos con múltiples entradas o salidas.
  • Ejemplo:

10. Capa de Atención (Attention Layer):

  • Función:
  • Permite a la red centrarse en partes específicas de la entrada.
  • Características:
  • Común en modelos de procesamiento de lenguaje natural.
  • Ejemplo:

11. Capa Embebida (Embedding Layer):

  • Función:
  • Utilizada para mapear enteros (índices de palabras) a vectores densos de palabras.
  • Características:
  • Útil en tareas de procesamiento de lenguaje natural.
  • Ejemplo:

12. Capa de Residuos (Residual Layer):

  • Función:
  • Introduce conexiones de salto para ayudar al modelo a aprender funciones residuales.
  • Características:
  • Ayuda a aliviar el problema de la desaparición del gradiente.
  • Ejemplo:

13. Capa de Transformador (Transformer Layer):

  • Función:
  • Basada en la arquitectura de transformer, es utilizada para modelar relaciones en datos secuenciales.
  • Características:
  • Muy común en tareas de procesamiento de lenguaje natural.
  • Ejemplo:

14. Capa de Gradiente Reversible (Reversible Gradient Layer):

  • Función:
  • Permite calcular el gradiente de manera reversible, útil para entrenar modelos con memoria limitada.
  • Características:
  • Útil en modelos con restricciones de memoria.
  • Ejemplo:

Estos ejemplos representan solo una fracción de las capas disponibles en diversas bibliotecas de redes neuronales en Python. La elección de la capa dependerá del problema que estés abordando y de las características específicas que requiera tu modelo.

Tipos de Redes Neuronales

Existen diversos tipos de redes neuronales diseñadas para abordar diferentes tipos de problemas en el ámbito del aprendizaje automático y la inteligencia artificial. Aquí te proporcionaré una visión general de algunos tipos comunes de redes neuronales, para qué sirven y cuándo es apropiado utilizarlos:

1. Redes Neuronales de Alimentación Adelante (Feedforward Neural Networks):

  • Propósito: Son la forma más básica de redes neuronales, donde la información fluye en una dirección, desde la capa de entrada hasta la capa de salida.
  • Uso: Apropiadas para problemas de clasificación y regresión sencillos cuando no hay dependencias temporales o patrones complejos en los datos.

2. Redes Neuronales Convolucionales (Convolutional Neural Networks – CNN):

  • Propósito: Diseñadas para procesar datos con estructura de cuadrícula, como imágenes. Utilizan capas de convolución para aprender patrones locales.
  • Uso: Ideal para tareas de visión por computadora, reconocimiento de imágenes, segmentación de imágenes y problemas relacionados con datos en forma de cuadrícula.

3. Redes Neuronales Recurrentes (Recurrent Neural Networks – RNN):

  • Propósito: Diseñadas para trabajar con datos secuenciales, donde la entrada tiene una relación temporal. Mantienen una memoria interna para procesar secuencias de datos.
  • Uso: Útiles para tareas como procesamiento de lenguaje natural (NLP), pronóstico de series temporales, traducción automática y otros problemas con datos temporales.

4. Redes Neuronales de Memoria a Corto y Largo Plazo (Long Short-Term Memory – LSTM):

  • Propósito: Una variante de RNN que aborda el problema de desvanecimiento del gradiente en RNN estándar, permitiendo la retención de información a largo plazo.
  • Uso: Útiles cuando se requiere recordar patrones a largo plazo, como en tareas de NLP y series temporales más complejas.

5. Redes Generativas Adversarias (Generative Adversarial Networks – GAN):

  • Propósito: Comprenden dos redes, un generador y un discriminador, que compiten entre sí. El generador crea datos nuevos y el discriminador evalúa su autenticidad.
  • Uso: Para generar datos sintéticos realistas, como en la creación de imágenes, mejora de resolución de imágenes, y generación de contenido creativo.

6. Redes Neuronales Siamesas:

  • Propósito: Diseñadas para comparar dos entradas y determinar si son similares o diferentes. Tienen aplicaciones en tareas de emparejamiento y verificación de similitud.
  • Uso: En problemas de reconocimiento facial, verificación de documentos y sistemas de recomendación personalizados.

7. Redes Neuronales de Atención (Attention Networks):

  • Propósito: Permiten a la red enfocarse en partes específicas de la entrada, asignando pesos diferentes a diferentes partes de la entrada.
  • Uso: Muy efectivas en tareas de procesamiento de lenguaje natural, traducción automática y cualquier tarea que requiera un enfoque selectivo en partes específicas de la entrada.

La elección de la red neuronal depende en gran medida de la naturaleza del problema que estás abordando y la naturaleza de tus datos. Es común experimentar con diferentes arquitecturas para encontrar la que mejor se adapte a tus necesidades.

Creando tu primera red Neuronal con Python (Tensorflow y Keras)

Crearemos una red neuronal sencilla (de una neurona para convertir grados Centígrados a grados Fahrenheit)

1. Importar Bibliotecas:

2. Preparar Datos:

Generemos algunos datos de ejemplo para entrenar nuestra red. Crearemos un rango de temperaturas en grados Celsius y sus correspondientes valores en Fahrenheit.

3. Definir el Modelo las Capas y el Modelo:

Vamos a crear un modelo de red neuronal con una sola neurona.

4. Compilar el Modelo:

Configuramos el modelo para la fase de entrenamiento especificando el optimizador y la función de pérdida.

Adam: Adam es un algoritmo de optimización popular que se utiliza para ajustar los pesos de una red neuronal durante el entrenamiento. Se adapta de forma dinámica las tasas de aprendizaje para cada parámetro, lo que lo hace eficiente y efectivo en muchos casos. El valor 0.1 que pasas como argumento es la tasa de aprendizaje, que controla cuánto se deben ajustar los pesos en cada iteración del entrenamiento.

Mean Squared Error (Error Cuadrático Medio): Esta función de pérdida se utiliza comúnmente en problemas de regresión. Calcula la diferencia cuadrática promedio entre las predicciones del modelo y los valores reales. El objetivo durante el entrenamiento es minimizar esta pérdida.

5. Entrenar el Modelo:

Entrenamos el modelo utilizando los datos de temperatura Celsius y Fahrenheit.

Aquí, estamos utilizando 1000 épocas para realizar el aprendizaje (puedes usar verbose = False para no ver los datos del entrenamiento y los ajustes.

6. Hacer Predicciones e Imprimiendo el resultado:

Después de entrenar el modelo, podemos hacer predicciones utilizando nuevas temperaturas en grados Celsius.

7. Viendo los pesos y los sesgos de la red

Finalmente, veremos los pesos y los sesgos que utilizó mi red neuronal (de una neurona y una capa)

Este es un ejemplo sencillo de cómo puedes crear y entrenar una red neuronal con TensorFlow y Keras para realizar una tarea de conversión simple. Recuerda que, para tareas más complejas, podrías necesitar arquitecturas más avanzadas y ajustar los hiperparámetros.

Preguntas

  1. Prueba escribir un programa en python que haga lo mismo pero sin usar una red neuronal ¿Cómo se comparan los resultados obtenidos por la red neuronal con el valor predicho por la ecuación de conversión?
  2. ¿Son los valores de pesos (m) y sesgos (b) obtenidos por la red neuronal similares a los obtenidos de forma convencional?
Modificando la red Anterior

Probemos ahora modificar la red neuronal anterior agregando más neuronas y más capas para ver que sucede:

Usando Pytorch

Ahora haremos el mismo código anterior pero ahora usando Pytorch. El código modificado sería el siguiente:

Este código utiliza PyTorch en lugar de TensorFlow y Keras. Recuerda que las operaciones y la sintaxis pueden ser diferentes entre las dos bibliotecas, por lo que ajusté el código para que sea compatible con PyTorch. Este modelo es bastante simple, pero puedes adaptarlo según tus necesidades específicas.

Usando Scikit-Learn

Scikit-Learn no tiene un módulo específico para redes neuronales como TensorFlow o Keras. Sin embargo, puedes utilizar la implementación de regresión lineal de Scikit-Learn para crear un modelo sencillo. Aquí tienes una adaptación del código usando Scikit-Learn para una regresión lineal:

En este código, utilizamos la clase LinearRegression de Scikit-Learn para crear un modelo de regresión lineal. Luego, entrenamos el modelo con los datos de temperatura y hacemos predicciones. La visualización muestra los datos reales y la línea de ajuste lineal. La última sección realiza una predicción para 100.0 grados Celsius e imprime el resultado en Fahrenheit.

Ten en cuenta que este modelo es simple y lineal, y para tareas más complejas, podrías necesitar explorar bibliotecas más avanzadas como TensorFlow o PyTorch.

Usando Solamente Keras

Puedes simplificar el código para usar solamente Keras en lugar de TensorFlow y Keras, ya que Keras se ha integrado directamente en TensorFlow. Aquí está el código modificado:

En este código, hemos eliminado la importación de TensorFlow y hemos utilizado las clases Sequential y Dense directamente desde el módulo keras.models y keras.layers, respectivamente. También hemos cambiado el optimizador a 'adam', que es el optimizador por defecto en Keras.

Este código realiza la misma tarea que el original, pero utilizando únicamente las funcionalidades de Keras que están integradas en TensorFlow.

Reto 1

Crea tu propia red neuronal usando la librería que tu quieras (Tensorflow, Pytorch, Scikit-Learn o Keras) y utilizala para calcular la concentración de una muestra problema a partir de los siguientes espectros UV-Visible con concentraciones conocidas.

Reto 2

Ahora piensa un poco en como modificar el código anterior pero ahora para que los datos de entrenamiento del modelo sean los espectros obtenidos y el al cargar el espectro de la muestra problema diga la concentración.

Ayuda:

  1. Piensa primero en tu set de datos (Puedes importarlos como si fueras a graficarlos todos) y en su etiquetado (esta es la entrada).
  2. Piensa ahora en tu salida (debería darte la concentración)
  3. Piensa ahora en el tamaño de la red y en el tipo de red (Puedes usar las capas ocultas que quieras, pero el tamaño de entrada dependerá de la cantidad de datos existentes (nm y absorbancia)).
  4. Piensa en agregar una función de activación (la función de activación introduce elementos no lineales a la red, para hacerla no lineal) y la función de perdida a utilizar.
  5. Entrena tu red y has una predicción.
Scroll al inicio