Esto va a ser una larga pregunta :
He escrito un código en MATLAB para la actualización de los pesos de MLP con una capa oculta . Aquí está el código :
weights_1 : matriz de pesos para la entrada a la capa oculta weights_2 : matriz de pesos para la oculta a la capa de salida
function [ weights_1,weights_2 ] = changeWeights( X,y,weights_1,weights_2,alpha )
%CHANGEWEIGHTS updates the weight matrices
% This function changes the weight of the weight matrix
% for a given value of alpha using the back propogation algortihm
m = size(X,1) ; % number of samples in the training set
for i = 1:m
% Performing the feed-forward step
X_i = [1 X(i,1:end)] ;
z2_i = X_i*weights_1' ;
a2_i = sigmoid(z2_i) ;
a2_i = [1 a2_i] ;
z3_i = a2_i*weights_2' ;
h_i = sigmoid(z3_i) ;
% Calculating the delta_output_layer
delta_output_layer = ( y(i)' - h_i' )...
.*sigmoidGradient(z3_i') ; % 3-by-1 matrix
% Calculating the delta_hidden_layer
delta_hidden_layer = (weights_2'*delta_output_layer)...
.*sigmoidGradient([1;z2_i']) ; % 5-by-1 matrix
delta_hidden_layer = delta_hidden_layer(2:end) ;
% Updating the weight matrices
weights_2 = weights_2 + alpha*delta_output_layer*a2_i ;
weights_1 = weights_1 + alpha*delta_hidden_layer*X_i ;
end
end
Ahora quise probar en la fisheriris
conjunto de datos dado en MATLAB que puede ser accedido por load fisheriris
comando . He cambiado de nombre meas
a X
y cambió species
a 150-by-3
de la matriz donde cada fila representa el nombre de la especie (como por ejemplo la primera fila [1 0 0]
)
Calculo de error de la capa de salida usando la siguiente función :
function [ g ] = costFunction( X,y,weights_1,weights_2 )
%COST calculates the error
% This function calculates the error in the
% output of the neural network
% Performing the feed-forward propogation
m = size(X,1) ;
X_temp = [ones([m 1]) X] ; % 150-by-5 matrix
z2 = X_temp*weights_1' ; % 150-by-5-by-5-by-4
a2 = sigmoid(z2) ;
a2 = [ones([m 1]) a2] ; % 150-by-5
z3 = a2*weights_2' ; % 150-by-3
h = sigmoid(z3) ; % 150-by-3
g = 0.5*sum(sum((y-h).^2)) ;
g = g/m ;
end
Ahora en el curso, el profesor dio un ejemplo de juguete de red con 3 iteraciones , he probado esto en la red y le da a los valores de la derecha, pero cuando lo pruebo en el fisheriris de datos el costo sigue aumentando . Y yo no soy capaz de entender dónde va mal .
Aquí es el juguete de la red para que funciona muy bien :
sólo hay formación de ejemplo para este conjunto .
PS : Ignorar los comentarios ( que son el tamaño de la matriz se utiliza para comprobar la validez de la multiplicación de la matriz para un caso de ejemplo )
Finalmente aquí está la prueba en el banco de ejecutar.m , sigmoide.m y sigmoidGradient.m los que he compartido sólo en caso de ejecutar las funciones y prueba de ellos