Matlab: ejemplo backpropagation

Como veo que algunos en los comentarios piden un ejemplo completo de creación, entrenamiento y simulación de una red neuronal en matlab, en este post voy a mostrar un ejemplo simple sobre la aplicación de una red neuronal backpropagation, para el típico problema de reconocimiento de dígitos manuscritos del cero al nueve. Además, este ejemplo también servirá para ver un poco como funciona el toolbox de redes neuronales en la versión 2008 de matlab, puesto que en esta versión han modificado algo el interfaz del mismo.

A la hora de aplicar redes neuronales, y en general para cualquier problema de reconocimiento de patrones, hay una seríe de pasos que serán comunes a la mayoría de los problemas.

  1. Representación original de los datos
  2. Preprocesamiento de los datos originales para codificarlos en un formato apropiado para la red neuronal.
  3. Procesamiento de la información. (aplicación de la red neuronal)
  4. Interpretación de los resultados.

1. Representación de la información original.

Lo primero que deberemos tener en cuenta, será la representación original de los datos que deberemos procesar, en este caso, el de reconocimiento de dígitos manuscritos, vamos a partir de una imagen, o conjunto de píxles en blanco y negro que contendrán el dígito a reconocer.

2. Preprocesamiento de los datos originales para codificarlos en un formato apropiado para la red neuronal.

Para aplicar la información con el dígito manuscrito a la red neuronal, deberemos realizar algún tipo de procesamiento para obtener la información apropiada que le pasaremos como entrada a dicha red.

En este caso, lo que haremos será generar un array de valores enteros 0 o 1, de manera que un 1 significa que hay algo pintado y 0 no, de manera que este array de valores discretos será la información que pasaremos a la entrada de la red neuronal.

Algo a tener en cuenta es el tamaño del vector generado a partir de la imagen, por ejemplo si la imagen original tiene un tamaño de 200×200 pixels, y creamos un array con un valor para cada píxel de dicha imagen obtendríamos un array de 40.000 elementos siendo necesario una red neuronal con el mismo número de entradas. Para optimizar mejor esto, vamos a procesar tan solo aquella zona de la imagen donde esté el dígito manuscrito y además, vamos a dividir esta zona en una cuadrícula de por ejemplo 3×5, de manera que generaremos un vector de 15 elementos, correspondiendose cada elemento con una de esas zonas en las que hemos dividido el dígito manuscrito y en caso de que algún píxel de dicha zona esté pintado pondremos un uno y en caso contrario un cero.

3. Procesamiento de la información. Creación de la Red neuronal en matlab

Una vez tenemos creado el vector representando el digito manuscrito, queremos ser capaces de procesarlo para detectar el dígito real que el usuario a escrito. En este caso sencillo, nos centraremos en predecir los dígito enteros del 0 al 9, para lo cual vamos a utilizar una red neuronal de tipo backpropagation, y como implemetnación el toolbox de redes neuronales de matlab.

Como hemos dicho, la entrada de la red neuronal, será un array de 15 elementos conteniendo la información de los píxeles pintados en la imagen, así que necesitaremos una red neuronales de 15 entradas, de manera que en cada entrada se le aplicará un uno o un cero indicando la existencia de un trazo en dicha zona de la imagen.

Como el objetivo es reconocer 10 valores numéricos (del cero al 9), o mejor dicho, el objetivo es que la red neuronales aprenda a clasificar los patrones den entrada en 10 clases diferentes, la red neuronal dispondrá de 10 salidas, una para cada dígito, de manera que tan solo se activará la salida correspondiente al dígito reconocido.

3.1  Creación de la red neuronal

Para la creación y simulación de la red neuronal, hemos generado primero una serie de patrones de muestra para cada uno de los dígitos que queremos reconocer.


1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
1;1;1;1;0;1;1;0;1;1;0;1;1;1;1

En segundo lugar, también tenemos la información de la salida que la red neuronal deberá generar para cada uno de estos patrones.


1;0;0;0;0;0;0;0;0;0
1;0;0;0;0;0;0;0;0;0
1;0;0;0;0;0;0;0;0;0
1;0;0;0;0;0;0;0;0;0

Así, pues primero cargaremos dicha información en matlab.


load matlab_pattern.txt
load matlab_targets.txt

A continuación creamos la red neuronal con la función newff indicándole que queremos 20 neuronas para la capa oculta.


net = newff(matlab_pattern, matlab_targets,T,20);

Listo, ya tenemos la red neuronal creada con los parámetros por defecto. La interfaz de estas funciones del toolbox de redes neuronales, han cambiado en la versión 2008 de matlab, que es la que aquí estamos viendo, y en esta versión, además de que le estamos indicando en la propia creación un ejemplo de patrones y tarjets, matlab los utilizará para crear la red neuronal con una configuración adecuada, número de capas, tamaño de la capa de entrada, tamaño de la capa de salida, randos de entrada de la red neuronal, etc. Podemos navegar un poco por la estructura del objeto “net” para asegurarnos de que todo está correcto.


net.inputs{1}
net.numlayers
net.outputs{1}

3.2  Entrenamiento de la red neuronal

Una vez creada la red neuronal, y como ya tenemos los patrones de entrenamiento con sus respectivos targets cargados en matlab, tan solo nos queda invocar a la función train.


net = train(net,P,T);

Con esto matlab comenzará a entrenar la red neuronal hasta alcanzar el performance deseado, abriéndosenos una ventana con la información de dicho proceso.

3.3  Simulación de la red neuronal

Pues nada, una vez entrenada la red neuronal, ya podemos aplicar un patrón real a la entrada y ver en la salida la clase (o dígito) en la que se ha clasificado.


[Y, Pf, Af, E, perf] = sim(net, [1;1;1;0;0;1;0;1;1;1;1;0;1;1;1]);
YY =0.0000
0.0008
1.0013
0.0005
0.0003
0.0012
-0.0004
0.0004
-0.0006
0.0011

En este caso, de las diez salidas todas tienen un valor muy cercano a cero, excepto la salida correspondiente al dígito dos, que tiene un valor muy cercano a uno, siendo este el dígito reconocido.

4. Interpretación de los resultados

En este caso, los resultados son fáciles de interpretar como hemos visto en el apartado anterior, la salida de la red neuronal que tenga valor 1 (o que más se parezca al valor 1) será la que tomaremos como salida activa indicando el dígito reconocido.

