Tutorial de redes neuronales artificiales con ejemplos de ANN de TensorFlow
¿Qué es la red neuronal artificial?
An Red neuronal artificial (ANN) es un sistema informático inspirado en redes neuronales biológicas para crear cerebros artificiales basados en una colección de unidades conectadas llamadas neuronas artificiales. Está diseñado para analizar y procesar información como humanos. La red neuronal artificial tiene capacidades de autoaprendizaje para producir mejores resultados a medida que hay más datos disponibles.

Una red neuronal artificial (RNA) se compone de cuatro objetos principales:
- capas: todo el aprendizaje ocurre en las capas. Hay 3 capas 1) Entrada 2) Oculta y 3) Salida
- Característica y etiqueta: Entrada de datos a la red (características) y salida de la red (etiquetas)
- Función de pérdida: Métrica utilizada para estimar el rendimiento de la fase de aprendizaje.
- Optimizador: Mejorar el aprendizaje actualizando el conocimiento en la red
Una red neuronal tomará los datos de entrada y los insertará en un conjunto de capas. La red necesita evaluar su desempeño con una función de pérdida. La función de pérdida le da a la red una idea del camino que debe tomar antes de dominar el conocimiento. La red necesita mejorar su conocimiento con la ayuda de un optimizador.
Si observa la figura anterior, comprenderá el mecanismo subyacente.
El programa toma algunos valores de entrada y los coloca en dos capas completamente conectadas. Imagina que tienes un problema de matemáticas, lo primero que haces es leer el capítulo correspondiente para resolver el problema. Aplicas tus nuevos conocimientos para resolver el problema. Existe una alta probabilidad de que no obtenga una puntuación muy buena. Lo mismo ocurre con una red. La primera vez que ve los datos y hace una predicción, no coincidirá perfectamente con los datos reales.
Para mejorar su conocimiento, la red utiliza un optimizador. En nuestra analogía, se puede pensar que un optimizador es una relectura del capítulo. Obtienes nuevos conocimientos/lecciones al leer de nuevo. De manera similar, la red utiliza el optimizador, actualiza su conocimiento y prueba su nuevo conocimiento para comprobar cuánto necesita aprender aún. El programa repetirá este paso hasta lograr el menor error posible.
En nuestra analogía del problema de matemáticas, significa que lees el capítulo del libro de texto muchas veces hasta que entiendes completamente el contenido del curso. Incluso después de leer varias veces, si sigues cometiendo un error, significa que alcanzaste la capacidad de conocimiento con el material actual. Necesitas usar un libro de texto diferente o probar un método diferente para mejorar tu puntaje. Para una red neuronal, es el mismo proceso. Si el error está lejos del 100%, pero la curva es plana, significa que con la arquitectura actual; no puede aprender nada más. La red tiene que estar mejor optimizada para mejorar el conocimiento.
Red neuronal Architectura
La red neuronal artificial ArchiLa arquitectura consta de los siguientes componentes:
- capas
- Función de activación
- Función de pérdida
- Optimizador
capas
Una capa es donde tiene lugar todo el aprendizaje. Dentro de una capa hay una cantidad infinita de pesos (neuronas). Una red neuronal típica suele ser procesada por capas densamente conectadas (también llamadas capas completamente conectadas). Significa que todas las entradas están conectadas a la salida.
Una red neuronal típica toma un vector de entrada y un escalar que contiene las etiquetas. La configuración más cómoda es una clasificación binaria con sólo dos clases: 0 y 1.
La red toma una entrada, la envía a todos los nodos conectados y calcula la señal con un activación función.

