Upload
alejandro-lizarraga
View
483
Download
4
Embed Size (px)
Citation preview
Práctica 2
EL PERCEPTRON MULTICAPA Objetivo: Que el alumno compruebe experimentalmente las capacidades de aproximación de funciones de un perceptron multicapa. Desarrollo
1. Escriba un código en Matlab® para implementar un perceptron multicapa con aprendizaje tipo retropropagación que aprenda la función f(x,y)=cos(x)-3sen(y) con 0≤x≤2π y 0≤y≤2π
2. Reporte tanto el código como los resultados obtenidos (gráfica de la función a aproximar, grafica de la función aproximada, grafica del error, grafica del error medio cuadrático, vector de pesos y bias, etc.).
3. Verifique la capacidad de generalización de la red utilizando patrones similares a los del entrenamiento.
4. Reporte los resultados obtenidos en el punto anterior. 5. Repita los pasos de 1 al 5 usando un aprendizaje tipo Levenberg-Marquardt. 6. Conclusiones y observaciones.
REPORTE
1. Escriba un código en Matlab® para implementar un perceptron multicapa con aprendizaje tipo retropropagación que aprenda la función f(x,y)=cos(x)-3sen(y) con 0≤x≤2π y 0≤y≤2π
Alejandro Lizárraga Maldonado Redes Neuronales Artificiales Práctica 2
2. Reporte tanto el código como los resultados obtenidos (gráfica de la función a aproximar, grafica de la función aproximada, grafica del error, grafica del error medio cuadrático, vector de pesos y bias, etc.).
CODIGO clear all ; clc; f_1 (1:400) = 0 ; x_1 = f_1 ; y_1 = x_1 ; f1_1 (1:400) = 0 ; x1_1 = f_1 ; y1_1 = x_1 ; x = 0 : 0.1*pi : 1.9*pi ; y = 0 : 0.1*pi : 1.9*pi ; x1 = 0 : 0.2*pi : 1.8*pi ; y1 = 0 : 0.2*pi : 1.8*pi ; for s=1:1:20 for s1=1:1:20 f(s,s1) = cos(x(s))-3.*sin(y(s1)); h = 20*(s-1) + s1; x_1 (h)= x(s1); y_1 (h)= y(s); f_1 (h)= f(s,s1); hold on end end for s=1:1:10 for s1=1:1:10 f1(s,s1) = cos(x1(s))-3.*sin(y1(s1)); h= 10*(s-1) + s1; x1_1 (h)= x1(s1); y1_1 (h)= y1(s); f1_1 (h)= f1(s,s1); hold on end end net=newff(minmax([x_1;y_1]),[7,7,7,1],{ 'tansig' , 'tansig' , 'tansig' , 'purelin'}, 'traingd' ); net.trainParam.epochs = 2000; net.trainParam.goal=1e-4; [net,tr]=train(net,[x_1;y_1],f_1); Y=sim(net,[x_1;y_1]); Y1=sim(net,[x1_1;y1_1]);
figure plot3(x_1,y_1,Y, 'ro' ) hold on mesh(x,y,f) figure plot3(x1_1,y1_1,Y1, 'ko' ) hold on mesh(x1,y1,f1) VENTANA DE ENTRENAMIENTO
GRAFICA DE LA FUNCIÓN REAL CONTRA EL ENTRENAMIENTO
GRÁFICA DEL ERROR
GRÁFICA DEL ERROR MEDIO CUADRÁTICO
BIAS >> net.b{1} ans = -8.6115 -6.8972 6.3613 3.2058 -2.1491 2.3403 2.6844 VECTOR DE PESOS >> net.IW{1} ans = 1.2606 0.8418 2.0274 0.4762 -1.2112 -0.2038 -0.3384 -1.4042 -0.4898 0.9913 -1.5553 -0.6913
1.0139 -0.6300 >> net.IW ans = [7x2 double] [] [] []
3. Verifique la capacidad de generalización de la red utilizando patrones similares a los del entrenamiento.
GRÁFICA DE LA FUNCIÓN REAL CONTRA LA GENERALIZACIÓN DE LA RED
4. Reporte los resultados obtenidos en el punto anterior. Si obervamos la ventana del entrenamiento de red, notaremos que se agotaron las iteraciones antes de alcanzar el error deseado. Podemos notar esto al observar en la gráfica anterior que existen pequeñas discrepancias entre los valores arrojados por la red (círculos negros) y los valores reales esperados (malla). Se debe a que el entrenamiento tipo gradiente es demasiado lento.
Podemos observar que la gráfica del gradiente y en la del error, que tienen un decaimiento exponencial del tipo �
��� donde � > 0. Por lo tanto, llega un punto donde el error decrece muy lentamente. Una vez que se llega este punto, es muy improbabable que el gradiente alcance el nivel de error deseado pues el comportamiento es asintótico alrededor de esos valores.
5. Repita los pasos de 1 al 5 usando un aprendizaje tipo Levenberg-Marquardt. CODIGO clear all ; clc; f_1 (1:400) = 0 ; x_1 = f_1 ; y_1 = x_1 ; f1_1 (1:400) = 0 ; x1_1 = f_1 ; y1_1 = x_1 ; x = 0 : 0.1*pi : 1.9*pi ; y = 0 : 0.1*pi : 1.9*pi ; x1 = 0 : 0.2*pi : 1.8*pi ; y1 = 0 : 0.2*pi : 1.8*pi ; for s=1:1:20 for s1=1:1:20 f(s,s1) = cos(x(s))-3.*sin(y(s1)); h = 20*(s-1) + s1; x_1 (h)= x(s1); y_1 (h)= y(s); f_1 (h)= f(s,s1); hold on end end for s=1:1:10 for s1=1:1:10 f1(s,s1) = cos(x1(s))-3.*sin(y1(s1)); h= 10*(s-1) + s1; x1_1 (h)= x1(s1); y1_1 (h)= y1(s); f1_1 (h)= f1(s,s1); hold on end end net=newff(minmax([x_1;y_1]),[7,7,7,1],{ 'tansig' , 'tansig' , 'tansig' , 'purelin'}, 'trainlm' ); net.trainParam.epochs = 2000; net.trainParam.goal=1e-4; [net,tr]=train(net,[x_1;y_1],f_1); Y=sim(net,[x_1;y_1]); Y1=sim(net,[x1_1;y1_1]); figure plot3(x_1,y_1,Y, 'ro' )
hold on mesh(x,y,f) figure plot3(x1_1,y1_1,Y1, 'ko' ) hold on mesh(x1,y1,f1) VENTANA DE ENTRENAMIENTO
GRAFICA DE LA FUNCIÓN REAL CONTRA EL ENTRENAMIENTO
GRÁFICA DEL ERROR
GRÁFICA DEL ERROR MEDIO CUADRÁTICO
BIAS >> net.b{1} ans = 5.2519 -0.6889 -4.9063 0.6297 -1.2405 0.0741 -1.8155 VECTOR DE PESOS >> net.IW{1}
ans = -0.8813 -0.0458 -0.0225 -1.1113 -0.0017 0.9992 0.2070 -0.5231 0.5173 -0.0631 0.3298 -0.0205 0.0360 0.5094 >> net.IW ans = [7x2 double] [] [] [] GRÁFICA DE LA FUNCIÓN REAL CONTRA LA GENERALIZACIÓN DE LA RED
OBSERVACIONES El entrenamiento Levenberg-Marquardt fue mucho más rápido que el de tipo gradiente. Al comparar las gráficas del error podemos observar claramente que el decaimiento es mucho más abrupto. La gráfica del error medio cuadrático podemos observamos que los valores deseados y los arrojados por la red son prácticamente los mismo.
1. Conclusiones y observaciones.
El entrenamiento Levenberg-Marquardt es mucho mejor en el caso del perceptrón multicapa. El entreanamiento tipo gradiente tiene un comportamiento asintótico muy poco deseado, pues una vez que se sigue este patrón, el valor del error no podrá llegar por debajo de la asíntota, aún cuando se iteraran infinitamente ciclos de entrenamiento.