Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 1.83 KB | None | 0 0
  1. function [J grad] = nnCostFunction(nn_params, ...
  2.                                    input_layer_size, ...
  3.                                    hidden_layer_size, ...
  4.                                    num_labels, ...
  5.                                    X, y, lambda)
  6.  
  7. Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
  8.                  hidden_layer_size, (input_layer_size + 1));
  9.  
  10. Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
  11.                  num_labels, (hidden_layer_size + 1));
  12.  
  13. % Setup some useful variables
  14. m = size(X, 1);
  15. J = 0;
  16. Theta1_grad = zeros(size(Theta1));
  17. Theta2_grad = zeros(size(Theta2));
  18.  
  19. a1 = [ones(size(X,1),1) X];
  20. z2 = a1 * Theta1';
  21. a2 = sigmoid(z2);
  22. a2 = [ones(size(a2,1),1) a2];
  23. z3 = a2 * Theta2';
  24. result = sigmoid(z3);
  25.  
  26. new_y=zeros(m,num_labels);
  27. for i=1:m,
  28.     new_y(i,y(i))=1;
  29. end
  30. helperT1 = 2 : size(Theta1,2);
  31. helperT2 = 2 : size(Theta2,2);
  32. regularization = sum(sum(Theta1(:,helperT1).*Theta1(:,helperT1))) + sum(sum(Theta2(:,helperT2).*Theta2(:,helperT2)));
  33. regularization = regularization * lambda /(2*m);
  34. J = 1/m * sum(sum(-new_y.*log(result)-(ones(size(y))-new_y).*log(ones(size(result))-result))) + regularization;
  35.  
  36.  
  37. for t = 1:m
  38.     a1 = [1; X(t,:)'];
  39.     z2 = Theta1 * a1;
  40.     a2 = [1; sigmoid(z2)];
  41.     z3 = Theta2 * a2;
  42.     a3 = sigmoid(z3);
  43.     yk = ( [1:num_labels] == y(t) )';
  44.     delta_3 = a3 - yk;
  45.    
  46.     delta_2 = (Theta2' * delta_3) .* [1; sigmoidGradient(z2)];
  47.     delta_2 = delta_2(2:end);
  48.     Theta1_grad = Theta1_grad + delta_2 * a1';
  49.     Theta2_grad = Theta2_grad + delta_3 * a2';
  50. end
  51.  
  52. Theta1_grad = (1/m) * Theta1_grad + lambda * [zeros(size(Theta1, 1), 1) Theta1(:,2:end)] / m;
  53. Theta2_grad = (1/m) * Theta2_grad + lambda * [zeros(size(Theta2, 1), 1) Theta2(:,2:end)] / m;
  54.  
  55. % Unroll gradients
  56. grad = [Theta1_grad(:) ; Theta2_grad(:)];
  57.  
  58. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement