2017-04-24 30 views
0

このコードはAndrew Ngの機械学習コースのプログラミング課題です。Octave:関数が期待値を返しませんか?

この関数では、行ベクトル[J grad]が必要です。コードはJを計算します(ただし間違っていますが、ここでは問題はありません)。gradのダミー値を入力します(まだ計算するコードを記述していないためです)。コードを実行すると、Jの値を持つスカラーとしてansが出力されます。 gradはどこに行ったのですか?

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

あなたの要求 "それらを場合は、に割り当てることで、両方の出力をキャプチャすることができます:あなたは関数が同時に一つの出力値以上のものを返すことができ、あなたの関数宣言に指定されている

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

あなたが表示されません。あなただけ出力を望んでいたと「廃棄物」最初のもののための変数名にはしたくなかった場合は、例えば、第一の出力として~を指定することにより、これを行うことができますどのようにあなたの機能を呼び出す。 '[foo bar] = nnCostFunction(...)' – Andy

+0

私はこのように関数を呼び出します:nnCostFunction(nn_params、input_layer_size、hidden_​​layer_size、num_labels、X、y、lambda)。すべてのパラメータにはコースによって値が与えられているので、私はそれらを取り上げます。そして、2つの出力を持つことはどういう意味ですか?関数の定義では、関数の本体内で、呼び出し中...? –

答えて

2

1つの変数の代わりに変数の行列:

[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

詳細な回答ありがとうございます –