Función de coste de cálculo para la red neuronal

0

Pregunta

Estoy en la semana 5 de Andrew Ng, de la Máquina de Aprendizaje del Curso en Coursera. Estoy trabajando a través de la programación de la asignación en Matlab para esta semana, y decidí usar un bucle for aplicación para calcular el costo J. Aquí es mi función.

function [J grad] = nnCostFunction(nn_params, ...
                                   input_layer_size, ...
                                   hidden_layer_size, ...
                                   num_labels, ...
                                   X, y, lambda)
%NNCOSTFUNCTION Implements the neural network cost function for a two layer
%neural network which performs classification
%   [J grad] = NNCOSTFUNCTON(nn_params, hidden_layer_size, num_labels, ...
%   X, y, lambda) computes the cost and gradient of the neural network. The
%   parameters for the neural network are "unrolled" into the vector
%   nn_params and need to be converted back into the weight matrices. 

% Reshape nn_params back into the parameters Theta1 and Theta2, the weight matrices
% for our 2 layer neural network

Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                 hidden_layer_size, (input_layer_size + 1));

Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                 num_labels, (hidden_layer_size + 1));


% Setup some useful variables
m = size(X, 1);

% add bias to X to create 5000x401 matrix
X = [ones(m, 1) X];
         
% You need to return the following variables correctly 
J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));


% initialize summing terms used in cost expression
sum_i = 0.0;

% loop through each sample to calculate the cost
for i = 1:m

    % logical vector output for 1 example
    y_i = zeros(num_labels, 1);
    class = y(m);
    y_i(class) = 1;
    
    % first layer just equals features in one example 1x401
    a1 = X(i, :);
    
    % compute z2, a 25x1 vector
    z2 = Theta1*a1';
    
    % compute activation of z2
    a2 = sigmoid(z2);
    
    % add bias to a2 to create a 26x1 vector
    a2 = [1; a2];
    
    % compute z3, a 10x1 vector
    z3 = Theta2*a2;
    
    %compute activation of z3. returns output vector of size 10x1
    a3 = sigmoid(z3);
    h = a3;
    
    % loop through each class k to sum cost over each class
    for k = 1:num_labels        
        
        % sum_i returns cost summed over each class
        sum_i = sum_i + ((-1*y_i(k) * log(h(k))) - ((1 - y_i(k)) * log(1 - h(k))));
        
    end
        
end

J = sum_i/m;

Entiendo que un vectorizados establecimiento de ello sería más fácil, pero no entiendo por qué esta aplicación es incorrecta. Cuando num_labels = 10, esta función devuelve J = 8.47, pero el costo previsto es de 0.287629. Yo calculada J de esta fórmula. Estoy malentendido de la computación? Mi entendimiento es que cada entrenamiento ejemplo del costo para cada una de las 10 clases se calcula que el costo para todos los 10 clases para cada ejemplo se suman. Es eso correcto? O es que no la pongan en práctica en mi código correctamente? Gracias de antemano.

2
0

el problema está en la fórmula, se están implementando

esta expresión ((-1*y_i(k) * log(h(k))) - ((1 - y_i(k)) * log(1 - h(k)))); representa la pérdida en caso de que en la clasificación binaria porque usted simplemente tiene 2 clases por lo que sea

  1. y_i is 0 so (1 - yi) = 1
  2. y_i is 1 so (1 - yi) = 0

así que, básicamente, sólo toman en cuenta el objetivo de la clase de probabilidad.

cómo siempre en el caso de 10 etiquetas como usted menciona (y_i) o (1 - yi) no es necesario de que uno de ellos sea 0 y el otro 1

se debe corregir la pérdida de función de la aplicación, de modo que sólo se tienen en cuenta la probabilidad de la clase de destino no sólo de todas las otras clases.

2021-11-22 23:54:56
0

Mi problema es con la indexación. En vez de decir: class = y(m) debe ser class = y(i) desde i es el índice y m es de 5000 a partir del número de filas en los datos de entrenamiento.

2021-11-23 03:53:01

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................