Está en la página 1de 8

Prctica: Introduccin a las Redes Neuronales

En esta prctica utilizaremos el toolbox de neuronales que viene incorporado en la instalacin de MATLAB (Neural Network Toolbox).

1.1 Aprendiendo la funcin XOR


Para comprender mejor las redes neuronales vamos a ver un ejemplo que resuelve la funcin XOR:

Necesitamos una red neuronal con dos neuronas de entrada y una de salida. Como la funcin XOR no es un problema separable linealmente, intentaremos resolver el problema con una capa oculta en la que colocaremos dos neuronas. El modelo de neurona que utiliza matlab, existen dos posibilidades con o sin bias:

Existen diferentes funciones de activacin de las neuronas:

De tal forma que el modelo de red neuronal que utiliza matlab es el siguiente:

Para crear la red utilizaremos la funcin newff (fed-forward). Es una red que se propaga hacia-adelante.
>> help newff >> net = newff([0 1; 0 1],[2 1],{'logsig','logsig'})

Como parmetros necesita el rango de valores de las neuronas de entrada ([0 1; 0 1]), el nmero de celdas en la capa oculta y en la de salida ([2 1]) y la funcin de activacin de cada capa ({logsig,logsig})

Vamos a ver cmo es de buena la red sin entrenar. Necesitamos una matriz con las entradas. Las entradas de la red son las columnas de la matriz. Si queremos una matriz con las entradas: 1 1, 1 0, 0 1 y 0 0 debemos escribir. Los vectores de entrada a la red deben ser vectores columna, por tanto hacemos una matriz con los 4 vectores de entrada:
>> input = [1 1 0 0; 1 0 1 0]

Veamos qu salidas obtenemos si le damos esta entrada a la red:


>> output=sim(net,input) output = 0.3394 0.0659 0.0769 0.1025

La funcin sim se utiliza para simular la red y as calcular las salidas. La salida no es muy buena. Lo deseable era (0 1 1 0) y nos hemos encontrado con (0.3394 0.0659 0.0769 0.1025). Esto es as porque los pesos se han inicializado aleatoriamente y la red no ha sido entrenada (seguramente que cuando lo ejecutes t saldrn otros valores). El objetivo de esta red es ser capaz de producir:
>> target = [0 1 1 0]

Con el comando plot podemos ver el objetivo y lo que hemos conseguido hasta el momento:
>> plot(target, 'o') >> hold on >> plot(output, '+r')

Objetivo (crculos en azul) y solucin obtenida sin entrenar la red (+ en verde)

Parece que con los pesos que tiene la red sin entrenar no se obtiene una buena solucin. Veamos los pesos que hay entre la capa de entrada y la capa oculta (Se guardan en IW, input weights):
>> net.IW{1,1}

Podramos cambiar cualquier peso de la red:


>> net.IW{1,1}(1,2)=5; >> net.IW{1,1} ans = 7.7055 5.0000 -7.9089 -0.4123

Los pesos entre la capa oculta y la capa de salida se almacenan en LW (Layer Weight):
>> net.LW{2,1}

As la red con todos los pesos sera (incluyendo el cambio realizado):

Hemos cambiado un peso, as que podemos volver a evaluar la red:


>> output=sim(net,input) output = 0.6645 0.0659 0.0846 0.1025 >> plot(output,'g*') .

Podramos pasarnos horas modificando los pesos tratando de acercarlos a la solucin (prueba a hacer un par de cambios). Pero parece ms sencillo dejar que los pesos se calculen automticamente. Para ello tenemos que entrenar la red. Para entrenar la red tenemos que utilizar la funcin train:
>> net = train(net,input,target);

Aparece un grfico en el que vemos la evolucin del entrenamiento. El objetivo a alcanzar es bajar de un gradiente de 1E-10 (por defecto). Vemos tambin que el nmero de iteraciones mximo, por defecto, es 100.

Como hay pocos ejemplos el entrenamiento es muy rpido. Veamos si hemos aprendido

bien
>> output = sim(net,input) output = 0.0000 1.0000 1.0000 0.0000

Y ahora vamos a ver los pesos que se han calculado en el entrenamiento:


>> net.IW{1,1} ans = 9.2325 -11.5070 -12.0289 13.7543 >> net.LW{2,1} ans = 27.6393 30.3009

1.2 Ejercicio
Haz t una red que resuelva la funcin ((A OR B) AND (NOT(C) OR A)) Modifica la estructura de la red, y anota en una tabla comparativa los siguientes parmetros: -Estructura utilizada, epochs, goal, tiempo aproximado de entrenamiento de la red, tiempo de clculo de la salida, etc (Las modificaciones a realizar incluirn al menos aumentar el nmero de capas ocultas, aumentar el nmero de neuronas en cada capa).

1.3 Un ejemplo ms complejo: Reconocimiento de letras.


El archivo letras.txt contiene una serie de matrices binarias que muestran imgenes de letras del alfabeto, seguidas de la letra que representan.
0 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 V 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Entrena una red neuronal, que tenga introduciendo como entrada una matriz binaria del mismo tamao que el de las matrices del archivo, obtenga como salida la letra que representa. Para introducir la imagen como entrada de una red neuronal, es mejor convertirla en un vector columna, as en este caso tendremos 160 neuronas en la capa de entrada. Para la salida, no tenemos ningn tipo de neurona que nos devuelva caracteres, as que tendremos que codificar las letras de forma numrica. Una solucin es crear un vector binario con 27 bits. De manera que [1 0 0 0 0] representa la letra a, [0 1 0 0 0] representa la letra b, etc, y [0 0 0 1] representa la letra z. Por lo tanto la red tendr una salida de 27 neuronas, de tal manera que si el vector de entrada es el mapa de bits de ms arriba, todas las neuronas de salida valdrn cero, salvo la de la posicin 23 que es la que corresponde a la letra v. Como leer el archivo de texto:
ML = []; % Abrir el fichero FID = fopen('letras.txt'); z = 1; while not(feof(FID)) % Se leen 16 lneas seguidas y se guardan en la variable matriz for i=1:16 fila = fgets(FID);

end % En la vriable ML se van guardando las imgenes de las letras como columnas ML = [ML matriz(:)]; % Se lee una lnea en blanco f = fgets(FID); % Se lee la lnea que contiene la letra y se obtiene el char let = fgets(FID); letra(z) = cellstr(let) f = fgets(FID); z = z + 1; end % Se cierra el fichero fclose(FID);

a = str2num(fila); matriz(i,:) = a;

Como convertir una columna de la matriz ML y ver que letra representa, por ejemplo la primera columna:
g = ML(:,1); size(g) w = zeros(16,10); z = 1; for i=1:16:150, w(1:16,z) = g(i:i+15); z = z + 1; end imshow(w)

1.- Se van a probar diferentes estructuras para la red neuronal (nmero de capas ocultas, neuronas por capa oculta, funciones de las neuronas, etc) y habr de seleccionarse la que menor error total cometa. Prueba con 1, 2 y 3 capas ocultas. Prueba con 5, 10 y 15 neuronas por capa oculta. Prueba con las funciones tansig y logsig, con la misma funcin para la capa de salida, y alternativamente con la funcin purelin. 2.- Crea dos conjuntos de datos diferentes. Usa el primero para entrenar la red (con aproximadamente el 80% de los datos de entrada) y el segundo (con el 20% restante) para comprobar el error que comete. Realiza este ejercicio al menos 10 veces. Escoge la red que mejor resultado proporciona. Calcula el resultado de la media de los resultados obtenidos.

También podría gustarte