Introducción a TensorFlow.js: Modelos y predicciones

Después de instalar y configurar un proyecto de TensorFlow.js, ya puedes utilizar la API de TensorFlow.js para definir modelos, entrenarlos y hacer predicciones. Esto es lo que haremos en el post de hoy.  El objetivo es que puedas tener una idea muy básica de “cómo se ve” TensorFlow.js.

Pero antes de seguir, te recomiendo leer los siguientes artículos:

¿Cómo definir un modelo en TensorFlow.js?

Imagínate que tenemos una fórmula y=2x-1, que para cada x retorna el valor y. Como bien sabes el gráfico de esta función es una recta. Algo así como la imagen siguiente:

Gráfico de y=2x-1

En nuestro aprendizaje automático, queremos utilizar datos de entrada (x,y) de la función y entrenar un modelo con estos pares de valores. La idea es ver el modelo  predecir los valores de y basados en la entrada de los valores de x, sin que el modelo conozca la función.

Estaremos contentos si los resultados de y devueltos por el modelo están cerca de los valores exactos que devolvería la función.

Utilizando nuestro fichero index.js de la semana pasada, creamos una red neuronal sencilla con un modelo que necesita lidiar con un valor de entrada y un valor de salida:

// Definimos el modelo para regresión lineal
const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));

Lo que acabamos de hacer es crear una nueva instancia de modelo llamando al método tf.sequential. Como el nombre indica, esto nos devuelve un modelo secuencial, un modelo en el que las salidas de una capa son las entradas a la siguiente. Estamos hablando, por tanto, de una pila de capas, sin ramificaciones, ni saltos.

Llamando al método model.add, después de haber creado el modelo, agregamos la primera capa. Luego para crear una capa densa, llamamos a tf.layers.dense. En una capa densa, todos los nodos de la capa se conectan a todos los nodos de la capa anterior. En nuestro ejemplo, añadimos una capa densa con una forma de entrada y salida de una a la red neuronal.

A continuación especificamos la pérdida y la función optimizadora del modelo declarando:

// Especificamos la pérdida y la función optimizadora del modelo
model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

Como has podido ver, lo que hemos hecho ha sido pasar un objeto de configuración a la llamada del método model.compile. Loss (pérdida)  y optimizer son dos propiedades de esta configuración.

Loss se utiliza para mapear valores de una o más variables en un número real que representa algunos “costos” asociados al valor. Después de entrenado, el modelo intenta minimizar el resultado de la función de pérdida. En este caso utilizamos meanSquaredError, que es el error cuadrático medio.

Por otra parte, optimizer es la función de optimización que se utilizará. En este caso, la función sdg. Sdg, de Sthochastic Gradient Descent, o algoritmo del gradiente estocástico, o gradiente descendiente incremental, es un método interactivo para optimizar una función objetivo derivable, perfecta para la regresión lineal.

A partir de este momento, tienes tu modelo preprado. Ahora debes entrenarlo con algunos valores.

¿Cómo entrenar un modelo en TensorFlow.js?

Para entrenar nuestro modelo con un par de valores de y=2x-1, primero puedes definir dos tensores con forma 6,1. Un tensor contendrá los valores de x y el otro los valores de y.

// Datos de entrenamiento
const xs = tf.tensor2d([-1, 0, 1, 2, 3, 4], [6, 1]);
const ys = tf.tensor2d([-3, -1, 1, 3, 5, 7], [6, 1]);

Luego llamas el método model.fit y le pasas los dos tensores.

// Entrenando el modelo
model.fit(xs, ys, {epochs: 500}).then(() => {
});

Seguro que te ha llamado la atención el tercer parámetro con la propiedad epochs y el valor 500. Con esto, básicamente, estamos especificando cuántas veces TensorFlow.js pasa por el conjunto de entrenamiento.

¿Cómo predecir un valor en TensorFlow.js?

Cuando finaliza el entrenamiento el método retorna una promesa que te permite registrar una función de devolución de llamada. Dentro de esta función de devolución de llamada podemos predecir el valor de y basado en un valor de x, utilizando el método model.predict:

// Entrenando el modelo
model.fit(xs, ys, {epochs: 500}).then(() => {
 //Usamos el model para predecir valores
model.predict(tf.tensor2d([4], [1,1])).print();
});

Debes tomar especial atención que model.fit espera recibir como valor de entrada un parámetro en forma de tensor. Estamos pasando un tensor con un solo valor, el 4. Llamamos la función print(), porque queremos ver el resultado en la consola de navegador.

Tensor[[6.9979601],]

Como puedes ver en la consola del navegador, el valor predicho es 6.9979601. Este valor está muy cerca de 7, que será el valor exacto de y de la función y=2x-1, con x=4. ¿Qué te parece?

Conclusión

Cómo has podido ver, crear un modelo, entrenarlo y predecir un resultado es relativamente fácil utilizando TensorFlow.js. Te animo a seguir jugando con este ejemplo, y otros ejemplos oficiales de Tensorflow. Si tienes alguna duda, coméntalo abajo!

Crees que TensorFlow.js es útil para tu producto?¡Coméntalo abajo!

Foto: @your_photo @freepik