Sinir ağı için maliyet fonksiyonu hesaplaması

0

Soru

Andrew Ng'nin Coursera'daki Makine Öğrenimi Kursunun 5. haftasındayım. Bu hafta Matlab'da programlama ödevi üzerinde çalışıyorum ve maliyeti hesaplamak için bir for döngüsü uygulaması kullanmayı seçtim.İşte benim işlevim.

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;

Bunun vektörize bir uygulamasının daha kolay olacağını anlıyorum, ancak bu uygulamanın neden yanlış olduğunu anlamıyorum. Num_labels = 10 olduğunda, bu işlev J = 8.47 değerini verir, ancak beklenen maliyet 0.287629'dur. J'yi bu formülden hesapladım. Hesaplamayı yanlış mı anladım? Anladığım kadarıyla, her eğitim örneğinin 10 sınıfın her biri için maliyeti hesaplanır, ardından her örnek için 10 sınıfın maliyeti bir araya getirilir. Bu hatalı bir varsayım mı? Yoksa bunu kodumda düzgün bir şekilde uygulamadım mı? Şimdiden teşekkürler.

2
0

sorun, uyguladığınız formülde

bu ifade ((-1*y_i(k) * log(h(k))) - ((1 - y_i(k)) * log(1 - h(k)))); ikili sınıflandırmada kaybı temsil edin, çünkü sadece 2 sınıfınız vardı

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

yani temel olarak sadece hedef sınıf olasılığını hesaba katarsınız.

bahsettiğiniz gibi (y_i) veya (1 - yi) 10 etiket olması durumunda, bunlardan birinin 0 olması ve diğerinin 1 olması gerekmez mi

bu yüzden sadece hesaba hedef sınıfı değil sadece tüm diğer sınıfların olasılık sizi kaybı işlev uygulama düzeltmeniz gerekir.

2021-11-22 23:54:56
0

Benim sorunum indeksleme ile ilgili. Söylemek yerine class = y(m) öyle olmalı class = y(i) dan beri i endeks ve m eğitim verilerindeki satır sayısından 5000'dir.

2021-11-23 03:53:01

Diğer dillerde

Bu sayfa diğer dillerde

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