Para terminar, simplemente mostraros una captura de pantalla de un pequeño prototipo que permite a un usuario dibujar caracteres a mano con el ratón y le muestra el dígito reconocido, realizado con la información aquí comentada y las interfaces externas que hemos visto en el post “Matlab: interfaz com”.

ejemplo_backpropagation

5. Código Fuente

El código del programa descrito en este artículo se encuentra disponigle en github «https://github.com/poncos/DigitRecognizer«. Espero que os sea útil.

70 respuestas to “Matlab: ejemplo backpropagation”

  1. Excelente trabajo. Te animo a que continúes por esta línea.

    • Hola amigo te agradesco tu informacion, sabes en realidad me gustaria saber si me pudieras explicar paso a paso como utilizaste la herramienta y el copdigo porfas de la otra interface externa para ver el grafico del numero 6 muchas gracias

  2. Tu informacion me sirvio de mucho, mil gracias a continuacion te anexo un codigo que es otro ejemplo usando backpropagation, el cual reconoce los numeros binarios del 0-9.

    Mil Gracias espero que mi codigo te sirva de algo.

    NOTA: este codigo necesita el toolbox 6.0 de matlab para que pueda correr sin problemas.

    % matlab_pattern.txt
    %
    % 0;0;0;0;0;0;0;0;1;1
    % 0;0;0;0;1;1;1;1;0;0
    % 0;0;1;1;0;0;1;1;0;0
    % 0;1;0;1;0;1;0;1;0;1

    % matlab_targets.txt
    %
    % 0;1;1;1;1;1;1;1;1;1
    % 0;0;1;1;1;1;1;1;1;1
    % 0;0;0;1;1;1;1;1;1;1
    % 0;0;0;0;1;1;1;1;1;1
    % 0;0;0;0;0;1;1;1;1;1
    % 0;0;0;0;0;0;1;1;1;1
    % 0;0;0;0;0;0;0;1;1;1
    % 0;0;0;0;0;0;0;0;1;1
    % 0;0;0;0;0;0;0;0;0;1

    clc;
    clear;
    load matlab_pattern.txt
    load matlab_targets.txt
    net = newff(matlab_pattern, matlab_targets,3,{},’trainlm’);
    net = init(net);
    net.divideFcn = »;
    net.trainParam.show = 50;
    net.trainParam.lr = 0.05;
    net.trainParam.epochs = 1000;
    net.trainParam.goal = 1e-5;
    net.trainParam.lr = 0.05;
    net.trainParam.lr_inc = 1.05;
    net = train(net,matlab_pattern,matlab_targets);
    [Y,E,perf] = sim(net,matlab_pattern);
    disp(‘ #0 #1 #2 #3 #4 #5 #6 #7 #8 #9’)
    disp(‘**************************************************************************************************’)
    Y
    disp(‘Realizado Por: ‘)
    disp(‘Miguel A Pita ‘)
    disp(‘Diego Lopez ‘)
    disp(‘Manuel Peraza ‘)
    disp(‘**************************************************************************************************’)

    %# matlab_pattern matlab_targets
    %————————————-
    %0 0000 000000000
    %1 0001 100000000
    %2 0010 110000000
    %3 0011 111000000
    %4 0100 111100000
    %5 0101 111110000
    %6 0110 111111000
    %7 0111 111111100
    %8 1000 111111110
    %9 1001 111111111

    Y muestra los siguentes resultados

    #0 #1 #2 #3 #4 #5 #6 #7 #8 #9
    **************************************************************************************************

    Y =

    0.3471 0.5747 0.8992 1.1503 1.0494 1.0284 1.0048 0.9118 0.9909 1.0433
    -0.0782 0.2480 0.7149 1.0827 1.0366 1.0298 1.0222 0.9053 0.9905 1.0482
    -0.1789 0.0637 0.4154 0.7095 0.9394 0.9946 1.0569 1.0113 0.9965 0.9915
    -0.0286 -0.0039 0.0422 0.1197 0.7931 0.9382 1.1022 1.1898 0.9856 0.8616
    0.0208 -0.0167 -0.0550 -0.0266 0.4239 0.6315 0.8663 1.0673 1.0532 1.0353
    0.0492 -0.0153 -0.0902 -0.0830 0.1172 0.3528 0.6192 0.8855 1.0426 1.1220
    0.0540 0.0021 -0.0555 -0.0377 -0.1187 0.1057 0.3596 0.6366 0.9435 1.1105
    -0.0342 -0.0044 0.0506 0.1408 -0.2413 -0.0761 0.1107 0.3222 0.7462 0.9855
    -0.0433 -0.0049 0.0566 0.1299 -0.1736 -0.0867 0.0115 0.1250 0.4112 0.5743

    Realizado Por:
    Miguel A Pita
    Diego Lopez
    Manuel Peraza
    **************************************************************************************************

  3. triviperules Says:

    buen trabajo amigo, solo quiero aprender a programar como tú, quisiera ver si me puedes ayudar, con alguna recomendaciones, tutoriales o lo que a ti te ha servido para aprender al maximmo matlab de antemano gracias.

    • Hola triviperules, muchas gracias por tu comentario.

      Como recomendación para aprender matlab, pues no se, hay mucha bibliografía disponible pero yo sobre todo, siempre he tirado de la documentación oficial de MathWorks que tienen muy buenos manuales en formato electrónico y online, tanto genéricos de Matlab como de cada uno de los toolboxes que podemos utilizar.

      Como introdución a matlab hay un manual en español que en su día utilicé, titulado «manual aprenda matlab 6.1 español spanish» que está en español por si se te atraganta el inglés. Como dije antes, si no se te atraganta el inglés le puedes echar un vistazo a la documentación oficial, por ejemplo el documento «Getting Started With Matlab».

      Si lo que quieres es documentación sobre los diferentes toolboxes, como el de redes neuronales, la documentación en español es bastante escasa, por lo que la documentación oficial es casi la única fuente.

      Por supuesto, siempre tenemos la ayuda del propio producto, que es muy útil y yo personalmente la utilizo mucho.

      Un saludo, y espero que mi información te sea útil.

  4. Cuando te dices «propio producto» te refieres a MathWorks?????

    • por producto me refiero al propio matlab, que trae una ayuda muy buena, bien a través del menú de Ayuda, o del comando help que puedes invocar desde la línea de comandos. A mi esta ayuda me ha sido muy útil.

      Un saludo,

  5. hola me parece genial este tema, no se si me podrias ayudar con con el codigo y en que matlab lo hiciste. te agradeceria bastante

  6. yercos Says:

    clc; clear all
    format long
    %nntuarn off

    p1=[1 1 1 1 1;1 0 0 0 1;1 1 1 1 1;1 0 0 0 1;1 0 0 0 1]; %A
    p2=[1 1 1 1 1;1 0 0 0 1;1 1 1 1 1;1 0 0 0 1;1 1 1 1 1];%B
    p3=[1 1 1 1 1;1 0 0 0 0;1 0 0 0 0;1 0 0 0 0;1 1 1 1 1];%C
    p5=[1 1 1 1 1;1 0 0 0 0;1 1 1 1 1;1 0 0 0 0;1 1 1 1 1];%E
    p6=[1 1 1 1 1;1 0 0 0 0;1 1 1 1 1;1 0 0 0 0;1 0 0 0 0];%F
    p7=[1 1 1 1 1;1 0 0 0 0;1 0 0 1 1;1 0 0 0 1;1 1 1 1 1];%G
    p8=[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];%H
    p9=[1 1 1 1 1;0 0 1 0 0;0 0 1 0 0;0 0 1 0 0;1 1 1 1 1];%I
    p10=[1 1 1 1 1;0 0 1 0 0;0 0 1 0 0;0 0 1 0 0;1 1 1 0 0];%J
    p12=[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];%K
    p13=[1 1 1 1 1;1 0 1 0 1;1 0 1 0 1;1 0 1 0 1;1 0 1 0 1];%L
    p14=[1 1 0 0 1;1 0 0 0 1;1 0 1 0 1;1 0 0 0 1;1 0 0 1 1];%M
    p15=[1 1 1 1 1;1 0 0 0 1;1 0 0 0 1;1 0 0 0 1;1 1 1 1 1];%N
    p16=[1 1 1 1 1;1 0 0 0 1;1 1 1 1 1;1 0 0 0 0;1 0 0 0 0];%O
    p19=[1 1 1 1 1;1 0 0 0 0;1 1 1 1 1;0 0 0 0 1;1 1 1 1 1];%P
    p20=[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];%S
    p21=[1 0 0 0 1;1 0 0 0 1;1 0 0 0 1;1 0 0 0 1;1 1 1 1 1];%T
    p23=[1 0 1 0 1;1 0 1 0 1;1 0 1 1 1;1 0 1 0 1;1 1 1 1 1];%U
    p24=[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];%W
    p25=[1 0 0 0 1;1 0 0 0 1;1 1 1 1 1;0 0 0 0 1;1 1 1 1 1];%X
    p26=[1 1 1 1 1;0 0 0 1 0;0 0 1 0 0;0 1 0 0 0;1 1 1 1 1];%Y

    p=[p1;p2;p3;p5;p6;p7;p8;p9;p10;p12;p13;p14;p15;p16;p19;p20;p21;p23;p24;p25;p26];
    t=[1;2; 3; 5; 6; 7; 8; 9; 10; 12; 13; 14; 15; 16; 19; 20; 21; 23; 24; 25; 26];

    red=newff(minmax(p),[21,21],{‘logsig’,’purelin’},’trainlm’,’learngdm’);

    red.trainParam.show=50;
    red.trainParam.lr=0.05;
    red.trainParam.mc=0.9;
    red.trainParam.max_perf_inc=1.04;
    red.trainParam.epochs=300;
    red.trainParam.goal=10e-5;
    [red,tr]=train(red,p,t);%AQUI ME SALE ERROR
    a=sim(red,p)
    e=t-a
    w1=red.IW{1,1}
    b1=red.b{1}
    w2=red.LW{2,1}
    b2=red.b{1}

    BUENO SI TENGO ESTAS ENTRADAS Y NECESITO UNA SALIDA QUE EQUIVALE AL NUMERO DE LA LETRA COMO HAGO PARA QUE EL ALGORITMO ESTE BIEN Y ME CORRA Y ADEMAS COMO HAGO PARA LAS LETRAS QUE SE PARECEN SI LO DESEAMOS ENTRAR EN UN DISPOSITIVO TACTIL QUE DONDE HAY ROSE HAY 1 Y DONDE NO HAY CONTACTO HAY 0, SI LAS LETRAS QUE SE PARECEN SON LAS KE NO APARECEN EN EL ALGORITMO PERO NECESITO QUE ESTEN TAMBIEN ALGUIEN ME PUEDE COLABORAR ES URGENTE MAXIMO HASTA MAÑANA

    • poncos Says:

      Hola yercos, el error que te da al invocar el entrenamiento de la red, seguramente se debe a que el número de columnas de la matriz T no es el adecuado, por lo que veo, estas generando una red neuronal con 26 salidas, así que para cada patrón de entrada deberías tener un target para comparar la salida, es decir una matriz con tantas columnas como patrones de entrada y tantas filas como el tamaño de la entrada de la red neuronal.

      Respecto a la matriz P con los patrones de entrada, veo que cada patrón lo pones como una matriz, yo te recomendaría que cada patrón que identifique un caracter a reconocer lo representes como un simple vector, por ejemplo las columnas de la matriz puestas una a continuación de la otra.

      Así, para un patrón de un caracter dado tendrías: [0; 0; 0; 1; 1; 1; 0; 0; 0; 1; 1; 1; …. 1; 1; 1 ] y el target asociado podría ser [0; 1; 0; 0; 0; 0; 0; … 0], es decir se activaría a uno tan solo la salida correspondiente al caracter reconocido.

      Un saludo.

      • yercos Says:

        graxx salu2

      • poncos Says:

        Me alegro mucho que te sirviera de ayuda mi comentario, ha sido un placer :-))))))

      • La idea es muy buena eso de ponerle cada carácter en una columna (p1=[1;1;1;1;1;1;0;0;0;1;1;1;1;1;1;1;0;0;0;1;1;0;0;0;1];%A) pero me pregunto como podría hacer para ponerlo de ese modo una imagen que cargo al matlab ya que me carga en filas y columnas.. ese es mi duda tal vez hacerlo mediante un ciclo for?? alguna otra idea que sepan?

  7. yercos Says:

    clc; clear all
    format long
    %nntwarn off

    p1=[1;1;1;1;1;1;0;0;0;1;1;1;1;1;1;1;0;0;0;1;1;0;0;0;1];%A
    p2=[1;1;1;1;1;1;0;0;0;1;1;1;1;1;1;1;0;0;0;1;1;1;1;1;1];%B
    p3=[1;1;1;1;1;1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1;1;1;1;1];%C
    p4=[1;1;1;1;1;1;1;0;0;1;1;1;0;0;1;1;1;0;0;1;1;1;1;1;1];%D
    p5=[1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1];%E
    p6=[1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1;0;0;0;0;1;0;0;0;0];%F
    p7=[1;1;1;1;1;1;0;0;0;0;1;0;0;1;1;1;0;0;0;1;1;1;1;1;1];%G
    p8=[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];%H
    p9=[1;1;1;1;1;0;0;1;0;0;0;0;1;0;0;0;0;1;0;0;1;1;1;1;1];%I
    p10=[1;1;1;1;1;0;0;1;0;0;0;0;1;0;0;0;0;1;0;0;1;1;1;0;0];%J
    p11=[1;0;0;0;1;1;0;0;1;0;1;1;1;0;0;1;0;0;1;0;1;0;0;0;1];%K
    p12=[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];%L
    p13=[1;1;1;1;1;1;0;1;0;1;1;0;1;0;1;1;0;1;0;1;1;0;1;0;1];%M
    p14=[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];%N
    p15=[1;1;1;1;1;1;0;0;0;1;1;0;0;0;1;1;0;0;0;1;1;1;1;1;1];%O
    p16=[1;1;1;1;1;1;0;0;0;1;1;1;1;1;1;1;0;0;0;0;1;0;0;0;0];%p
    p17=[1;1;1;1;1;1;0;0;0;1;1;0;1;0;1;1;0;0;1;1;1;1;1;1;1];%Q
    p18=[1;1;1;1;0;1;0;0;1;0;1;1;1;0;0;1;0;0;0;1;1;0;0;0;1];%R
    p19=[1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1];%S
    p20=[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];%T
    p21=[1;0;0;0;1;1;0;0;0;1;1;0;0;0;1;1;0;0;0;1;1;1;1;1;1];%U
    p22=[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];%V
    p23=[1;0;1;0;1;1;0;1;0;1;1;0;1;0;1;1;0;1;0;1;1;1;1;1;1];%W
    p24=[1;0;0;0;1;0;1;0;1;0;0;0;1;0;0;0;1;0;1;0;1;0;1;0;1];%X
    p25=[1;0;0;0;1;1;0;0;0;1;1;1;1;1;1;0;0;0;0;1;1;1;1;1;1];%Y
    p26=[1;1;1;1;1;0;0;0;1;0;0;0;1;0;0;0;1;0;0;0;1;1;1;1;1];%Z

    p=[p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20 p21 p22 p23 p24 p25 p26];

    t=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];

    net=newff(minmax(p),[26,1],{‘logsig’,’purelin’},’trainlm’);

    net.trainparam.show=50;
    net.trainparam.lr=0.05;
    net.trainparam.max_fail=5;
    net.trainparam.mem_reduc=1;
    net.trainparam.min_grad=1e-10;
    net.trainparam.mu=0.001;
    net.trainparam.mu_inc=10;
    net.trainparam.time=inf;
    net.trainparam.epochs=300;
    net.trainparam.goal=1e-5;

    [net,tr]=train(net,p,t);

    a=sim(net,p)

    e=t-a

    w1=net.IW{1,1}
    b1=net.b{1}
    w2=net.LW{2,1}
    b2=net.b{2}
    disp(‘Segundo parcial de IA’)
    disp(‘Realizado por: ‘)
    disp(‘Yeison Cortez’)

    Asi me quedo el algoritmo me sirvio de mucha ayuda tu recomendacion graxxx

    • Muy bueno pero ahí estas creando las letras, como harías capturandolas de una imagen?

      a=imread(‘caracteres\A.bmp’); b=imread(‘caracteres\B.bmp’);
      c=imread(‘caracteres\C.bmp’); d=imread(‘caracteres\D.bmp’);
      e=imread(‘caracteres\E.bmp’); f=imread(‘caracteres\F.bmp’);
      g=imread(‘caracteres\G.bmp’); h=imread(‘caracteres\H.bmp’);
      i=imread(‘caracteres\I.bmp’); j=imread(‘caracteres\J.bmp’);
      k=imread(‘caracteres\K.bmp’); l=imread(‘caracteres\L.bmp’);
      m=imread(‘caracteres\M.bmp’); n=imread(‘caracteres\N.bmp’);
      o=imread(‘caracteres\O.bmp’); p=imread(‘caracteres\P.bmp’);
      q=imread(‘caracteres\Q.bmp’); r=imread(‘caracteres\R.bmp’);
      s=imread(‘caracteres\S.bmp’); t=imread(‘caracteres\T.bmp’);
      u=imread(‘caracteres\U.bmp’); v=imread(‘caracteres\V.bmp’);
      w=imread(‘caracteres\W.bmp’); x=imread(‘caracteres\X.bmp’);
      y=imread(‘caracteres\Y.bmp’); z=imread(‘caracteres\Z.bmp’);

      p=[a b c d e f g h i j k l m n o p q r s t u v w x y z]; % Aqui esta mal ya que cada carácter esta en filas y columnas y lo recomendable seria que este en una sola columna como tu ejemplo que has hecho.. como lo harías para que este en una columna?

      t=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26];
      net=newff(minmax(p),[26,1],{‘logsig’,’purelin’},’trainlm’);

    • hola yercos una pregunta para hacer correr tu programa necesito el toolbox por he intentado hacerlo correr pero no funciona me sale error en
      net=newff(minmax(p),[26,1],{‘logsig’,’purelin’},’trainlm’);
      ayuda por favor soy nuevo en esto

  8. yercos Says:

    hola estoy buscando una propuesta para un proyecto en backpropagation o logica difusa y necesito no se y una ayudita donde pueden un manual de manejar tool de matlab se lo agradezco ke me puedan asesorar en un poryecto factible y ke me pueda garantizar un exito rotundo
    salu2

  9. Bladimir Says:

    programar de esta forma es una farza, matlab hace todo con sus funciones quiero el algoritmo de entrenamiento pero programado por uno no por matlab.

    esta clase de programacion en matlab es para los flojos que no saben procesamiento de señales ni redes neuronales, intenten implementar eso en un dsp o una fpga a ver si encuentran el toolbox de redes como en matlab

    • poncos Says:

      Hola Bladimir, en parte tienes razón, pero, en esta vida hay que ser práctico, y si para lo que tu quieres en un momento dado, te sirve algo que ya está hecho, no se debe nunca reinventar la rueda, sobre todo cuando lo que queremos no es implementar un algoritmo sin más, sino ver sus potenciales ventajas para un problema dado, en este caso, lo mejor (en mi opinión) es probar diferentes soluciones de la manera más rápida posible (prototipos), y una vez tengamos la solución adecuada, implementarla como nos convenga, bien sobre una fpga, una aplicación en C/C++, etc. Sí, que es cierto que hay entornos en los cuales conviene que uno se implemente sus propios algoritmos, sobre todo por temas de rendimiento, yo por ejemplo, estoy ahora mismo trabajando con FPGA’s, diseñando algoritmos paralelos para el sector de las telecomunicaciones (protocolos, deep packet inspection , etc), algoritmos que en otro entorno no tendrían complicación ninguna, pero que debido a las necesidades de rendimiento, en este caso se hace necesario su implementación de cero sobre un entorno nuevo.
      Un saludo.

    • poncos Says:

      Apropósitio, aquí te paso un poco de documentación sobre lo que pides. Implementación del algoritmo backpropagation sobre una FPGA, en este caso de la gama VIRTEX de Xilinx.

      http://books.google.com/books?id=EdmnLGqxSHUC&pg=PA137&lpg=PA137&dq=fpga+backpropagation&source=bl&ots=BwHYXmwTYS&sig=rBlJgL3_spkcYlUFuwTsSMGY0F8&hl=es&ei=7ZwfSt_iJqC8jAeqi6W8Bg&sa=X&oi=book_result&ct=result&resnum=9

      Un saludo.

    • si simplemente no te gusta programar en MalLab no lo hagas, yo hice algunos prototipos de Redes Neuronales, en Java, para procesamiento de imagenes, y no ando alardeando por alli que los hice y criticando al resto,

      bueno agradeciendo a PONCOS, por la ayuda mostrada, ademas de darse el tiempo para leer y responder cada comentario, muchas gracias por el esfuerzo.

      • Manuel Santos Says:

        Oye oscar, podrias hacer paro de pasar el programa de java que hicistes de redes neuronales xfa

  10. Andrés Forero Says:

    me interesaria saber como implemento Matlab en el reconocimiento de patrones de voz, ya que necesito diseñarlo con redes neuronales, gracias por cualquier consejo y ayuda

  11. me han servido de mucha ayuda sus comentarios
    necito si me pueden ayudar en insertr en un activeX del guide de matlab no se como se hace y tambn si me podrian facilitar algun algoritmo de fuzzy logic de culaquiera gausiana o de cualquier otra les agradeceria si me ayudaran

  12. grasias por el codigo lo revisare ijale me salve como ptoyecto der ia

  13. mas codigo porfavor o sea mas ejemplos se los agradeceria mucho atte ruben desde Bolivia

  14. Pues ruben los codigos la mayoria de las personas se los reservan pero en la ayuda de matlab est lo suficiente como para que desarroles tus aplicaciones

  15. Hola, estoy tratando de entrenar una red que me ayude con reconocimiento de voz, pero los valores del entrenamiento suelen alejarse de lo que busco y por otro lado no se bienn como manejar el asunto de la salida para saber si reconoció o no el vector.

    Estos son los datos:

    vectorpalabraf=[276 729 1107 1575 2065 2949];
    vectorentrenamientof=[ 232 797 1067 1860 2029 2821];

    Este es el algoritmo de entrenamiento:

    net=newff(vectorpalabraf,vectorentrenamientof,[50 70 40],{},’trainbfg’);%Entrenamiento vector frecuencia
    figure(1);
    redentrenadaf = sim(net,vectorpalabraf);
    plot(vectorpalabraf,vectorentrenamientof,vectorpalabraf,redentrenadaf,’o’)
    net.trainParam.epochs: 500;
    net.trainParam.goal: 1e-15;
    net=train(net,vectorpalabraf,vectorentrenamientof);
    figure(2);
    redentrenadaf= sim(net,vectorpalabraf);
    plot(vectorpalabraf,vectorentrenamientof,vectorpalabraf,redentrenadaf,’o’)

    La salida es:

    634.211540694619 602.215127257950 1323.46422519026 – 1852.42416381943 2038.51774253539 2865.13930654313

    además, como puedo hacer que no me muestre decimales en al salida? solo valores enteror.

    Como interpreto el resultado de ese entrenamiento, sí siempre hay un valor que se sale notablemente del TARGET

    cómo puedo saber si hubo o no reconocimiento, es decir, como compruebo los valores de la capa de salida?…en teoría debería darme un número cercano a 1?
    Agradezco cualquier tipo de ayuda, gracias!

    • Hola Lorena, perdona por tardar en responder. Por lo que veo en tu ejemplo estás utilizando un vector muy pequeño para el entrenamiento de la red neuronal, lo normal es crear una muestra con muchos «ejemplos» para que la red neuronal aprenda a reconocerlos, es decir, entrenar la red con por ejemplo 200 ejemplos de palabras en este caso, de manera que con cada ejemplo la red neuronal compara la salida obtenida con la salida deseada y actualice los pesos dependiendo del error obtenido, de esta manera, con cada muestra la red irá disminullendo su error devolviendo un valor «cercano» a uno en la salida que representa la palabra correcta (esto claro, depende de la implementación de la red neuronal).

      • Hola gracias por tu respuesta.
        Entonces estaría bn plantear una entrada con los 9 componentes:
        a= [299.4750336, 420.3393969, 730.5579294, 1171.041387,
        1454.401172, 1964.717373, 2280.307655, 2660.358931,
        2700.647052];
        Y en la salida plantear 12 vectores cada uno con nueve componetes, sabiendo que cada vector indica una salida:
        b=[311.5614699, 412.2817727, 694.2986204, 1005.86009, 1376.510805, 1681.357588, 2281.650592, 2522.036381, 2771.822732;
        310.2185325, 658.0393114, 670.1257478, 1068.978147, 1471.859358, 1731.04627, 2266.878281, 2535.465755, 2685.874741;
        299.4750336, 580.148944, 722.5003052, 1034.061775, 1571.236723, 1710.90221, 2150.04273, 2449.517763, 2731.534611;
        300.8179709, 543.889635, 812.477109, 1083.750458, 1494.689293, 1786.106702, 2052.008302, 2644.243682, 2704.675864;
        299.456754, 434.4137215, 721.1133492, 1105.169993, 1391.198193, 1898.797534, 2051.88305, 2453.396814, 2770.982116;
        300.8179709, 432.4258332, 717.1285557, 1035.404712, 1622.268343, 1909.656941, 2027.835429, 2598.583812, 2668.416555;
        322.3049689, 333.0484678, 699.6703699, 1036.74765, 1663.899402, 1670.614089, 2296.422903, 2555.609816, 2961.176901;
        326.9852896, 334.3709943, 668.7419886, 1143.441372, 1382.469633, 1816.211927, 2105.597265, 2613.868034, 2742.782152;
        323.6479062, 558.661946, 683.5551215, 1083.750458, 1457.087047, 1780.734953, 2261.506532, 2468.318887, 2758.393359;
        310.2185325, 431.0828959, 683.5551215, 1094.493957, 1377.853742, 1893.541692, 2293.737028, 2430.71664, 2719.448175;
        300.8179709, 582.8348187, 812.477109, 1083.750458, 1633.011842, 1782.07789, 2215.846661, 2359.54096, 2669.759492;
        299.4750336, 577.4630692, 859.479917, 1001.831278, 1628.98303, 1995.604932, 2135.270419, 2583.8115, 2822.854352];
        Y ya en ese punto si podría interpretar los valores cercanos a 1 como la plabra reconocida? el asunto es que hay al menos 4 salidas que me muestran valores cercanos a 0 y otros valores entre 2 y 3 entinces en la entrada también debería tener más muestras y no solo un vector?
        Una vez el vector ha sido entrenado, estoy utilizando otro vector para concocer el comportamiento de la red:
        [Y, Pf, Af, E, perf] = sim(net, [299.4750336, 577.4630692, 859.479917, 1001.831278, 1628.98303, 1995.604932, 2135.270419, 2583.8115, 2822.854352]);
        Básicamente mi pregunta es si lo anterior podría tener sentido o estoy planteando mal la entrada en términos del número de vectores, y en la salida puedo utilizar solo 12? o tal vez más aún sabiendo que son solo 12 palabras las que el software reconocerá? y eso ejemplos de la salida así fueran 120 deberían ser 10 con cada palabra?
        Gracias por tu respuesta

  16. hola por fin encontré lo que necesitaba y de verdad que es una gran ayuda, muchas gracias. Pero necesito mas de su ayuda (en lo posible). Ya leí el post anterior Matlab: Interfaz COM, pero no se como obtener el resultado que muestras en el punto 4. Realmente necesito obtener ese resultado; no se si tengas un tutorial sobre como obtener ese resultado, de verdad que sería una gran ayuda.

    • Hola Oscar, para obtener el resultado final de la red neuronal, y así poder interpretar el dígito escrito, lo único que hay que hacer es utilizar las funciones del interfaz COM para recuperar valores de arrays, y recuperamos el valor del array que representa los resultados de la red neuronal, a partir de ahí tomamos como caracter correcto el correspondiente a la salida que más se parezca al valor 1 (según la implementación que hemos hecho aquí).

  17. Hola que tal! excelentes ejemplos sobre reconocimiento de patrones con RNA y matlab, yo eh utilizado las RNA para prediccion de oleaje en la costa de baja california sur y ahora estoy queriendo trabajar con lo que es reconocimiento de patrones en ambientes ruidosos utilizando RNA o ANFIS, si me pueden echar un poco la mano con esto ya que soy nuevon, se los voy a agradecer..

    Saludos a todos..

  18. Jefferson Says:

    Un saludo para todos. me gustaria saber si alguien me puede facilitar información acerca de la implemetación de redes neuronales sobre FPGA (Spartan 3. nexys 2). si alguien del blog, ya lo ha hecho, le agradesco, la info.
    Es para el proyecto de grado. Gracias.

  19. Hola a todos, excelentes comentarios, ojala muchos se dedicaran a hacer esto mismo y ayudar a los que vamos entrando en este mundo. Yo como dije soy nuevo en el tema, ahora mismo estoy en medio de algo simple, quiero realizar una red neuronal que reconozca letras y consumirla desde c#. Ya logré identificar como se envia y se reciben parametros y variables de c# a matlab, sin embargo, aun no he podido hacer que c# ejecute una función implementada en un archivo.m donde le paso un parametro desde c# y tomar el valor del resultado de esta función. Por favor, si alguien pudiese darme un ejemplo bien simple para entenderlo les estaría muy agradecido.

    saludos
    yordan

  20. Diganme por favor que estoy haciendo mal aqui, el archivo test.m esta dentro de una carpeta «mfiles» al lado del .exe, ya esta agregada la referencia a matlab …

    código en c#

    MLApp.MLAppClass matlab = new MLApp.MLAppClass(); //creo objeto
    matlab.Execute(«cd » + Application.StartupPath + «\\mfiles»); //cambio workspace
    matlab.PutWorkspaceData(«a», «base», 10); //mando valor de variable a
    MessageBox.Show(matlab.Execute(«test»)); //ejecuto la función test
    matlab.Quit(); //cierro la conexión

    código en test.m
    function ret = test1(a) //delcaro función
    ret =a; //solo tiene que cojer el valor que mande antes y
    // asignarlo a la variable ret

  21. yeestrada Says:

    Hola, ya logre hacer algo al respecto, pero en la prograacion n matlab me esta dando un error, podrian ayudarme a identificar que he hecho mal???

    function ret = red(b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35)
    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);

    %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;

    %img = imread(‘a’, ‘JPG’);
    Pi =0;
    Ai =0;
    P = [b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30,b31,b32,b33,b34,b35];%rgb2gray(img);
    [Y,Pf,Af,E,perf] = sim(red,P,Pi,Ai,deseadas);
    AA = compet(Y);

    ret=alfabeto*AA;
    %fprintf (ret);

  22. exelente blog …muchas gracias por la informacion por compartir el conocimiento……..te queria pedir un favor es que estoy trabajando con el proyeco de un prototipo que permite a un usuario dibujar caracteres a mano con el ratón y le muestra el dígito reconocido del que hablaste para ver si es posible contar con mas informacion al respecto ……cualquier sugerencia documentos muchas gracias

  23. Roberto Says:

    Hola que tal, descubri tu espacio en un intento casi desesperado de comprender como usar el entorno matlab con el uso de redes neuronales para mi trabajo de tesis y no tengo ninguna formación en programación dado que estudio biología. Quiero utilizar las redes neuronales para ver la dinámica evolutiva del reconocimiento de señales en el mimetismo biológico; estaría agradecido si sabes de algún libro referente a mi tema o de un libro que me introduzca en Matlab.

    De ante mano gracias, saludos.

  24. hola hola! soy nueva en esto y me pidieron para trabajo final un mapa autoorganizado tridimensional!! please necesitoo ayuda

  25. emerson Says:

    debes de expresar en columnas osea asi debes separar [1, 0, 1, 1] en ese formato es k para k calcule pesos y b se nececita identificar columna por columna

  26. hola soy nueva en esto de las redes neuronales y me han propuesto una practica, el recoonocimiento de cartas, me imagino que ha de ser parecido al alfabeto. Sino laguien me podria guiar

  27. Hola soy estudiante de ingenieria electronica en Argentina y necesito que alguien me pueda explicar matlab para redes neuronales que es cada componente de los comandos….gracias

  28. me piden implementar un perceptron multicapa con backpropagation para separar 2 grupos de datos separables no linealmente empleando nntool por favor si alguien me puede ayudar gracias…

  29. Gregori Says:

    Hola Interesante todos los comentarios.. me podrian facilitar una ayuda para la creacion de una red neuronal que reconosca la voz y de salida muestre una foto. en matlab ya grabe las voces pero no se como insertar todo esos datos que me da para la creacion de la red neuronal..si alguien tiene conocimiento porfavor con urgencia mi corre el siguiente toribio_smith@hotmail.com

  30. necesito implementar una red neuronal perceptron multicapa con algoritmo de backpropagation para separar 2 grupos de datos separables no linealmente empleando nntool

  31. Raul Roque Says:

    Amigos com podria implementar la funcion logica AND mediante una red neuronal mediante MATLAB

  32. Renato Martin Says:

    Hola Oscar Garcia ,comentaste que lo habias hecho en java, te agradecerias si dejas el codigo o lo mas importante , o quizas indiques de la fuente de la cual te guiastes , te lo agradeceria y al autor de esta pagina feliciades por tomarse un tiempo y compartir informacion como esta.Salu2

  33. buenas necesito que me ayuden para implementar un codigo en matl para reconocimiento de imagines usando redes neuronales artificiales. Ayudenme por favor.

  34. En 3.1 por que pones los mismos patrones?
    1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
    1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
    1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
    1;1;1;1;0;1;1;0;1;1;0;1;1;1;1
    No deberia ser diferente uno para cada digito? y eso es segun como se marque el numero o uno inventa los 1 y el 0?

    • poncos Says:

      Hola, hace unos cuantos años de este artículo pero voy a intentar hacer memoria. Los patrones del apartado 3.1, corresponden todos a mismo dígito, que en este caso es el número uno (si sigues leyendo verás que es el dígito que se reconoce en la red neuronal, y es el dígito que se indica en los targets). Los ceros y unos no te los puedes inventar, son el resultado del preprocesado que se ha realizado al número que el usuario ha introducido con el ratón. La verdad que los patrones deberían ser diferentes (aunque parecidos) aunque se refieran al mismo número, pero parece ser que en este caso, el preprocesado ha dado como resultado patrones iguales.

  35. Adrian Says:

    Debo crear una red neuronal en matlab para reconocer patrones en imagenes. Soy nuevo en el tema. Necesito saber cómo cargar un conjunto de imagenes para utilizarlas como los patrones de la red.
    Y luego cómo podría probar la red pasándole una imagen x para ver si cumple con los patrones válidos. Saludos,

  36. Muy buen post, saludos

  37. Ricardo lara Says:

    Excelentes aportes 🙂 saludos

  38. ALEJANDRO ALDANA Says:

    hola que tal a todos, tengo una pregunta quizas sencilla para uds, pero aun no se la respuesta, despues de tener los pesos y los valores de b como hago para ya implementar estos pesos es decir para ya obtener el resultado, x ejemplo para ya saber que el valor introducido es un 6 o un 8

    gracias

    • Para saber el resultado, es decir, el dígito introducido, eso dependen de como hayas entrenado la red neuronal, en este ejemplo, la red neuronal se ha construido con una capa de salida de diez neuronas, y hemos entrenado la red para forzar una salida de valor 1 en la salida de posición igual al índice del dígito (salida cero, dígito 0, uno dígito 1,…), y un cero para la salida de las demás neuronas. De esta manera el post-procesado es fácil, tan solo leemos el vector de salida y el dígito introducido es igual al índice del vector de salida que más se aproxime a uno.

  39. elros244 Says:

    Hola, tengo una duda y espero me la puedas resolver, si estoy haciendo la deteccion de numeros, cuando yo le dibuje mis numeros para que los detecte, estos tienen que ser de un tamaño especifico? o la red neuronal escala las entradas para poder detectarlas.
    PD: si no me di a entender, si meto una matriz(la imagen) de 100×100 y la red la diseñe como base con una matriz(la imagen) de 200×200 igual la detectara correctamente? y si si, que es exactamente lo que hace para lograrlo?

    • hola elros244,el tamaǹo de la red neuronal es fijo, pero no tiene que se el mismo que el tamaǹo de la imagen, par esto esta la fase de preprocesamiento, habitual en este tipo de sistemas. La imagen puede ser del tamaǹo que quieras ya que en esta fase de preprocesado, el objetivo es tranformar los datos disponibles en crudo a un formato que la red neuronal acepte. En este caso, lo que se hace es que se mapea la imagen del tamaǹo que sea a un array binario, cada elemento del array, con un uno o un zero indicará si una sección determinada de la imagen contiene alguna parte del dígito, es decir, si contiene algún píxel pintado.

      Hace mucho que escribí este código, pero lo he encontrado en mi ordenador, y lo he puesto en github (https://github.com/poncos/DigitRecognizer), ahí le puedes echar un vistazo.

      Saludos

  40. elros244 Says:

    Y me podrias explicar un poco mas a detalle lo del tratamiento de la imagen, como hiciste lo de la imagen de 200×200 y usaste lo de la matriz de 3×5? por lo que entendi, dividiste la imagen de 200×200 en una matriz de 3×5 y viste en cada elemento si habia un pixel negro, si era asi ponias un 1 y si era blanco ponias un 0? por eso cada uno de los numeros a detectar aunque la imagen es de 200×200 solo da un vector de 15 elementos por cada numero?

    • Hola elros244, como te he respondido al comentario anterior, he publicado el código en github (https://github.com/poncos/DigitRecognizer), he tenido que hacer memoría, ya que hace unos cuantos ańos desde que escribí este código pero el código utiliza la librería SDL como motor gráfico. En el fichero fuente principal (https://github.com/poncos/DigitRecognizer/blob/master/src/dr.cc), puedes ver en la función preprocessImage(); como se crea el vector de 15 elementos (3×15) y como se aplica a la red neuronal en la función processData(), utilizando la clase MatlabSession() que utiliza a su vez la clase MNeuralNetwork.

  41. amigo me podrias explicar como visualizaste los resultados, es decir como dibujas el patron.
    Saludos

  42. Hola poncos.
    Tengo la siguiente duda de red neuronales.
    que pasa cuando entrenas y luego llegas a un resultado.
    Es decir: en matlab tengo el input, target y el sample.
    Se puede introducir otro target dentro de la red neuronal ya entrenada??

    Saludos

    • Hola Andres, lo que tu quieres es un problema común, el de entrenas una red neuronal, u otro tipo de sistema predictivo o de clasificación, para que aprenda a clasificar una serie de tipos de entradas y después en el futuro hacer que la red neuronal evolucione, aprendiendo a clasificar nuevos targets, o a clasificar los mismos targets, pero con datasets que han modificado y que son significativamente diferentes a los que en su día se utilizaron para el entrenamiento. Desgraciadamente esto no es un problema directo, lo que habría que hacer es volver a entrenar la red neuronal con un nuevo dataset que incluya el nuevo target y así obtener el nuevo modelo de red neuronal.

      • Hola pocos.
        Sobre lo que me dices, entonces no hay fomr a de que a partir de una red entrenada se le agreguen solamente nuevos targets y obtener resultados??
        Con lo que me dices de entrenar nuevamente la red agregando el target nuevo…que se logra ???
        Saludos

      • si añades nuevos targets, tendrás que volver a entrenar la red neuronal para que aprenda a predecir esos nuevos targets.
        Por ejemplo, en este ejemplo, yo he entrenado la red neuronal para predecir dígitos 0-9, la red neuronal ha sido entrenada para reconocer determinados patrones y activar la neurona que identifica el target correcto entre 0-9.
        Si yo ahora quiero predecir además caracteres A,B,C,D,F, tendré que volver a entrenar la red neuronal incluyendo casos de pruebas para esos nuevos targets, por jemplo un data set que contenga el patrón par ala A y que le diga a la red neuronal la salida esperada, que será activando la neurona que yo he puesto para indicar A.

  43. Poncos gracias por la pronta respuesta.
    Hay algun algoritmo que permita hacer lo que decia anteriormente?? que evolucione la red.

  44. Alan Del Saz Diaz Says:

    Buenas tardes, me pudieras echar la mano con mi código, el problema es que yo estoy declarando un matriz 4×16 para poner 4 entradas y una 4×16 buscando 4 salidas. Matlab no me deja entrenar porque pide que la última capa tenga 16 neuronas, pero yo sólo busco 4.

    p=[1 1 1 1; 1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1; 1 1 1 0; 1 0 1 1; 1 1 0 1; 0 1 1 1; 1 1 0 0; 1 0 1 0; 1 0 0 1; 0 1 1 0; 0 0 1 1; 0 1 0 1; 0 0 0 0];
    t=[1 1 1 1; 0 0 1 0; 0 1 0 0; 1 0 0 0; 0 0 0 1; 1 1 1 0; 1 0 1 1; 0 1 1 1; 1 1 0 1; 0 1 1 0; 1 0 1 0; 0 0 1 1; 1 1 0 0; 1 0 0 1; 0 1 0 1; 0 0 0 0];
    net=newff(minmax(p),[4,5,6,4],{‘logsig’, ‘tansig’, ‘logsig’,’purelin’},’trainlm’);

    net.trainparam.show=50;
    net.trainparam.lr=0.05;
    net.trainparam.max_fail=5;
    net.trainparam.mem_reduc=1;
    net.trainparam.min_grad=1e-10;
    net.trainparam.mu=0.001;
    net.trainparam.mu_inc=10;
    net.trainparam.time=inf;
    net.trainparam.epochs=300;
    net.trainparam.goal=1e-5;

    [net,tr]=train(net,p,t);
    a=sim(net,p)

  45. Alan Del Saz Diaz Says:

    Buenas tardes, me pudieras echar la mano con mi código, es backrpopagation, tengo 4 entradas y 4 salidas con arquitectura (4 5 6 4); el problema es que Matlab no me deja entrenar ya que me pide que sean 16 neuronas de salida, ¿Cómo le pudiera hacer para que, sin modificar las matrices, me dé el resultado que espero?

    Gracias de antemano.

    p=[1 1 1 1; 1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1; 1 1 1 0; 1 0 1 1; 1 1 0 1; 0 1 1 1; 1 1 0 0; 1 0 1 0; 1 0 0 1; 0 1 1 0; 0 0 1 1; 0 1 0 1; 0 0 0 0];
    t=[1 1 1 1; 0 0 1 0; 0 1 0 0; 1 0 0 0; 0 0 0 1; 1 1 1 0; 1 0 1 1; 0 1 1 1; 1 1 0 1; 0 1 1 0; 1 0 1 0; 0 0 1 1; 1 1 0 0; 1 0 0 1; 0 1 0 1; 0 0 0 0];
    net=newff(minmax(p),[4,5,6,4],{‘logsig’, ‘tansig’, ‘logsig’,’purelin’},’trainlm’);

    net.trainparam.show=50;
    net.trainparam.lr=0.05;
    net.trainparam.max_fail=5;
    net.trainparam.mem_reduc=1;
    net.trainparam.min_grad=1e-10;
    net.trainparam.mu=0.001;
    net.trainparam.mu_inc=10;
    net.trainparam.time=inf;
    net.trainparam.epochs=300;
    net.trainparam.goal=1e-5;

    [net,tr]=train(net,p,t);
    a=sim(net,p)

  46. Hola, excelente aporte, pero tengo una pregunta, cuando el usuario ingresa el numero y la pantalla lo muestra en la parte derecha, esa interfaz es hecha en matlab o que programa se empleo para que el usuario ingrese el numero? agradezco su tiempo.

    • Hola Flybe, para la interface se utiliza la libreria SDL de C++ https://libsdl.org , en el fichero fuente con el main, puedes ver como una vez cargada la sesion matlab y el modelo de la red neuronal, se inicializa la libreria SDL, se carga el fondo (imagen png con las areas dibujadas donde el usuario introduce el numero y el recuadro donde se pinta la prediccion) y se registra el manejador de eventos para capturar los eventos del raton. En el mismo fichero puedes ver la implementacion de los eventos donde en el caso de movimientos del raton se pintan pixeles de color negro para dibujar el digito que el usuario escribe con el raton.

Replica a poncos Cancelar la respuesta