La fonction de coût de calcul pour le réseau de neurones

0

La question

Je suis dans la semaine 5 de Andrew Ng Machine Learning Cours sur Coursera. Je suis en train de travailler par le biais de la programmation de l'affectation dans Matlab pour cette semaine, et j'ai choisi d'utiliser une boucle pour la mise en œuvre de calculer le coût J. Voici ma fonction.

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;

Je comprends qu'un vectorisé implementaion de cette serait plus facile, mais je ne comprends pas pourquoi cette mise en œuvre est faux. Lorsque num_labels = 10, cette fonction génère J = 8.47, mais le coût prévu est 0.287629. J'ai calculé J à partir de cette formule. Suis-je malentendu le calcul? Ma compréhension est que chaque formation exemple de coût pour chacun des 10 classes sont alors calculé le coût pour l'ensemble des 10 classes pour chaque exemple sont additionnées. Est incorrect? Ou n'ai-je pas l'implémenter dans mon code correctement? Merci à l'avance.

2
0

le problème est dans la formule que vous êtes la mise en œuvre de

cette expression ((-1*y_i(k) * log(h(k))) - ((1 - y_i(k)) * log(1 - h(k)))); représenter la perte en cas de classification binaire parce que vous étiez tout simplement avoir 2 classes soit

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

donc en gros, vous prenez en compte que la cible de la classe de probabilité.

comment jamais, en cas de 10 étiquettes comme vous le mentionnez (y_i) ou (1 - yi) pas nécessaire de l'un d'eux à 0 et l'autre à 1

vous devez corriger la perte de la fonction de mise en œuvre, de sorte que vous ne prenez en compte la probabilité de la classe cible non seulement toutes les autres classes.

2021-11-22 23:54:56
0

Mon problème est avec l'indexation. Plutôt que de dire class = y(m) il devrait être class = y(i) depuis i l'index et m est de 5000 le nombre de lignes dans les données d'apprentissage.

2021-11-23 03:53:01

Dans d'autres langues

Cette page est dans d'autres langues

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