Bit - loader

Machine Learning para Apps Web con Tensor Flow JS


Netmind - Machine Learning para Apps Web con Tensor Flow JS    Artículo | Machine Learning
Ricardo Ahumada | 05/10/18

Hoy en día el Machine Learning (ML) está de moda, entre otros aspectos debido a la aparición de un sin fin de frameworks con requerimientos asequibles y a la vez con mucha potencia.

 

A principios de año Google lanzó una versión para navegador de su magnífico framework TensorFlow. En su origen, TensorFlow fue fruto del trabajo de investigadores e ingenieros de Google Brain Team que formaban parte del grupo de investigación de Machine Learning de Google.

TensorFlowJs crea una nueva frontera del ML en el mundo Javascript, lo que permite literalmente entrenar un algoritmo en el navegador o usarlo en proyectos con NodeJS.

 

Esto nos permite, como veremos en este artículo, nuevas estrategias para implementar proyectos que usen la potencia del Machine Learning, liberando a la vez las necesidades y requerimientos del lado del Backend (siempre que los proyectos no sean demasiado complejos o grandes).

 

Machine Learning en el navegador, una nueva perspectiva

TensorFlow fue desarrollado en 2011 en Google como su librería para aplicaciones de Machine Learning (ML)Deep Learning(DL) en Google. Se convirtió en código abierto en 2015 bajo la licencia de Apache.

 

Está construido en C ++, lo que permite que el código se ejecute a un nivel muy bajo. Además tiene enlaces con varios lenguajes como Python, R y Java; lo que permite integrarlo en aplicaciones de estas tecnologías.

 

Convencionalmente, en JavaScript, ML/DL se implementa mediante el uso de una API que consume el modelo en el servidor. El cliente envia una solicitud a una API usando JavaScript para obtener resultados del servidor.

 

Machine Learning para Apps Web con Tensor Flow JS 0

 

En 2017, apareció un proyecto llamado Deeplearn.js, que apuntaba a habilitar ML/DL en JavaScript. Pero hubo reticencias sobre la velocidad, ya que, como es sabido JavaScript no puede ejecutarse en una GPU. Para resolver este problema, se introdujo el estándar WebGL. Esta es una interfaz de navegador para OpenGL. WebGL habilitó la ejecución de código JavaScript en la GPU.

 

En marzo de este año, el equipo DeepLearn.js se fusionó con el equipo TensorFlow en Google y pasó a llamarse TensorFlow.js.

 

TensorFlow JS

Tensorflow.js proporciona dos cosas:

  • Una CoreAPI, que gestiona el código de bajo nivel
  • Una LayerAPI, se suporpone a la CoreAPI e implementa una API con un nivel de abstracción mayor, lo que hace más sencillo programar aplicaciones.

 

El nombre de Tensor viene de la capacidad de este framework de trabajar con datos multidimensionales basados en matrices, los tensores.

La Wikipedia nos da una definición formal :

 

“En matemáticas, un tensor es un objeto geométrico arbitrariamente complejo que mapea de forma (multi-) lineal vectores geométricos, escalares y otros tensores a un tensor resultante. De este modo, los vectores y escalares mismos, a menudo usados ya en aplicaciones elementales de física e ingeniería, se consideran los tensores más simples.”

 

Poniéndolo en cristiano:

  • Un escalar es un solo número. Por ejemplo, x = 1
  • Un vector es una matriz de números. Por ejemplo, x = [1,2]
  • Una matriz es una matriz 2-D

([[1, 2],

  [3, 4],

  [5, 6]])

  • Un tensor es una matriz n-dimensional con n> 2

 

Machine Learning para Apps Web con Tensor Flow JS 1

 

Los tensores tienen la ventaja de ofrecer una representación de datos más natural: Por ejemplo, para un vídeo cualquiera, que consiste en imágenes obviamente co-relacionadas a lo largo del tiempo; a nivel de pixeles, matrices que se enlazan en la dimensión temporal…es decir un tensor.

 

Instalando TensorFlowJS

Para instalar Tensor Flow JS, si queremos usarlo en el navegador simplemente hace falta incorporar el script y luego usar su API.

 

