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.

Red neuronal artificial
Red neuronal artificial

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.

Red neuronal Architectura
Red neuronal Architectura

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.

  1. El primer nodo son los valores de entrada.
  2. 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.
  3. 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.

Funciรณn de activaciรณn

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

Red neuronal en TensorFlow

La red optimizarรก los pesos durante 180 รฉpocas con un tamaรฑo de lote de 10. En el siguiente video de ejemplo de ANN, puede ver cรณmo evolucionan los pesos y cรณmo la red mejora el mapa de clasificaciรณn.ping.

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.

Red neuronal en TensorFlow

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 mapa de salidapingLa red estรก cometiendo bastantes errores. Veamos cรณmo se comporta 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.

Red neuronal en TensorFlow

La idea se puede generalizar para redes con mรกs capas y neuronas ocultas. Puedes jugar en el este 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.

Resumen

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.

Resumir este post con: