Redes Neurales con brain.js en node.js
-
Hace un par de días navegando por github caí en la pagina del proyecto brain.js y me pareció algo muy interesante. brain.js es una pequeña librería de JavaScript para crear redes neuronales muy fácilmente.
Descargue la librería y rápidamente empecé hacer pruebas con node.js. Para que se den una idea de la sencillez del uso de esta librería miren como podemos crear una red neuronal con estas pocas líneas de código.
var net = new brain.NeuralNetwork();Identificación de Numero Primos
A continuación vamos a crear una pequeña aplicación javascript donde crearemos una red neuronal utilizando la librería brain.js. Luego entrenaremos la red neuronal para que pueda identificar números primos.
Definición de Wikipedia de números primos.
“En matemáticas, un número primo es un número natural mayor que 1 que tiene únicamente dos divisores distintos: él mismo y el 1”Como dijimos, nuestra aplicación JavaScript correrá sobre Node.js y antes de empezar a trabajar necesitaremos instalar el paquete brain.js con npm.
npm install brain;Ahora ya podemos empezar a escribir código, en las primeras líneas vamos a crear la red neuronal de la siguiente manera.
var brain = require('brain'); var net = new brain.NeuralNetwork({ hiddenLayers: [2] });Con esto creamos un objeto llamado net que representa nuestra red neuronal que tendrá 2 capas ocultas de neuronas. Seguidamente mostramos un gráfico de una red neuronal con 2 capas ocultas, muy parecida a la que hemos creado.
Como pueden observar en el gráfico, las redes neuronales poseen una capa de neuronas destinadas para la entrada de datos.
Nuestra red neuronal tendrá 32 entradas, osea que representara una palabra de 32 bits. Para ello necesitaremos procesar los datos de entrada para convertirlos en binario.function generarDatosDeEntrada(){ var patrones = new Array(13); patrones[0] = {input: GenerarPalabra(2, 32), output: [ 1 ]}; patrones[1] = {input: GenerarPalabra(3, 32), output: [ 1 ]}; patrones[2] = {input: GenerarPalabra(4, 32), output: [ 0 ]}; patrones[3] = {input: GenerarPalabra(5, 32), output: [ 1 ]}; patrones[4] = {input: GenerarPalabra(6, 32), output: [ 0 ]}; patrones[5] = {input: GenerarPalabra(7, 32), output: [ 1 ]}; patrones[6] = {input: GenerarPalabra(8, 32), output: [ 0 ]}; patrones[7] = {input: GenerarPalabra(11, 32), output: [ 1 ]}; patrones[8] = {input: GenerarPalabra(13, 32), output: [ 1 ]}; patrones[9] = {input: GenerarPalabra(17, 32), output: [ 1 ]}; patrones[10] = {input: GenerarPalabra(19, 32), output: [ 1 ]}; patrones[11] = {input: GenerarPalabra(23, 32), output: [ 1 ]}; patrones[12] = {input: GenerarPalabra(29, 32), output: [ 1 ]}; return patrones; } function GenerarPalabra(entrada_decimal, longitud){ var binario = entrada_decimal.toString(2); var longitud_binario = String(binario).length; var remanente_de_longitud = longitud > longitud_binario ? longitud - longitud_binario + 1 : longitud_binario; var binario_masc = new Array(remanente_de_longitud).join(0) + binario; binario_masc = binario_masc.split(''); var binario_arr = new Array(binario_masc.length); for(var i=0, len=binario_masc.length; i < len; i++){ binario_arr[i] = parseInt(binario_masc[i]); } return binario_arr; }Ya tenemos creada la red y también la función que generará los datos de entrada para la red, ahora necesitaremos comenzar el entrenamiento de la red.
net.train(generarDatosDeEntrada(), { callback: callback }); function callback(arr){ console.log(arr.error); }Como ven, la función train toma los datos de entrada y podemos especificar un callback para mostrar las interacciones y errores en tiempo real.
Luego de esto guardamos el archivo, personalmente puse el nombre sample.js. Ahora que ya tenemos todo esto podemos probar nuestra red.
Al ejecutar nuestro archivo sample.js primero se entrenara la red y mientras lo hace aparecerán la lista de errores en cada interacción y por ultimo el resultado para la ultima capa.
Si por ejemplo, queremos saber si al numero 5 la red neuronal lo interpreta como un numero primo llamamos a la función output de la siguiente manera.
var output = net.run(GenerarPalabra(5, 32));Archivo completo sample.js:
var brain = require('brain'); var net = new brain.NeuralNetwork({ hiddenLayers: [2] }); net.train(generarDatosDeEntrada(), { callback: callback }); function callback(arr){ console.log(arr.error); } var output = net.run(GenerarPalabra(3, 32)); console.log(output); function generarDatosDeEntrada(){ var patrones = new Array(13); patrones[0] = {input: GenerarPalabra(2, 32), output: [ 1 ]}; patrones[1] = {input: GenerarPalabra(3, 32), output: [ 1 ]}; patrones[2] = {input: GenerarPalabra(4, 32), output: [ 0 ]}; patrones[3] = {input: GenerarPalabra(5, 32), output: [ 1 ]}; patrones[4] = {input: GenerarPalabra(6, 32), output: [ 0 ]}; patrones[5] = {input: GenerarPalabra(7, 32), output: [ 1 ]}; patrones[6] = {input: GenerarPalabra(8, 32), output: [ 0 ]}; patrones[7] = {input: GenerarPalabra(11, 32), output: [ 1 ]}; patrones[8] = {input: GenerarPalabra(13, 32), output: [ 1 ]}; patrones[9] = {input: GenerarPalabra(17, 32), output: [ 1 ]}; patrones[10] = {input: GenerarPalabra(19, 32), output: [ 1 ]}; patrones[11] = {input: GenerarPalabra(23, 32), output: [ 1 ]}; patrones[12] = {input: GenerarPalabra(29, 32), output: [ 1 ]}; return patrones; } function GenerarPalabra(entrada_decimal, longitud){ var binario = entrada_decimal.toString(2); var longitud_binario = String(binario).length; var remanente_de_longitud = longitud > longitud_binario ? longitud - longitud_binario + 1 : longitud_binario; var binario_masc = new Array(remanente_de_longitud).join(0) + binario; binario_masc = binario_masc.split(''); var binario_arr = new Array(binario_masc.length); for(var i=0, len=binario_masc.length; i < len; i++){ binario_arr[i] = parseInt(binario_masc[i]); } return binario_arr; }




Una respuesta y contando...
esta super interesante esto,
creo que me enamore de ti jajaja…