<html>

  <head>

    <!-- Load TensorFlow.js -->

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.0"> </script>

  </head>

<body>

      Hello

  </body>

</html>


Si queremos instalarlo para un proyecto Node:

 

yarn add @tensorflow/tfjs

npm install @tensorflow/tfjs


Y en el archivo main.js

 

import * as tf from '@tensorflow/tfjs';


Usando la API de Tensor Flow JS

Vamos a realizar un ejemplo muy sencillo (que es el que viene en la introducción de la página de TensorFlow) para ilustrar los conceptos anteriores. Definiremos un modelo predictivo basado en regresión lineal.

 

1. Primero definimos el modelo para regresión lineal:

const model = tf.sequential();

model.add(tf.layers.dense({units: 1, inputShape: [1]}));

Aquí tf representa al objeto de TensorFlow. Creamos una constante que almacene el modelo. Le añadimos una capa de datos conectados con una salida monodimensional y que consuma una entrada monodimensional. Es decir escalares.

 

2. Preparamos el modelo para el entrenamiento:

model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

Aquí indicamos el loss como la raíz media cuadrática y el optimizador GradientDescentOptimizer.

 

3. Generamos algunos datos para el entrenamiento:

const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);

const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

Aquí definimos dos tensores monodimensionales ([4,1], indica 4 columnas y 1 fila) para los ejes X e Y. Cada columna es el valor yi para un xi concreto.

 

4. Entrenamos el modelo usando los datos:

model.fit(xs, ys, {epochs: 10})

Aquí introducimos los datos e indicamos 10 epocs para el entrenamiento (algo así como número de iteraciones para actualizar los pesos de las features)

El entrenamiento genera una promesa que cuando se consolide nos permitirá predecir valores.

 

5. Generamos la predicción con datos nuevos una vez el modelo esté entrenado:

model.fit(xs, ys, {epochs: 10}).then(() => {

        model.predict(tf.tensor2d([5], [1, 1])).print();

});

Nos suscribimos a a promesa e imprimimos la predicción para el tensor escalar 5 ([1,1], indica 1 columna, una fila)

 

6. Ejecutamos el script en su globalidad y vemos el resultado:

<html>

  <head>

    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.0"> </script>

    <script>

      const model = tf.sequential();

      model.add(tf.layers.dense({units: 1, inputShape: [1]}));

      model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

      const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);

      const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);

      model.fit(xs, ys, {epochs: 10}).then(() => {

        model.predict(tf.tensor2d([5], [1, 1])).print();

      });

    </script>

  </head>




  <body>

  </body>

</html>


Más allá de los escalares, toda la potencia de TensorFlow en Javascript

TensorFlowJS hereda toda la potencia de TensorFlow y muestra de ellos es la posibilidad de usar algoritmos muy sofisticados basados en redes neuronales para implementar funcionalidades realemente muy potentes, como el reconocimiento facial, de voz o escritura.

 

Todas estas funcionalidades están basadas en Redes Neuronales Convolucionales (CNN) que posibilitan el DeepLearning, tal como explica Alam Geitgey en su blog “Machine Learning is Fun”.

 

Las redes neuronales pueden resolver problemas complejos encadenando muchas neuronas simples. Por ejemplo, se puede crear una pequeña red neuronal para estimar el precio de una casa en función de cuántas habitaciones tiene, qué tan grande es y en qué barrio se encuentra:

 

Machine Learning para Apps Web con Tensor Flow JS 2

 

Para el caso más complejo de reconocimiento de escritura, necesitamos crear una red neuronal que sea capaz de interpretar imágenes a partir de sus bits (por ejemplo para alimentar una imagen  en nuestra red neuronal, simplemente tratamos la imagen de 18×18 píxeles como una matriz de 324 números:)

 

Machine Learning para Apps Web con Tensor Flow JS 3

 

Para procesar estos patrones simplemente tenemos que hacer más grande nuestra red neuronal…para que acepte 324 nodos (Deep Learning)

 

Machine Learning para Apps Web con Tensor Flow JS 4

 

Nuestra red nos indicará como salida la posibilida de que la imagen sea un 8 o también de que no lo sea.

Pero esta red tiene limitaciones debido a que procesa tamaños de imágenes concretas y además necesita un centrado de dichas imágenes para hacerlo bien.

 

Convolutional Neural Networks

La solución para imágenes más complejas son las CNN. Estas funcionan fraccionando las imágenes grandes en pequeños bloques de tamaño estándar tratables. La secuencia sería la siguiente:

 

1. Dividir la imagen en mosaicos superpuestos

Machine Learning para Apps Web con Tensor Flow JS 5

 

2. Alimentar cada mosaico de imagen en una pequeña red neuronal

Machine Learning para Apps Web con Tensor Flow JS 6

 

3. Guardar los resultados de cada bloque en una nueva matriz con los datos totales

Machine Learning para Apps Web con Tensor Flow JS 7

 

4. Downsampling: reducir la matriz en datos representativos

Machine Learning para Apps Web con Tensor Flow JS 8

 

5. Hacer la predicción

El proceso global se vería como esta imagen.

Machine Learning para Apps Web con Tensor Flow JS 9

 

Convolutional Neural Network en TensorFlowJS

Tensor Flow permite a través de su API generar estas redes neuronales, ya que el módulo tf.layers proporciona una API de alto nivel que facilita la construcción de una red neuronal. Proporciona métodos que facilitan la creación de capas densas (totalmente conectadas) y capas convolucionales, la adición de funciones de activación y la aplicación de regularización de abandono.

En el tutorial “Build a Convolutional Neural Network using Estimators” se puede observar y experimentar esta capacidad.

 

Asimismo, TensorFlow ya vienen con algoritmos más sofisticados entrenables, como el MNIST que permiten abordar tareas muy especializadas, tal como se propone en el tutorial “Training on Images: Recognizing Handwritten Digits with a Convolutional Neural Network”.

En este último caso se ha llevado al ámbito de javascript dicho entrenamiento de la red neuronal combolutiva.

 

Una vez entrenada esta red, podríamos usarla junto, por ejemplo a una API  canvas Javascript de HTML5 para reconocer caracteres, firmas o similar introducidas por un usuario en una aplicación.

 

Casos de uso de Tensor Flow

TensorFlowJS abre una serie de posibilidades para innovar e introducir el Machine Learning en la parte del cliente a través de Javascript.

 

Esta posibilidad se aumenta si somos capaces de entrenar los modelos antes de entregarlos para su uso en cliente usando la capa más baja, tal como se representa en este diagrama.

 

Machine Learning para Apps Web con Tensor Flow JS 10

 

Los experimentos que se pueden encontrar en interner van desde procesado de Big data, tal como cuenta Jacob Richter en el artículo “How we built a big data platform on AWS for 100 users for under $2 a month”.

 

Hasta el uso más avanzados de reconocimiento facial o de intensiones para juegos o aplicaciones más serias:

 

Se pueden acceder a estos y otros casos de uso en la web.

 

Reflexiones finales

Tal como hemos revisado en este pequeño artículo introductorio, TensorFlow pone al alcance del mundo front toda la potencia del Machine Learning para potenciar nuestras aplicaciones.

 

Esto nos puede permitir desacoplarnos del servidor para implementar servicios sofisticados, que basen su comportamiento en patrones reconocibles en el comportamiento del usuario.

En siguientes artículos profundizaremos en el uso de componentes más elaborados de esta librería.

 


Ricardo Ahumada

Ricardo Ahumada es Lead Trainer in Full Stack Development en BIT Computer Training y; Agile, DevOps, Big Data y Machine Learning trainer en Netmind. Es Ingeniero de Telecomunicaciones por la Universidad Pública de Navarra, Project Manager por la Universidad de Valencia. Está certificado en DevOps Practitioner por DASA y Priciples of Machine Learning por Microsoft. Tiene más de 18 años en la industria de Internet; tanto en la dirección de proyectos, como en diseño e implementación de productos digitales web; especialmente en tecnologías Java EE, web frontend y apps híbridas. Actualmente compagina la formación con la consultoría en negocios digitales y proyectos de emprendizaje digital.

Nuestro sitio utiliza cookies para análisis. Si no estás seguro de ello, echa un vistazo a nuestra política de privacidad.