2017-04-24 126 views
0

此代碼是Andrew Ng機器學習課程的編程任務。Octave:函數不返回期望值?

函數期待行向量[J grad]。該代碼計算J(雖然錯了,但這不是問題),並且我爲grad輸入了一個虛擬值(因爲我還沒有編寫代碼來計算它)。當我運行代碼時,它只輸出ans作爲標量,其值爲Jgrad去哪了?

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. 
% 
% The returned parameter grad should be a "unrolled" vector of the 
% partial derivatives of the neural network. 
% 

% 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); 

% You need to return the following variables correctly 
J = 0; 
Theta1_grad = zeros(size(Theta1)); 
Theta2_grad = zeros(size(Theta2)); 

% ====================== YOUR CODE HERE ====================== 
% Instructions: You should complete the code by working through the 
%    following parts. 
% 
% Part 1: Feedforward the neural network and return the cost in the 
%   variable J. After implementing Part 1, you can verify that your 
%   cost function computation is correct by verifying the cost 
%   computed in ex4.m 
% 
% Part 2: Implement the backpropagation algorithm to compute the gradients 
%   Theta1_grad and Theta2_grad. You should return the partial derivatives of 
%   the cost function with respect to Theta1 and Theta2 in Theta1_grad and 
%   Theta2_grad, respectively. After implementing Part 2, you can check 
%   that your implementation is correct by running checkNNGradients 
% 
%   Note: The vector y passed into the function is a vector of labels 
%    containing values from 1..K. You need to map this vector into a 
%    binary vector of 1's and 0's to be used with the neural network 
%    cost function. 
% 
%   Hint: We recommend implementing backpropagation using a for-loop 
%    over the training examples if you are implementing it for the 
%    first time. 
% 
% Part 3: Implement regularization with the cost function and gradients. 
% 
%   Hint: You can implement this around the code for 
%    backpropagation. That is, you can compute the gradients for 
%    the regularization separately and then add them to Theta1_grad 
%    and Theta2_grad from Part 2. 
% 

% PART 1 

a1 = [ones(m,1) X]; % set a1 to equal X and add column of 1's 

z2 = a1 * Theta1'; % matrix times matrix [5000*401 * 401*25 = 5000*25] 
a2 = [ones(m,1),sigmoid(z2)]; % sigmoid function on matrix [5000*26] 
z3 = a2 * Theta2'; % matrix times matrix [5000*26 * 26*10 = 5000 * 10] 
hox = sigmoid(z3); % sigmoid function on matrix [5000*10] 

for k = 1:num_labels 

    yk = y == k; % using the correct column vector y each loop 
    J = J + sum(-yk.*log(hox(:,k)) - (1-yk).*log(1-hox(:,k))); 

end 

J = 1/m * J; 

% ------------------------------------------------------------- 

% ========================================================================= 

% Unroll gradients 
% grad = [Theta1_grad(:) ; Theta2_grad(:)]; 
grad = 6.6735; 

end 
+0

你不顯示:如果你只想要輸出和不想「浪費」的第一個變量名,可以通過指定~作爲第一輸出,如做到這一點你如何稱呼你的功能。確保有2個輸出:'[foo bar] = nnCostFunction(...)' – Andy

+0

我打電話給我的函數是這樣的:nnCostFunction(nn_params,input_layer_size,hidden_​​layer_size,num_labels,X,y,lambda)。所有參數都由課程中的值提供,所以我把它們放進去了。你有兩個輸出是什麼意思?在函數定義中調用函數的主體時,...? –

回答

2

你已經在你的函數聲明該函數可以同時返回多個輸出值規定:

function [J grad] = nnCostFunction(nn_params, ... % etc 

您可以捕獲兩個輸出,如果你將其分配給「請求」他們變量矩陣而不是單個變量:

[a, b] = nnCostFunction(input1, input2, etc) 

如果您不這樣做,那麼您本質上只是「請求」第一個返回的變量:

a = nnCostFunction(input1, input2, etc) % output 'b' is discarded. 

如果不指定一個變量分配給所有,倍頻默認分配給「默認」變量ans。因此,這實質上等同於做

ans = nnCostFunction(input1, input2, etc) % output 'b' is discarded. 

請參閱find功能(即help find在八度的終端類型)的文檔,看這樣的功能的一個例子。


PS。

[~, b] = nnCostFunction(input1, input2, etc) % output 'a' is discarded 
+0

感謝您的詳細解答 –