5 votos

Pesos de redes neuronales

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 : enter image description here

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

2voto

jws121295 Puntos 36

Mis primeras preguntas/pensamientos son:

  • Puedo utilizar otro método de entrenamiento. Me gusta el Eric Wan esquemática del método[1]. Me permite calcular un "gradiente" de mi red mediante un medico adjunto de la red. Puedo detectar errores en el uno con el otro y básico de los casos de prueba. Junto depuración.
  • Han comparado sus resultados con el built-ins? Hiciste un error técnico en la implementación del código que puede detectar que hay? No tengo los recursos ahora para probar esto.
  • Estoy seguro de que alguien ha hecho un NN que las pruebas de Fischer Iris de datos mediante un NN. Has mirado en revisados de la literatura publicada? La razón por la que le pido es que fue una vez la tarea con algo que parecía ser inteligente en el Q-aprendizaje, pero cuando revisé la literatura, que ha demostrado ser imposible. Que fue muy bien con mi profesor. Nunca tenga miedo de pararse sobre los hombros de gigantes.
  • Hacer una lineal (planar) ajuste primero, y luego el tren de la NN en la variación del avión. Esto mantiene sus valores cercanos al origen, y hace que su aprendizaje tasas más altas. También hace que la Red Neuronal de hacer el trabajo pesado de montaje de la parte no lineal en lugar de malgastar el entrenamiento/aprendizaje en el plano de la parte. Un pseudo-inversa es barato de cómputo, comparativamente hablando.
  • Yo no veo ninguna escala o el centrado en los insumos. Si usted tiene los valores de entrada en los millones y los pesos iniciales en las que, a continuación, usted va a gastar toda su formación de iteraciones aumento de la escala para las entradas. Restando la media y dividiendo por algo como el estándar de la variación puede ayudar.

[1] http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.38.5262

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X