Matlab: toolbox de redes neuronales

Para trabajar con redes neuronales, seguramente podremos encontrar con una simple búsqueda en Internet un gran número de API’s y frameworks que implementen por nosotros la estructura de la mayor parte de los tipos de redes y la funciones necesarias para trabajar con ellas. Uno de estos frameworks es el Toolbox que matlab posee, que nos ofrece una implementación genérica de redes neuronales, así como implementaciones de redes neuronales concretas como las perceptrón, backpropagation, Som, etc.

Estructura

Matlab utiliza una estructura única que nos dará acceso a todas las propiedades de la red neuronal, independientemente del tipo que esta sea, de manera que utilizando esta propiedad podremos modificar las entradas, capas, conexiones, pesos, etc. De esta manera una vez configurada la red neuronal según nuestras necesidades invocaremos las funciones de manipulación de redes neuronales disponibles en matlab, (simulación, entrenamiento, inicialización, etc.), pasándole como parámetro la estructura de la red neuronal.

net = network;

Si ejecutamos el comando anterior y visualizamos el contenido de la variable myNetwork se nos vializará la estructura mencionada, la cual se puede dividir en cinco secciones:

  1. Arquitectura:

    Define las características básicas de la red neuronal, número de entradas, capas, conexiones de bias, etc.

  2. Subobjetos:

    Contiene referencias a las subestructuras de la red neuronal, que nos permitirán configurar las propiedades de los distintos componentes que forman la red (capas, entradas, salidas, etc.).

  3. Funciones:

    Funciones principales de la red neuronal, utilizadas para ejecutar las operaciones de inicialización, entrenamiento o simulación.

  4. Parámetros:

    Configuración de los parámetros asociados a las funciones seleccionadas en el bloque de funciones.

  5. Valores:

    Aquí se definen las matrices con los valores de los pesos de entrada, conexiones entre capas y bías.

Funciones

Una vez creada la red neuronal, para trabajar con la misma, podremos utilizar las siguientes funciones para realizar las operaciones típicas:

  1. Inicialización (net = init(net)):

    Mediante la función de inicialización, obtenemos una red neuronal con los valores de los pesos y bias actualizados según las funciones de inicialización que le hayamos asociado a la red, mediante su propiedad net.initFcn, o bien net.layers{i}.initFcn y net.biases{i}.initFcn.

  2. Entrenamiento ([net, tr, Y, E, Pf, Af] = train(net, P, T, Pi, Ai, VV, TV);):

    Realiza el entrenamiento de la red neuronal, modificando los pesos asociados a las conexiones entre las diferentes capas y neuronas de la misma. Para esto, debemos indicar unos patrones de entrada a la red (P, matriz de dimenesiones MxN siendo M la suma de los tamaños de las capas de entrada de la red neuronal, y N el número de patrones que deseamos aplicar en el entrenamiento). En caso de ser un entrenamiento supervisado también indicaremos los targets (T, matriz de MxN), con estos datos la matriz de patrones se aplica a la red neuronal, y el toolbox utilizando las funciones de entrenamiento que le hemos indicado en las propiedades “trainFcn” se encargará de actualizar los pesos asociados a las conexiones de la red. Los resultados del entrenamiento los obtendremos en la variable de retorno Y y los errores para cada patrón de entrada respecto a la salida esperada en la variable de retorno E.

  3. Simulación ([Y, Pf, Af, E, perf] = sim(net, P, Pi, Ai, T)):

    Función parecida a la anterior pero que no actualizará los pesos de la red neuronal. Una vez que tengamos entrenada la red neuronal y  esta ofrezca unos resultado válidos, utilizaremos esta función para analizar nuevos patrones de entrada.

Redes neuronales conocidas

Normalmente a la hora de trabajar con redes neuronales, querremos trabajar con un tipo de red neuronal concreto, el cual se ajuste mejor a nuestras necesidades. En este caso en vez de utilizar la función “network” para la creación de la estructura base, podemos utilizar funciones específicas para cada tipo de red neuronal, de manera que la estructura base que matlab nos devuelva tenga una configuración de capas de entrada, ocultas, conexiones etc apropiada para el tipo de red neuronal deseado.

  1. Perceptron: newp(P,S)
  2. Backpropagation: newff(P, [S1,…., Sn])
  3. Radiales: newgrnm(P,T)
  4. Mapas Autoorganizados: newsom(P,S)

Bibliografía

  1. http://www.mathworks.com/ : página oficial de matlab.
  2. http://www.mathworks.com/products/neuralnet/ : documentación oficial del toolbox de redes neuronales.

18 comentarios hacia “Matlab: toolbox de redes neuronales”

  1. Muy interesante tu resumen sobre redes neuronales. Es perfecto como introducción al gran publico.

    Te escribo porque tal vez te interese echarle un vistazo a un proyecto que hice para la universidad. Use redes neuronales para reconocer gestos de ratón.

    En vez de utilizar Matlab como hicistes tu, me decante por usar C++ y la librería Libann. El programa es sencillo pero bastante efectivo.

    Un saludo y felicidades por el blog.

  2. ivannal Dijo:

    hola! estoy haciendo un curso de RNA y tengo q presentar un practico hecho en matlab…podrias pasarme un ejemplo de som? usando datos d entrenamiento q están en un archivo de texto…por ejemplo la famosa base de la planta d iris…muchas gracias

  3. Muchas gracias botrules por tu comentario. Pues sí que me ha parecido interesante tu trabajo sobre los gestos del ratón, yo en su día hice algo parecido pero más sencillo para interpretar caracteres numéricos.

    Lo de la librería Libann, también es interesante, como digo siempre, para trabajar con redes neuronales existen muchísimas herramientas y librerisa, y cada uno elige la que más le gusta segun las necesidades.

    Un saludo y muchas gracias.

  4. [...] interfaz COM En un post anterior he hablado sobre el toolbox de redes neuronales que matlab nos ofrece como implementación alternativa de todos los algoritmos y estructuras [...]

  5. Edgar Uyuquipa Dijo:

    hola espero que me colaboren com informacion sobre matlab toolbox
    donde puedo encontrar el programa y ejemplos de programacion

  6. hola!!! estudio en la UANL y estoy llevando una materia de metodos computacionales avanzados, y apenas voy comprendiendo esto de las redes neuronales, esta muy interesante este resumen del matlab ya que es con lo que tengo que trabajar este semestre, queria pedir un favor si es posible, que si hubiera manera ke que me facilitara un pequeño programa el mas sensillo de redes neurales de matlab que tenga para ver si lo comprendo mejor y asi aprender un poco mas acerca de esto. Bueno muchas gracias, saludos!!!

  7. Hola Edgar, en la página de Matlab http://www.mathworks.com puedes encontrar información sobre como obtener el producto, pero debes saber que no es gratuito, lo que sí se puede es obtener una versión de prueba por un periodo determinado. Sobre el tema de ejemplos de programación, en la propia página del producto, disponemos de muchísima documentación en línea, tanto del producto en general como de los diferentes toolboxes de los que dispone (http://www.mathworks.com/access/helpdesk/help/helpdesk.html).

    Un saludo,

  8. hola hice mi tesis en prediccion del efecto de un insecticida usando redes neuronales del matlab pero solo utilize la funcion neff; asigné valores a los parametros involucrados, anotaba mi mse, y cerraba y volvia a abrir el matlab, determinando así el mse menor, asi determine el numero de neuronas, funcion de trasferencia de la CO y CS,numero de iteraciones, pero el momento y la taza de aprendizaje me salian con mse igual en todo momento quisiera saber si el procedimineto que utilize es el adecuado garcias Jose

  9. Hola neto, si lo que quieres es comprender el funcionamiento de las redes neuronales en general y el toolbox de matlab como implementación de las mismas, creo que lo mejor es que intentes pensar en un problema típico en el que se apliquen y lo intentes resolver tu mismo :-) . Por ejemplo, un problema muy típico y sencillo que se suele utilizar como ejemplo en bibliografía de redes neuronales es el de reconocimiento de caracteres o dígitos escritos a mano alzada.

    La idea es que alguien pueda escribir por ejemplo dígitos del cero al nueve con el ratón y aplicar una red neuronal para detectar el dígito de que se trata. Para facilitar el problema, a modo didáctico, se puede limitar la superficie de dibujo donde se trazarán los dígitos, a una cuadrícula supongamos de 15×15 (de esta manera partimos de un espacio de variables pequeño). Una vez trazado el dígito sobre dicha cuadrícula generaremos un vector con los datos de la misma que aplicaremos como entrada a la red neuronal obteniendo como salida el dígito concreto de que se trata.

    Para la creación de la red neuronal puedes probar con una backpropagation (newff) con una capa de entrada de tamaño igual al tamaño del vector generado a partir de la imagen (225 en este caso) y una capa de salida con tamaño igual al número de dígitos que quieras reconocer. En las capas ocultas puedes probar diferentes configuraciones.

    Para entrenar la red neuronal, generas una serie de patrones para todos los dígitos (varios para cada dígito) y para cada patrón creas un vector de diez elementos que será los targets de la red indicando la salida esperada. Por ejemplo para un patrón del dígito 0 el tarjet será: [1; 0; 0; 0; 0; 0; 0; 0; 0; 0] salida que interpretamos que corresponde al dígito cero.

    Una vez entrenada la red neuronal, puedes utilizarla función sim para aplicar cualquier patrón de entrada y ver si la salida que se te genera es la adecuada. La idea es que la salida correspondiente al dígito correcto esté “cerca” del valor 1 y las demás “cerca” del valor cero. Puesto que lo que hará la red neuronal durante el entrenamiento es “aprender” a reconocer patrones similares en sus entradas con una salida determinada (esto es lo que son las redes neuronales “reconocedores de patrones”).

    Este ejemplo puede ser muy didáctico porque trabajamos con unos datos de entrada (el digito trazado con el ratón) que a priori no es una información apta para aplicar directamente a la red neuronal, por lo que se hace necesario una pequeña fase de preprocesamiento para pasar de dicha información a una representación válida (vectores numéricos) para aplicar a la red neuronal. Esto es un escenario típico en estos sistemas (Obtención de datos, preprocesamiento, procesado y obtención de resulados).

    Bueno, esto es todo, espero haberte servido de ayuda. Si te interesa el ejemplo y tienes alguna duda y me la quieres comunicar, estaría encantado en intentar ayudarte ( aunque tarde una semana … :-) )

    Un saludo.

  10. Poncos: me parece interesantisimo lo que nos cuentas en tu blog.

    Queria compartir contigo una serie de dudas que tengo a ver si es que por un lado me puedes ayudar, o por otro interesar en el tema. Tengo la posibilidad de introdudirme en el tema de las redes neuronales gracias a el trabajo que realizo un profesor mio. En su tesis doctoral uso redes neuronales para analisis de patrones (tipico en este campo), pero aplicado a espectros de rayos X aplicados sobre muestras de particulas de aire (la idea era reconocer la concentracion de metales que hay en el aire, usando NN). Todo bien, pero ahora quiere hacer mayor trabajo al respecto. Asi es que estoy introduciendome al tema para poder trabajar junto a el.

    Resulta que contamos con la ultima version de matlab (compro la de este 2008) y la forma en la que se trabajan las redes Backpropagation no es la misma que en versiones anteriores, y no he logrado pillar como hacerlo funcionar correctamente. de hecho la forma en la que muestras el ejemplo, ya no es la forma en la que se trabaja ahora, y no he logrado encontrar ejemplos claros al respecto.

    sabes de esto algo tu? te interesa de algun modo el tema? quizas podria mostrarte la forma en la que estamos trabajando.

    saludos

  11. Hola serroba, la verdad que no estaba al tanto del problema que me cuentas sobre el matlab 2008, de momento continuo con la versión anterior pero si que es cierto que estoy echando un vistazo a la versión 2008 de momento como evaluación pero todavía no he investigado lo suficiente.

    Sí que me parece muy interesante lo que me comentas sobre el proyecto y el tema del matlab 2008, así que comenzaré investigando el tema ese del matlab 2008 a ver si te puedo echar una mano.

    Un saludo.

  12. hola a todos, alguien tiene alguna simulacion en matlab interesante que no se encuentre publicada en el internet? por favor haganmelo saber lo antes posible, cualquiera esta bien, no muy complicada ocn las funciones basicas

  13. Buena informacion….gracias!!

  14. ALGUIEN ME PUEDE AYDAR A CONFECCIONAR UNA SIMULACION EN MATLAB PARA UN SENSOR EFECTO HALL QUE CONSISTE EN APLICAR UN CAMPO MAGNETICO AL CHIP POR EL CUAL CIRCULA UNA CORRIENTE Y DA COMO RESULTADO UN VOLTAJE HALL

  15. ALGUIEN ME PUEDE AYDAR A CONFECCIONAR UNA SIMULACION EN MATLAB PARA UN SENSOR EFECTO HALL QUE CONSISTE EN APLICAR UN CAMPO MAGNETICO AL CHIP POR EL CUAL CIRCULA UNA CORRIENTE Y DA COMO RESULTADO UN VOLTAJE HALL (se pagarà , comunicar bernoalmanza@yahoo.es

    • Hola berno, si quieres, yo podría intentar ayudarte con este problema de aplicación de redes neuronales, aunque no es que sepa mucho del ámbito en concreto en el que estás trabajando.

      Lo primero sería tener claro que es lo que quieres hacer, que por lo que comentas me imagino que será algo como una red neuronal que a partir de unos datos de entrada que representen las propiedades de un campo magenético que deseamos aplicar, nos ofrezca como salida una predición del voltaje Hall asociado a dicho campo magnético.

      Lo segundo sería ver donde tienes problemas o donde estás atascado e intentar resolverlo juntos.

      Un saludo, si quieres podemos continuar por correo “colladox@esdebian.org”.

  16. Hola chicos, trabajo con redes neuronales también pero me hace falta saber, exactamente que hace el entrenamiento cuando le pasas los parámetros VV y TV en la función train.
    Necesito una explicación más detallada del porque se realiza internamente una prueba y una validación.
    Gracias

  17. yeestrada Dijo:

    hola, diganme que va mal aqui….

    %function ret = red(s)
    letraA = [ 0 0 1 0 0 ...
    0 1 0 1 0 ...
    0 1 0 1 0 ...
    1 0 0 0 1 ...
    1 1 1 1 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ]‘;
    letraB = [ 1 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 0 ]‘;
    letraC = [ 0 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 1 ...
    0 1 1 1 0 ]‘;
    letraD = [ 1 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 0 ]‘;
    letraE = [ 1 1 1 1 1 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 1 1 1 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 1 1 1 1 ]‘;
    letraF = [ 1 1 1 1 1 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 1 1 1 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ]‘;
    letraG = [ 0 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 1 1 ...
    1 0 0 0 1 ...
    0 1 1 1 0 ]‘;
    letraH = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ]‘;
    letraI = [ 0 1 1 1 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 1 1 1 0 ]‘;
    letraJ = [ 1 1 1 1 1 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    1 0 1 0 0 ...
    0 1 0 0 0 ]‘;
    letraK = [ 1 0 0 0 1 ...
    1 0 0 1 0 ...
    1 0 1 0 0 ...
    1 1 0 0 0 ...
    1 0 1 0 0 ...
    1 0 0 1 0 ...
    1 0 0 0 1 ]‘;
    letraL = [ 1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 1 1 1 1 ]‘;
    letraM = [ 1 0 0 0 1 ...
    1 1 0 1 1 ...
    1 0 1 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ]‘;
    letraN = [ 1 0 0 0 1 ...
    1 1 0 0 1 ...
    1 1 0 0 1 ...
    1 0 1 0 1 ...
    1 0 0 1 1 ...
    1 0 0 1 1 ...
    1 0 0 0 1 ]‘;
    letraN2 = [ 1 1 1 1 1 ...
    0 0 0 0 0 ...
    1 0 0 0 1 ...
    1 1 0 0 1 ...
    1 0 1 0 1 ...
    1 0 0 1 1 ...
    1 0 0 0 1 ]‘;
    letraO = [ 0 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    0 1 1 1 0 ]‘;
    letraP = [ 1 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ...
    1 0 0 0 0 ]‘;
    letraQ = [ 0 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 1 0 1 ...
    1 0 0 1 0 ...
    0 1 1 0 1 ]‘;
    letraR = [ 1 1 1 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 1 1 1 0 ...
    1 0 1 0 0 ...
    1 0 0 1 0 ...
    1 0 0 0 1 ]‘;
    letraS = [ 0 1 1 1 0 ...
    1 0 0 0 1 ...
    0 1 0 0 0 ...
    0 0 1 0 0 ...
    0 0 0 1 0 ...
    1 0 0 0 1 ...
    0 1 1 1 0 ]‘;
    letraT = [ 1 1 1 1 1 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ]‘;
    letraU = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    0 1 1 1 0 ]‘;
    letraV = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    0 1 0 1 0 ...
    0 0 1 0 0 ]‘;
    letraW = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ...
    1 0 1 0 1 ...
    1 1 0 1 1 ...
    1 0 0 0 1 ]‘;
    letraX = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    0 1 0 1 0 ...
    0 0 1 0 0 ...
    0 1 0 1 0 ...
    1 0 0 0 1 ...
    1 0 0 0 1 ]‘;
    letraY = [ 1 0 0 0 1 ...
    1 0 0 0 1 ...
    0 1 0 1 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ...
    0 0 1 0 0 ]‘;
    letraZ = [ 1 1 1 1 1 ...
    0 0 0 0 1 ...
    0 0 0 1 0 ...
    0 0 1 0 0 ...
    0 1 0 0 0 ...
    1 0 0 0 0 ...
    1 1 1 1 1 ]‘;
    alfabeto = [letraA,letraB,letraC,letraD,letraE,letraF,letraG,letraH,letraI,letraJ,letraK,letraL,letraM,letraN,letraN2,letraO,letraP,letraQ,letraR,letraS,letraT,letraU,letraV,letraW,letraX,letraY,letraZ];
    deseadas = eye(27);
    red = newff(minmax(alfabeto),minmax(deseadas),10);

    img = imread(‘a’, ‘JPG’);
    p = rgb2gray(img);
    %figure, imshow(p);

    %Red ENTRENADA CON RUIDO
    load eje2_w1.dat
    load eje2_b1.dat
    load eje2_w2.dat
    load eje2_b2.dat

    c=clock;
    semilla=c(1)*c(2)*c(3)*c(4)*c(5);
    rand(‘twister’,semilla) %rand(‘seed’,semilla)
    red.IW{1,1} = eje2_w1; red.b{1} = eje2_b1;
    red.LW{2,1} = eje2_w2; red.b{2} = eje2_b2;

    A = sim(red,p);
    AA = compet(A);

    ret=alfabeto*AA;

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.