23 febrero, 2020

Cómo crear una red neuronal con Tensorflow y Keras

En este tutorial, aprenderemos a crear nuestra primera red neuronal, tal y como anunciamos en la entrada Primeros pasos con Tensorflow (Linux). Llevaremos a cabo esta tarea empleando Python con Tensorflow, Keras y NumPy.

Una vez tengamos el entorno listo, empezamos a escribir código. En primer lugar, debemos importar los paquetes necesarios, anteriormente mencionados, para trabajar:

import tensorflow as tf
from tensorflow import keras
import numpy as np

Definimos nuestro problema: dada una entrada «X», predecir una salida «Y». Para este ejemplo, tendremos que aprender que «y = 3x – 4».

Creamos un conjunto de datos de ejemplo con entradas y salidas:

xs = np.array([-2.0, 0.0, 4.0, 1.0, 6.0, 5.0, 3.0, -3.0], dtype=float)
ys = np.array([-10.0, -4.0, 8.0, -1.0, 14.0, 11.0, 5.0, -13.0], dtype=float)

A continuación, definimos cómo va a ser nuestro modelo. En nuestro caso, una red neuronal con una neurona de entrada (x) y una salida (y). Vamos a decir también qué optimizador y qué función de error va a utilizar. En este ejemplo, el optimizador será SGD y la función de error, la función de error cuadrático medio (mean squared error).

model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')

Para terminar de crear el modelo, tenemos que entrenarlo, usando el conjunto de datos de ejemplo previamente definido y estableciendo el número de iteraciones.

model.fit(xs, ys, epochs=300)

Y con esto, ya tenemos creado nuestro modelo, preparado para realizar predicciones. Podemos probar con varios números y comprobar cómo el resultado está muy cercano a la ecuación que queríamos modelar: y = 3x – 4. Probamos con el número 8, que nos debería dar como resultado 20:

print(model.predict([8.0]))

Éste es el código final:

import tensorflow as tf
from tensorflow import keras
import numpy as np

xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)

model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')

model.fit(xs, ys, epochs=300)
print(model.predict([8.0]))

Ejecutamos el código desde el terminal escribiendo:

python keras-neuronal-network.py

Y vemos que el resultado es algo similar a esto, muy cercano al 20 que buscamos.

[[19.487118]]

Podéis probar a cambiar valores, como el número de iteraciones (epoch). Si bajáis veréis cómo os vais distanciando del resultado esperado, y según lo aumentéis, os iréis acercando cada vez más, pero se emplea más tiempo de entrenamiento. Entonces, ¿en todos los casos, cuanto más alto sea el número de iteraciones, mejor es el resultado? No, porque la red neuronal puede sobreaprender, es decir, memorizar los ejemplos de entrenamiento, y llegar a no saber predecir ejemplos no vistos anteriormente.

El código lo tengo compartido en mi cuenta de GitHub:

https://github.com/diegorys/ml-py-examples/blob/master/practices/tensorflow-keras-neural-networks/keras-neuronal-network.py

Deja un comentario

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies