Clasifica datos entrenando tu propia red neuronal Esteban Quezada • 07/2020

Introducción

Una red neuronal puede ser alimentada de grandes cantidades de datos, esta red al procesar estos datos, nos permite realizar clasificaciones y regresiones de la información. En este artículo procederemos a alimentar una red neuronal de información la cual usaremos posteriormente para hacer estimaciones en base a los datos usados.

Como ejemplo usaremos un cuadrado, supongamos que tenemos un cuadrado de dimensiones 1000 x 1000 donde 0,0 es el lado superior izquierdo y 1000,1000 es el lado inferior derecho. Usaremos este archivo .json llamado coordenadas.json que contiene 41 bloques de coordenadas que definen un punto en el cuadro y una descripción de estos. Nuestro objetivo es alimentar a la red neuronal con esta información para luego pasarle otros valores que no se encuentren en el .json y que esta pueda clasificar si la coordenada corresponde a la izquierda superior, la izquierda inferior, la derecha superior o la derecha inferior del cuadro.

Requisitos

Para llevar a cabo este tutorial necesitamos:

  • Un editor de texto. (Se recomienda usar vscode).
  • Tener instalado NodeJs con NPM.
  • Un navegador web como Firefox, Chrome o Edge Chromium.

Creación de archivos

Creamos una carpeta y colocamos los siguientes archivos:

recursos/

index.html

index.js

Dentro de la carpeta recursos/ colocaremos el archivo coordenadas.json.

En el archivo index.html colocamos el siguiente código, que básicamente es traer la librería ml5.js en el head.

<html>

<head>
  <meta charset="UTF-8">
  <title>Clasifica datos entrenando tu propia red neuronal</title>
  <script src="https://unpkg.com/ml5@0.4.3/dist/ml5.min.js"></script>
</head>

<body>
  <script src="index.js"></script>
</body>

</html>

En el archivo index.js colocamos lo siguiente (código explicado en los comentarios):

window.onload = () => {
  /**
   * Opciones de la red neuronal
   * dataUrl: url del archivo .json donde están nuestros datos.
   * task: Tipo de tarea a ejecutar en la red, para este ejemplo usaremos 'classification'
   * inputs: Datos de entrada, es decir, la fuente de datos usados para alimentar la red.
   * outputs: Datos de salida, es decir, la descripción de los datos de entrada.
   * debug: Define si se muestra o no la visualización del entrenamiento de la red neuronal en el html.
   */
  const options = {
    dataUrl: 'recursos/coordenadas.json',
    task: 'classification',
    inputs: ['x', 'y'],
    outputs: ['label'],
    debug: true,
  }

  // inicializamos la red neuronal
  const nn = ml5.neuralNetwork(options, normalize)

  // normalizamos los datos de esta
  function normalize () {
    nn.normalizeData()
    train()
  }

  // entrenamos el modelo de datos
  function train () {
    /**
     * epochs: En términos de redes neuronales, un 'epoch' se refiere a un ciclo completo sobre los datos de entrenamiento.
     * batchSize: Bloques de datos en que la información será procesada.
     * 
     * No hay una cantidad específica de epochs que se necesitan, pero se pueden hacer pruebas para encontrar la cantidad óptima de acuerdo a los resultados.
     */
    const trainigOptions = {
      epochs: 250,
      batchSize: 12,
    }
    nn.train(trainigOptions, classify)
  }

  // una vez entrenada nuestra red neuronal, procedemos a probar como se comporta frente a datos desconocidos.
  function classify () {
    // en este ejemplo le estamos pasando las coordenadas 300,350 las cuales corresponden al lado inferior izquierdo.
    const input = {
      x: 300,
      y: 350,
    }
    nn.classify(input, handleResults)
  }

  function handleResults (error, results) {
    // en caso de error, lo colocamos en consola
    if (error) {
      console.log(error)
      return
    // si todo es un éxito, podremos ver en la consola del navegador los resultados de la clasificación realizada.
    } else {
      console.log(results)
    }
  }
} 

Ejecución del código

Instalamos un servidor ligero llamado serve. Abrimos la consola de comandos y colocamos:

npm install -g serve

Luego, una vez se instala serve, en la carpeta del proyecto, abrimos la consola y colocamos:

serve

Por defecto, esto crea un servidor sencillo que corre en http://localhost:5000. Al navegar a este url podemos abrir las herramientas para desarrolladores del navegador y ver mientras se procesan los datos en nuestra red neuronal. Al ejecutar este ejercicio podremos visualizar un gráfico similar a este:

Y en la consola obtener resultados aproximados a estos:

[
  { label: 'izquierda-superior', confidence: 0.8469865322113037 },
  { label: 'izquierda-inferior', confidence: 0.09941432625055313 },
  { label: 'derecha-superior', confidence: 0.0454748310148716 },
  { label: 'derecha-inferior', confidence: 0.008124231360852718 },
]

Podemos visualizar que la red neuronal clasificó con éxito que las coordenadas corresponden al lado superior izquierdo con una confidencia del 0.847 o 84.7%. Podemos probar con distintas coordenadas y ver si la estimación de la red neuronal, en base a los datos con los que fue alimentada, sigue siendo acertada.

Probando para { x: 800, y: 150 }:

[
  { label: 'derecha-superior', confidence: 0.9378078579902649 },
  { label: 'izquierda-superior', confidence: 0.05480305105447769 },
  { label: 'derecha-inferior', confidence: 0.007157310843467712 },
  { label: 'izquierda-inferior', confidence: 0.0002319106279173866 },
]

De acuerdo a los resultados, podemos observar que la clasificación fue nuevamente exitosa con un 93% de confidencia para el lado superior derecho.

Con estos ejemplos podemos tener un vistazo del potencial de las redes neuronales en la clasificación de información desconocida en base a datos usados para entrenarla.

Compartir