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: