Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Grupo: 3CM2
Alejandro Hernandez Gomez
Introduccin
En el presente reporte expondr de manera sencilla y concisa el funcionamiento, as como el
entrenamiento de un Perceptrn multicapa. Tomando 2 archivos con la informacin respectiva de
datos de ingreso (input.txt) y targets (target.txt) se pretende hacer funcionar la red para un rango
de una seal con una arquitectura de dos vectores v1[1 s1 s2 s3 1] y v2[2 3 2 1] (donde v2 tomar
sus valores de 1.- purelin; 2.- logsig; 3.- tansig;).
Se requiere que el usuario ingrese los datos s1, s2, s3, el valor del factor de aprendizaje, las
condiciones de finalizacin y el subconjunto de datos que se usar (80-10-10 / 70-15-15).
El perceptrn multicapa deber ser capaz de entrenar, probar y verificar los datos tal cual lo
especifica su definicin.
Marco terico
El perceptrn simple y la neurona biolgica
El sistema nervioso est compuesto por millones de neuronas conectadas y organizadas
interactuando entre s. Las neuronas componen procesadores biolgicos de informacin sencilla
que en conjunto de todas estas, nuestro sistema puede procesar grandes cantidades de
informacin en tiempos muy reducidos. Gracias al estudio de las neuronas biolgicas los cientficos
pudieron crear una simulacin virtual de la misma; con esto y las aportaciones al rea comenzaron
a crearse modelos que solventan diferentes problemticas ms fcilmente unas que otras.
El algoritmo de aprendizaje del perceptrn simple pertenece al grupo de los algoritmos que se
fundamentan en la correccin de errores. Los algoritmos de este tipo ajustan los pesos de manera
proporcional a la diferencia existente entre la salida actual de la red neuronal y la salida deseada,
con el objetivo de minimizar el error actual de la red
Aun as existen limitaciones que hacen que no sea una herramienta perfecta en sencillez y
funcionalidad.
Ya que en 1969, Minsky y Papert, demuestran que el perceptrn simple y ADALINE no puede
resolver problemas no lineales surge la necesidad de la creacin de una nueva red que no tenga
estos problemas, la combinacin de varios perceptrones simples podra resolver ciertos problemas
no lineales pero no exista un mecanismo automtico para adaptar los pesos de la capa oculta.
Rumelhart y otros autores, en 1986, presentan la "Regla Delta Generalizada" para adaptar los
pesos propagando los errores hacia atrs haciendo uso del backpropagation. De esta forma se
consigue trabajar con mltiples capas y con funciones de activacin no lineales.
Un perceptrn multicapa puede aproximar relaciones no lineales entre los datos de entrada y
salida. Esta red se ha convertido en una de las arquitecturas ms utilizadas en el momento. El
perceptrn multicapa o MLP se suele entrenar por medio de un algoritmo de retropropagacin de
errores o BP (Backpropagation).
El perceptrn multicapa (de aqu en adelante MLP, MultiLayer Perceptron) se utiliza para resolver
problemas de asociacin de patrones, segmentacin de imgenes, compresin de datos,
aproximacin de seales etc.
En redes neuronales, la propagacin hacia adelante consiste en que las salidas de las neuronas van
a las siguientes capas, pero no a las anteriores, de modo que no hay bucles de retroalimentacin.
Pasando as los conjuntos de entrenamiento para que la siguiente neurona pueda partir del
resultado anterior obtenido.
Los errores obtenidos son propagados hacia atrs desde la ultima capa, hacia las neuronas de las
capas ocultas para que puedan ser aprovechados por estas y puedan generar una aportacin hacia
la mejora de las salidas. El proceso se repite por todas las capas hasta que todas las neuronas de la
red hayan obtenido el error y contribuyan a los resultados.
A medida que se entrena la red, las capas se organizan a si mismas de forma que cada neurona
reconoce caractersticas diferentes de la entrada y salida de la red.
Funciones de activacin
En este segmento trataremos a las funciones de activacin disponibles para crear nuestro MLP en
esta ocasin. La informacin, as como las imgenes, a continuacin mostradas fueron extradas
de la pgina web del manual de referencia de Matlab.
Funciones sigmoides
En general, una funcin sigmoide es una funcin real de variable real diferenciable, de la
forma general:
Y = 1 / (1+e^(-x))
Tansig
Matematicamente tansig es el equivalente de la tangente hiperblica tanh(x), Los valores
resultantes por tansig estn contenidos en un rango de -1 a 1
a = tansig(n) = 2/(1+exp(-2*n))-1
a = tansig(n) = (1-a^2)
Figura 5: Funcin de activacin tansig.
Logsig
Los valores resultantes por logsig siempre estn contenidos en un rango de 0 a 1
a = logsig(n) = 1 / (1 + exp(-n))
a = logsig(n) = (1-a)(a)
Purelin
Los valores resultantes por logsig siempre estn contenidos en un rango de -inf a inf pues en esta
funcin de activacin la entrada es la salida.
a = purelin(n) = n
a = purelin(n) = 1
Compresin: Para comprimir los datos utilizamos un MLP de dos capas, la de entrada con N
neuronas y la de salida con M, los pesos de estas dos capas son los de la capa de entrada y oculta
respectivamente, del MLP que entrenamos anteriormente.
Descompresin: Para descomprimir los datos utilizamos un MLP de dos capas, la de entrada con M
neuronas y la de salida con N, los pesos de estas dos capas son los de la capa oculta y la de salida
respectivamente, del MLP que entrenamos anteriormente.
El MLP no conseguir (al menos normalmente) un error nulo durante el entrenamiento, por lo que
se trata de un sistema de compresin con prdidas. Obviamente cuanto mayor queramos que sea
el factor de compresin, ms error se cometer.
Vector 1 [R S1 S2 S3 SM]
Donde
Capa 1
a1 = F1(w1 * a0 + b1)
Capa 2
a2 = F2(w2 * a1 + b2)
Capa 3
a3 = F3(w3 * a2 + b3)
En general, no podemos decir cuantas capas y cuantas neuronas en las capas ocultas son
necesarias para el adecuado comportamiento del MLP. A continuacin se vera un par de ejemplos
para analizar y resolver este problema.
Para el primer ejemplo se desea usar un MLP para aproximar la siguiente funcin
A medida que i aumenta se tendr mayor nmero de periodos de la seal en el rango dado. Esto
har ms difcil la aproximacin de la MLP si tiene un tamao fijo.
Para el segundo ejemplo se desea usar un MLP para aproximar la siguiente funcin
El objetivo ser incrementar el numero de neuronas en la capa oculta para lograr la correcta
aproximacin de esta seal.
Resultados experimentales
Ejemplo 1: Archivo 03-Polinomio_entrada_y_target.txt
Introduzca el archivo de prototipos y targets: 'Funciones/Polinomio.txt'
>> El archivo "Funciones/Polinomio.txt" se carg correctamente
Vector de pesos W1
0.629056 0.188776
1.083065 0.046764
0.905792 -0.421023
Vector de bias 1
-1.585009
-1.951896
-2.117844
Vector de pesos W2
0.900952 1.664482 1.838800
0.809886 1.057140 1.659111
Vector de bias 2
-0.918204
-0.590758
Vector de pesos W3
-1.094259 -0.143143
Vector de bias 3
0.193343
Resultados
Archivo Resultados.txt para el ejemplo 3
Vector de pesos W1
9.161812 -2.204915
0.220068 0.630079
0.322458 0.842421
0.053059 0.746003
Vector de bias 1
4.308793
1.072088
0.842523
0.000307
Vector de pesos W2
-3.882428 -1.322736 -1.136340 -0.835291
-0.511288 -0.696833 -0.578762 -0.910605
-3.535870 0.961231 1.072536 1.058106
Vector de bias 2
-1.621786
-0.873654
1.162413
Vector de pesos W3
1.359024 0.451265 1.938083
Vector de bias 3
2.700203
Discusin de resultados
En los resultados de los ejemplos de entrenamiento anteriores se puede ver el favorable
funcionamiento del MLP. A excepcin del ejemplo 3, las dos anteriores se aproximaron
correctamente a la seal objetivo; por parte del nmero 3 tuvo un pequeo error en su
entrenamiento contenido en x perteneciente al rango [1.5 2]
Conclusiones
Las redes neuronales artificiales comenzaron a estudiarse desde 1943 (en el momento que se creo
su primer modelo) y aunque a lo largo del tiempo se fueron utilizando para temas acadmicos sin
mas uso mas que la investigacin. Hoy en da, con los avances tecnolgicos que van emergiendo
con cada da que pasa, las redes neuronales estn en pleno auge en temas de inteligencia artificial.
Un claro ejemplo es tesla, la empresa de bateras y automviles autnomos, que hizo uso de las
redes neuronales para la navegacin autnoma de sus automviles. Pero no es el nico, por poner
otro ejemplo son los ltimos celulares que han salido al mercado (como los actuales iPhone o el
Google pixel) que tienen procesadores potenciados con redes neuronales para crear inteligencia
artificial y usarla en los asistentes personales, as como en procesos internos del telfono.
Sin duda es una gran poca para adentrarse en el rea de las redes neuronales y gracias a esta
prctica, que sirve de escaln para temas ms avanzados, me motivo para seguir mis estudios en
estos temas.
Referencias
Libreta de apuntes de la clase
https://www.researchgate.net/profile/Pedro_Larranaga2/publication/268291232_Tema_
8_Redes_Neuronales/links/55b7b5c408ae9289a08c0c68/Tema-8-Redes-Neuronales.pdf
http://dspace.uib.es/xmlui/bitstream/handle/11201/1126/TFG%20Marta%20Vidal%20Go
nz%C3%A1lez.pdf?sequence=1
http://neuralnetworksanddeeplearning.com/chap2.html
http://www.esacademic.com/dic.nsf/eswiki/922098
https://es.slideshare.net/jcbp_peru/utp-20152ias6adaline-y-backpropagation
https://www.mathworks.com/help/nnet/ref/tansig.html
https://www.mathworks.com/help/nnet/ref/logsig.html
Anexo
%% Generador de funciones
% Autor: Alejandro Hernndez Gmez
% Carrera: Ingenieria en Sistemas Computacionales
% Escuela: Escuela Superior de Computo ESCOM - Insituto Politecnico Nacional IPN
% Asignatura: Neural Networks
% Grupo: 3CM2
% Version de MATLAB: R2017a
function GeneradorDatos()
clc
name = input('Ingrese el nombre del archivo: ');
datmin = input('Ingrese el limite inferior del rango: ');
datmax = input('Ingrese el limite superior del rango: ');
datos = input('Ingrese el numero de datos a obtener: ');
p = linspace(datmin,datmax,datos); %p - rango de evaluacin
i = [1];
[fy, fx] = size(i);
for it = i
if(fx > 1)
file_name = ['FunSeries/',name,'_',int2str(it),'.txt'];
else
file_name = ['Funciones/',name,'.txt'];
end
file = fopen(file_name,'w');
targetL = [];
for n = 1 : datos
prototype = p(n);
target = g(it,p(n));
targetL = [targetL, target];
fprintf(file,'%f',prototype);
fprintf(file,' %f',target);
if it<datos-1
fprintf(file,'\n');
end
end
fclose(file);
fprintf("\n>> Archivo %s generado correctamente", file_name);
fprintf("\n>> Graficando funcion resultante\n\n");
figure
plot(p,targetL);
end
opc = input('Desea crear un nuevo archivo? 1.Si 2.No: ');
if(opc == 1)
GeneradorDatos();
else
opc = input('Desea entrenar la red ahora? 1.Si 2.No: ');
if(opc == 1)
main();
end
end
end
%% Funcion a generar
function [out] = g(n,x)
out = 1 + sin(n*5*x*pi/4); % 1+sen(5Xpi/4)
end
%% Perceptrn Multicapa MLP
% Autor: Alejandro Hernndez Gmez
% Carrera: Ingenieria en Sistemas Computacionales
% Escuela: Escuela Superior de Computo ESCOM - Insituto Politecnico Nacional IPN
% Asignatura: Neural Networks
% Grupo: 3CM2
% Version de MATLAB: R2017a
function main()
%% Limpia consola
clear,clc,close all
target= Maprendizaje(:,end);
entrenam=elimina_columna(Maprendizaje,colum);
[fil2, colum2]=size(entrenam);
for i=1:N
if i==1
RNA(i)=colum2;
fprintf('\tNmero de entradas de la RNA: %i \n', RNA(i)-1);
else
fprintf('\tNeuronas en la capa %i: ', i-1);
RNA(i)=input('');
end
end
RNA2 = RNA;
RNA2(1) = 1;
disp(['>> Vector de arquitectura elegido: [' num2str(RNA2(:).') ']']) ;
fprintf("");
Wcell = cell(itMAX,N-1);
set(0,'RecursionLimit',9999999999)
%% Inicializa el entrenamiento
tic %inicializa el cronometro
fprintf("\n>> Iniciando el entrenamiento, porfavor espere...\n");
perceptron(Wcell,0, fid, target, entrenam, W, bias, 0, eit, alpha, itMAX, 1,
RNA, FUNACT, Pval, 1, MAXval, Mvalidacion, Mprueba, 1, 0);
end
%% Validacion
function [Mvalidacion, Maprendizaje, Mprueba]=ConjuntoDat(mux,fil, data)
if(mux==1)
mac = .7;
mvc = .15;
mpc = .15;
else
mac = .8;
mvc = .1;
mpc = .1;
end
fprintf('>> Conjunto de datos elegido [%i %i %i]\n', mac*100, mvc*100,
mpc*100);
matrizAUX=data;
[filas, columnas]=size(data);
Mvalidacion = [];
Maprendizaje = [];
Mprueba = [];
aux = 1;
for i = 1:filas
aux = aux +1;
if(i < filas*(mac+mvc)+1)
if(aux == (mvc*100))
aux = 1;
Mvalidacion = [Mvalidacion; data(i,:)];
else
Maprendizaje = [Maprendizaje; data(i,:)];
end
else
Mprueba = [Mprueba; data(i,:)];
end
end
end
%% Eliminar columna
function out = elimina_columna(matriz,columna)
%matriz(:,columna)=[];
out=matriz;
end
%% Funciones de activacin
function A_out=FuncionActivacion(N_out, FunAct)
[fila, columna]=size(N_out);
N_aux=N_out;
switch FunAct
case 1 %PURELIN
A_out=N_out;
case 2 %LOGSIG
for i=1:fila
N_aux(i)=1/(1+exp(-N_out(i)));
end
A_out=N_aux;
case 3 %TANSIG
for i=1:fila
N_aux(i)=(exp(N_out(i))-exp(-N_out(i)))/(exp(N_out(i))+exp(-
N_out(i)));
end
A_out=N_aux;
end
end
%% Graficar pesos
function Grafica_Pesos(matriz,iteracion)
[filas,col]=size(matriz);
figure('position',[0,0,800,800])
for j=1:col
subplot(col,1,j)
auxW=matriz{1,j};
[filasA,colA]=size(auxW);
auxPlot=zeros(iteracion,colA);
cont=1;
for k=1:colA*filasA
for i=1:iteracion
auxW=matriz{i,j};
if k>colA
auxPlot(i,k)=auxW(cont,rem(k,colA)+1);
else
auxPlot(i,k)=auxW(cont,k);
end
if rem(k,colA)==0&&i>iteracion-1
cont=cont+1;
end
end
end
plot(auxPlot);
title('Comportamiento de W')
if cont-1 == 3
legend('W1','W2', 'W3')
elseif cont-1==1
legend('W1')
elseif cont-1==2
legend('W1','W2')
elseif cont-1 == 4
legend('W1','W2', 'W3', 'W4')
elseif cont-1 == 5
legend('W1','W2', 'W3', 'W4', 'W5');
elseif cont-1 == 6
legend('W1','W2', 'W3', 'W4', 'W5','W6');
elseif cont-1 == 7
legend('W1','W2', 'W3', 'W4', 'W5','W6','W7');
elseif cont-1 == 8
legend('W1','W2', 'W3', 'W4', 'W5','W6','W7','W8');
elseif cont-1 == 9
legend('W1','W2', 'W3', 'W4', 'W5','W6','W7','W8','W9');
elseif cont-1 == 10
legend('W1','W2', 'W3', 'W4', 'W5','W6','W7','W8','W9','W10');
elseif cont-1 == 11
legend('W1','W2', 'W3', 'W4', 'W5','W6','W7','W8','W9','W10','W11');
elseif cont-1 == 12
legend('W1','W2', 'W3', 'W4',
'W5','W6','W7','W8','W9','W10','W11','W12');
elseif cont-1 == 13
legend('W1','W2', 'W3', 'W4',
'W5','W6','W7','W8','W9','W10','W11','W12','W13');
elseif cont-1 == 14
legend('W1','W2', 'W3', 'W4',
'W5','W6','W7','W8','W9','W10','W11','W12','W13','W14');
end
end
end
%% Graficar datos
function Graficar_Datos(GraficaE, Eprueba, iteracion, Pval, a_total, target,opc)
[fil, col]=size(GraficaE);
[f, c]=size(a_total);
i=Pval;
k=1;
if iteracion >= Pval
if opc==1
x=linspace(1, iteracion-1, iteracion-1);
y=linspace(1, iteracion-1, 1);
elseif opc==2
x=linspace(1, iteracion, iteracion);
y=linspace(1, iteracion, 1);
end
while(i<=col)
ErrorVal(1,k)=GraficaE(1,i);
i=i+Pval;
k=k+1;
end
else
ErrorVal=0;
x=linspace(1, iteracion, iteracion)
y=linspace(1, iteracion, 1);
end
[fx, cx]=size(x);
z=linspace(-2,2,c);
fprintf('\n>> Graficando datos, porfavor espere..');
figure
subplot(2,1,1)
plot(x,GraficaE, 'o:k', y,Eprueba, 'o:b','markersize',8);
title('Errores')
legend('Error ent y val', 'Error prueba');
xlabel('Nmero de iteraciones')
ylabel('Valor del error')
subplot(2,1,2)
plot(z,target, 'o k',z,a_total,'o r');
legend('Seal Real', 'Seal obtenida');
title('Resultados')
figure
plot(z,target, 'b',z,a_total,'r');
end
if (imax-imin < K)
fprintf(' Error:excede el rango\n');
m = NaN;
return
end
n = 0; % contador de # aleatorios
m = imin-1;
imin
imax
while (n < K)
a = randi([round(imin),round(imax)],1);
if ((a == m) == 0)
m = [m, a];
n = n+1;
end
end
m = m(:,2:end);
end
[fil2, colum2]=size(matriz);
Capas=length(RNA)-1;
for i=1:Capas
Wcell{iteracion,i}=W{1,i};
end
if contador == MAXval
fprintf('\n>> CRITERIO DE PARO: Nmero mximo de incrementos consecutivos
alcanzado');
fprintf(fid,'\n\n>> CRITERIO DE PARO: Nmero mximo de incrementos
consecutivos alcanzado en la iteracin %i', iteracion-1);
timerVal = tic;
fprintf("\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,"\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,'\n');
for p=1:Capas
fclose(fid);
if iteracion == itMAX+1
fprintf('\n>> CRITERIO DE PARO: Iteraciones mximas alcanzadas');
fprintf(fid,'\n>> CRITERIO DE PARO: Iteraciones mximas alcanzadas');
timerVal = tic;
fprintf("\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,"\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,'\n');
for p=1:Capas
fprintf(fid,'\n W%i\n',p);
[v,u]=size(W{p});
for i=1:v
for j=1:u
fprintf(fid,' %f \t',W{p}(i,j));
end
fprintf(fid,'\n');
end
fprintf(fid,'\n\n');
end
fclose(fid);
Eprueba=Prueba(W, bias, RNA, Mprueba, FUNACT);
Graficar_Datos(GraficaE, Eprueba, iteracion,Pval, aFinal, target,1);
Grafica_Pesos(Wcell,iteracion);
opcion=input('\n\n');
if opcion == 1
clc
return
else
main();
end
end
if Periodo == Pval
Eval=Validacion(W, bias, RNA, Mvalidacion, FUNACT);
GraficaE(iteracion)=Eval;
if iteracion>Pval
if Eval>GraficaE(iteracion-Pval)
contador=contador+1;
else
contador=1;
end
end
perceptron(Wcell,Wplot, fid, target, matriz, W, bias, GraficaE, eit,
alpha, itMAX, iteracion+1, RNA, FUNACT, Pval, 1, MAXval, Mvalidacion, Mprueba,
contador, aFinal);
end
error=zeros(fil2, 1);
i=1;
auxerror=0;
Waux=W;
while(i<fil2+1)
entrenamiento=matriz(i,:)';
[a, a_out]=Propagacion(W, bias, entrenamiento, RNA, FUNACT); %Propagacin
hacia adelante
auxerror=(target(i)-a_out);
error(i)=auxerror.^2;
aFinal(i)=a_out;
i=i+1;
auxerror=0;
end
if iteracion==1
Wplot=Waux{2};
else
T=vertcat(Wplot,Wnew{2});
Wplot=T;
end
sum_error=0;
for i=1: fil2
sum_error=sum_error+error(i);
end
sum_error=(sum_error)/fil2;
GraficaE(iteracion)=sum_error;
timerVal = tic;
fprintf("\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,"\n>>Tiempo de ejecucin: %f",timerVal);
fprintf(fid,'\n');
fclose(fid);
else
perceptron(Wcell,Wplot, fid, target, matriz, W, bias, GraficaE, eit,
alpha, itMAX, iteracion+1, RNA, FUNACT, Pval, Periodo+1, MAXval, Mvalidacion,
Mprueba, contador, aFinal);
end
end
%% Sensitividad
function S = Sensitividades(a, RNA, FUNACT, auxerror, W)
Capas=length(RNA)-1;
for k=1: Capas
S(k)={zeros(RNA(k+1), RNA(k+1))};
F(k)={zeros(RNA(k+1), RNA(k+1))};
end
i=Capas;
while(i>0)
[x, y]=size(F{i});
for j=1:x
for k=1:y
if k==j %% diagonal de la matriz F
if FUNACT(i)==1 %derivada de purelin
F{i}(j,k)=1;
elseif FUNACT(i)==2 %derivada de logsig
F{i}(j,k)=a{i}(j,1)*(1-a{i}(j,1));
elseif FUNACT(i)==3 %derivada de tansig
F{i}(j,k)=1-(a{i}(j,1))^2;
end
end
end
end
if i==Capas
S{i}=(-2)*auxerror*F{i};
else
S{i}=F{i}*W{i+1}'*S{i+1};
end
i=i-1;
end
S=S;
end
%% Validacin
function sum_error=Validacion(W, bias, RNA, Mvalidacion, FUNACT)
[fix, cox]=size(RNA);
[f0, c0]=size(Mvalidacion);
target= Mvalidacion(:,end);
matriz=elimina_columna(Mvalidacion,c0);
error=zeros(f0, 1);
i=1;
auxerror=0;
while(i<f0+1)
entrenamiento=matriz(i,:)';
[a, a_out]=Propagacion(W, bias, entrenamiento, RNA, FUNACT);
%Propagacin hacia adelante
auxerror=(target(i)-a_out);
error(i)=auxerror.^2;
auxerror=0;
i=i+1;
end
sum_error=0;
for i=1: f0
sum_error=sum_error+error(i);
end
sum_error=(sum_error)/f0;
end
%% Prueba
function sum_error=Prueba(W, bias, RNA, Mprueba, FUNACT)
[fix, cox]=size(RNA);
[f0, c0]=size(Mprueba);
target= Mprueba(:,end);
matriz=elimina_columna(Mprueba,c0);
error=zeros(f0, 1);
i=1;
auxerror=0;
while(i<f0+1)
entrenamiento=matriz(i,:)';
[a, a_out]=Propagacion(W, bias, entrenamiento, RNA, FUNACT); %Propagacin
hacia adelante
auxerror=(target(i)-a_out);
error(i)=auxerror.^2;
auxerror=0;
i=i+1;
end
sum_error=0;
for i=1: f0
sum_error=sum_error+error(i);
end
sum_error=(sum_error)/f0;
end
while(i<fila)
N_aux=W{i}(:,:)*entrenamiento+bias{i}(:,:);
A_out=FuncionActivacion(N_aux,FUNACT(i));
if FUNACT(i)==1
cadena='purelin (n)';
elseif FUNACT(i)==2
cadena='logsig(n)';
elseif FUNACT(i)==3
cadena='tansig(n)';
end
entrenamiento=A_out;
a{i}=A_out;
i=i+1;
end
A=A_out;
end
%% Algoritmo BackPropagation
function [Wnew, BIASnew]=BackPropagation(a, W, bias, auxerror, RNA, FUNACT,
alpha, entrenamiento)
Capas=length(RNA)-1;
k=Capas;
S=Sensitividades(a, RNA, FUNACT, auxerror,W);
while(k>0)
bias{k}=bias{k}-alpha*S{k};
if k-1==0
W{k}= W{k}-alpha*S{k}*entrenamiento';
else
W{k}= W{k}-alpha*S{k}*a{k-1}';
end
k=k-1;
end
Wnew=W;
BIASnew=bias;
end