La figura anterior representa esta idea. La primera capa son los valores de entrada para la segunda capa, llamada capa oculta, recibe la entrada ponderada de la capa anterior.
- El primer nodo son los valores de entrada.
- La neurona se descompone en la parte de entrada y la función de activación. La parte izquierda recibe toda la entrada de la capa anterior. La parte derecha es la suma de los pases de entrada a una función de activación.
- Valor de salida calculado a partir de las capas ocultas y utilizado para hacer una predicción. Para clasificación, es igual al número de clase. Para la regresión, sólo se predice un valor.
Función de activación
La función de activación de un nodo define la salida dado un conjunto de entradas. Necesita una función de activación para permitir que la red aprenda un patrón no lineal. Una función de activación común es una Relu, Unidad lineal rectificada. La función da un cero para todos los valores negativos.
Las otras funciones de activación son:
- Lineal por partes
- Sigmoideo
- tanh
- Relu con fugas
La decisión crítica que se debe tomar al construir una red neuronal es:
- ¿Cuántas capas en la red neuronal?
- ¿Cuántas unidades ocultas para cada capa?
Una red neuronal con muchas capas y unidades ocultas puede aprender una representación compleja de los datos, pero hace que el cálculo de la red sea muy costoso.
Función de pérdida
Una vez que haya definido las capas ocultas y la función de activación, debe especificar la función de pérdida y el optimizador.
Para la clasificación binaria, es una práctica común utilizar una función de pérdida de entropía cruzada binaria. En la regresión lineal, se utiliza el error cuadrático medio.
La función de pérdida es una métrica importante para estimar el rendimiento del optimizador. Durante el entrenamiento, esta métrica se minimizará. Debe seleccionar esta cantidad con cuidado según el tipo de problema que esté enfrentando.
Optimizador
La función de pérdida es una medida del desempeño del modelo. El optimizador ayudará a mejorar los pesos de la red para disminuir la pérdida. Hay diferentes optimizadores disponibles, pero el más común es el Descenso de gradiente estocástico.
Los optimizadores convencionales son:
- Momentum mejoramiento,
- gradiente acelerado de Nesterov,
- AdaGrad,
- optimización de adán
Limitaciones de la red neuronal
Las siguientes son las limitaciones de la red neuronal:
Sobreajuste
Un problema común con las redes neuronales complejas es la dificultad de generalizar datos no vistos. Una red neuronal con muchos pesos puede identificar muy bien detalles específicos en el conjunto de entrenamiento, pero a menudo conduce a un sobreajuste. Si los datos no están equilibrados dentro de los grupos (es decir, no hay suficientes datos disponibles en algunos grupos), la red aprenderá muy bien durante el entrenamiento, pero no tendrá la capacidad de generalizar dicho patrón a datos nunca vistos antes.
Existe un equilibrio en el aprendizaje automático entre optimización y generalización.
Optimizar un modelo requiere encontrar los mejores parámetros que minimicen la pérdida del conjunto de entrenamiento.
La generalización, sin embargo, indica cómo se comporta el modelo ante datos invisibles.
Para evitar que el modelo capture detalles específicos o patrones no deseados de los datos de entrenamiento, puede utilizar diferentes técnicas. El mejor método es tener un conjunto de datos equilibrado con una cantidad suficiente de datos. El arte de reducir el sobreajuste se denomina regularización. Repasemos algunas técnicas convencionales.
Tamaño de la red
Se sabe que una red neuronal con demasiadas capas y unidades ocultas es muy sofisticada. Una forma sencilla de reducir la complejidad del modelo es reducir su tamaño. No existe una práctica recomendada para definir la cantidad de capas. Debe comenzar con una pequeña cantidad de capas y aumentar su tamaño hasta encontrar el ajuste óptimo del modelo.
Regularización de peso
Una técnica estándar para evitar el sobreajuste es agregar restricciones a los pesos de la red. La restricción obliga al tamaño de la red a tomar sólo valores pequeños. La restricción se agrega a la función de pérdida del error. Hay dos tipos de regularización:
L1: Lazo: El costo es proporcional al valor absoluto de los coeficientes de peso.
L2: Cresta: El costo es proporcional al cuadrado del valor de los coeficientes de peso.
Punteras
El abandono es una técnica extraña pero útil. Una red con abandono significa que algunos pesos se establecerán aleatoriamente en cero. Imagine que tiene una serie de pesos [0.1, 1.7, 0.7, -0.9]. Si la red neuronal tiene una caída, se convertirá en [0.1, 0, 0, -0.9] con 0 distribuido aleatoriamente. El parámetro que controla la caída es la tasa de caída. La tasa define cuántos pesos se establecerán en ceros. Tener una tasa entre 0.2 y 0.5 es común.
Ejemplo de red neuronal en TensorFlow
Veamos un ejemplo de red neuronal artificial en acción para ver cómo funciona una red neuronal para un problema de clasificación típico. Hay dos entradas, x1 y x2 con un valor aleatorio. La salida es una clase binaria. El objetivo es clasificar la etiqueta en función de las dos características. Para llevar a cabo esta tarea, la arquitectura de la red neuronal se define de la siguiente manera:
- Dos capas ocultas
- La primera capa tiene cuatro neuronas completamente conectadas.
- La segunda capa tiene dos neuronas completamente conectadas.
- La función de activación es un Relu.
- Agregue una regularización L2 con una tasa de aprendizaje de 0.003
La red optimizará el peso durante 180 épocas con un tamaño de lote de 10. En el video de ejemplo de ANN a continuación, puede ver cómo evolucionan los pesos y cómo la red mejora el mapeo de clasificación.
En primer lugar, la red asigna valores aleatorios a todos los pesos.
- Con pesos aleatorios, es decir, sin optimización, la pérdida de salida es 0.453. La siguiente imagen representa la red con diferentes colores.
- En general, el color naranja representa los valores negativos mientras que los colores azules muestran los valores positivos.
- Los puntos de datos tienen la misma representación; las azules son las etiquetas positivas y la naranja las etiquetas negativas.
Dentro de la segunda capa oculta, las líneas están coloreadas siguiendo el signo de los pesos. Las líneas naranjas asignan pesos negativos y las azules pesos positivos.
Como puede ver, en el mapeo de salida, la red está cometiendo muchos errores. Veamos cómo se comporta la red después de la optimización.
La imagen del ejemplo de ANN a continuación muestra los resultados de la red optimizada. En primer lugar, observa que la red ha aprendido con éxito cómo clasificar el punto de datos. Puedes ver en la imagen anterior; el peso inicial era -0.43 mientras que después de la optimización da como resultado un peso de -0.95.
La idea se puede generalizar para redes con más capas y neuronas ocultas. Puedes jugar en el enlace.
Cómo entrenar una red neuronal con TensorFlow
Aquí está el proceso paso a paso sobre cómo entrenar una red neuronal con TensorFlow ANN utilizando el estimador DNNClassifier de la API.
Usaremos el conjunto de datos MNIST para entrenar su primera red neuronal. Entrenando una red neuronal con TensorFlow No es muy complicado. El paso de preprocesamiento tiene exactamente el mismo aspecto que en los tutoriales anteriores. Procederá de la siguiente manera:
- Paso 1: importar los datos
- Paso 2: transformar los datos
- Paso 3: construir el tensor
- Paso 4: construye el modelo
- Paso 5: entrenar y evaluar el modelo
- Paso 6: mejorar el modelo
Paso 1) Importar los datos
En primer lugar, necesitas importar la biblioteca necesaria. Puede importar el conjunto de datos MNIST utilizando scikit learn como se muestra en el ejemplo de red neuronal TensorFlow a continuación.
El conjunto de datos MNIST es el conjunto de datos que se utiliza habitualmente para probar nuevas técnicas o algoritmos. Este conjunto de datos es una colección de imágenes de 28 × 28 píxeles con un dígito escrito a mano del 0 al 9. Actualmente, el error más bajo en la prueba es del 0.27 por ciento con un comité de 7 redes neuronales convolucionales.
import numpy as np import tensorflow as tf np.random.seed(1337)
Puede descargar scikit learn temporalmente en esta dirección. Copie y pegue el conjunto de datos en una carpeta conveniente. Para importar los datos a Python, puede usar fetch_mldata de scikit learn. Pegue la ruta del archivo dentro de fetch_mldata para recuperar los datos.
from sklearn.datasets import fetch_mldata mnist = fetch_mldata(' /Users/Thomas/Dropbox/Learning/Upwork/tuto_TF/data/mldata/MNIST original') print(mnist.data.shape) print(mnist.target.shape)
Después de eso, importa los datos y obtiene la forma de ambos conjuntos de datos.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42) y_train = y_train.astype(int) y_test = y_test.astype(int) batch_size =len(X_train) print(X_train.shape, y_train.shape,y_test.shape )
Paso 2) Transformar los datos
En el tutorial anterior, aprendiste que necesitas transformar los datos para limitar el efecto de los valores atípicos. En este tutorial de redes neuronales, transformará los datos utilizando el escalador mínimo-máximo. La fórmula es:
(X-min_x)/(max_x - min_x)
Scikit aprende que ya tiene una función para eso: MinMaxScaler()
## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_test_scaled = scaler.fit_transform(X_test.astype(np.float64))
Paso 3) Construye el tensor
Ahora estás familiarizado con la forma de crear tensor en Tensorflow. Puede convertir el conjunto de trenes en una columna numérica.
feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]
Paso 4) Construye el modelo
La arquitectura de la red neuronal contiene dos capas ocultas con 2 unidades para la primera capa y 300 unidades para la segunda. Usamos estos valores en función de nuestra propia experiencia. Puedes ajustar estos valores y ver cómo afectan la precisión de la red.
Para construir el modelo, se utiliza el estimador DNNClassifier. Puede agregar la cantidad de capas a los argumentos de feature_columns. Debe establecer el número de clases en 10, ya que hay diez clases en el conjunto de entrenamiento. Ya estás familiarizado con la sintaxis del objeto estimador. Los argumentos, columnas de características, número de clases y model_dir son precisamente los mismos que en el tutorial anterior. El nuevo argumento unidad_oculta controla la cantidad de capas y cuántos nodos conectarse a la red neuronal. En el siguiente código, hay dos capas ocultas: la primera conecta 300 nodos y la segunda con 100 nodos.
Para construir el estimador, utilice tf.estimator.DNNClassifier con los siguientes parámetros:
- feature_columns: define las columnas a usar en la red
- Hidden_units: define el número de neuronas ocultas.
- n_classes: define el número de clases a predecir
- model_dir: define la ruta de TensorBoard
estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], n_classes=10, model_dir = '/train/DNN')
Paso 5) Entrenar y evaluar el modelo.
Puedes usar el método numpy para entrenar el modelo y evaluarlo.
# Train the estimator train_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_train_scaled}, y=y_train, batch_size=50, shuffle=False, num_epochs=None) estimator.train(input_fn = train_input,steps=1000) eval_input = tf.estimator.inputs.numpy_input_fn( x={"x": X_test_scaled}, y=y_test, shuffle=False, batch_size=X_test_scaled.shape[0], num_epochs=1) estimator.evaluate(eval_input,steps=None)
Salida:
{'accuracy': 0.9637143, 'average_loss': 0.12014342, 'loss': 1682.0079, 'global_step': 1000}
La arquitectura actual permite una precisión en el conjunto de evaluación del 96 por ciento.
Paso 6) Mejorar el modelo
Puede intentar mejorar el modelo agregando parámetros de regularización.
Usaremos un optimizador Adam con una tasa de abandono de 0.3, L1 de X y L2 de y. En la red neuronal TensorFlow, puedes controlar el optimizador usando el tren de objetos seguido del nombre del optimizador. TensorFlow es una API integrada para el optimizador Proximal AdaGrad.
Para agregar regularización a la red neuronal profunda, puede usar tf.train.ProximalAdagradOptimizer con el siguiente parámetro
- Tasa de aprendizaje: tasa_aprendizaje
- Regularización L1: l1_regularization_strength
- Regularización L2: l2_regularization_strength
estimator_imp = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[300, 100], dropout=0.3, n_classes = 10, optimizer=tf.train.ProximalAdagradOptimizer( learning_rate=0.01, l1_regularization_strength=0.01, l2_regularization_strength=0.01 ), model_dir = '/train/DNN1') estimator_imp.train(input_fn = train_input,steps=1000) estimator_imp.evaluate(eval_input,steps=None)
Salida:
{'accuracy': 0.95057142, 'average_loss': 0.17318928, 'loss': 2424.6499, 'global_step': 2000}
Los valores elegidos para reducir el sobreajuste no mejoraron la precisión del modelo. Su primer modelo tuvo una precisión del 96%, mientras que el modelo con regularizador L2 tiene una precisión del 95%. Puede probar con diferentes valores y ver cómo afecta la precisión.
Resum
En este tutorial, aprenderá cómo construir una red neuronal. Una red neuronal requiere:
- Número de capas ocultas
- Número de nodos completamente conectados
- Función de activación
- Optimizador
- Numero de clases
En TensorFlow ANN, puedes entrenar una red neuronal para problemas de clasificación con:
- tf.estimator.DNNClassifier
El estimador requiere especificar:
- feature_columns=columnas_características,
- unidades_ocultas=[300, 100]
- n_clases=10
- modelo_dir
Puede mejorar el modelo utilizando diferentes optimizadores. En este tutorial, aprendió a usar el optimizador Adam Grad con una tasa de aprendizaje y a agregar un control para evitar el sobreajuste.