簡體   English   中英

Octave 將 5000*10 矩陣視為 16*4 矩陣

[英]Octave Treats a 5000*10 Matrix As a 16*4 Matrix

我正在嘗試使用 Octave 提交用 MATLAB 編寫的作業。 h_theta2矩陣是 MATLAB 中的 5000*10 矩陣(請參閱隨附的屏幕截圖),代碼在 MATLAB 中運行良好。 但是當我嘗試在 Octave 中提交作業時,它會返回以下錯誤:

提交失敗:operator -: nonconformant arguments (op1 is 16x4, op2 is 5000x10)

LineNumber:98(指的是附加屏幕截圖中的delta3=h_theta2-y_2 。)

在此處輸入圖像描述

這(我猜)意味着 Octave 將h_theta2視為 16*4 矩陣。

該代碼應該估計神經網絡的成本 function 和梯度。 X、y、Theta1 和 Theta2 在作業中給出。

function [J grad] = nnCostFunction(nn_params, ...
                               input_layer_size, ...
                               hidden_layer_size, ...
                               num_labels, ...
                               X, y, lambda)

NNCOSTFUNCTION 為執行分類的兩層神經網絡實現神經網絡成本 function。 [J grad] = NNCOSTFUNCTON(nn_params, hidden_layer_size, num_labels, ..., X, y, lambda)計算神經網絡的成本和梯度。 神經網絡的參數被“展開”到向量 nn_params 中,需要轉換回權重矩陣。

返回的參數 grad 應該是神經網絡的偏導數的“展開”向量。

nn_params重新整形為參數Theta1Theta2 ,即權重矩陣。 對於 2 層神經網絡:

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

m = size(X, 1);
     

我需要正確返回以下變量:

J = 0;
Theta1_grad = zeros(size(Theta1));
Theta2_grad = zeros(size(Theta2));

Sigmoid function 在另一個文件中定義,在這里調用以計算h_theta1h_theta2

%Sigmoid function:
function g = sigmoid(z)
%SIGMOID Compute sigmoid function
%   J = SIGMOID(z) computes the sigmoid of z.
g = 1.0 ./ (1.0 + exp(-z));
end

前饋神經網絡並返回變量 J 中的成本:

X = [ones(m, 1) X];
h_theta1=sigmoid(X*Theta1');

h_theta1=[ones(m,1) h_theta1];
h_theta2=sigmoid(h_theta1*Theta2');


y_2=zeros(5000,10);

for k=1:10
    condition=y(:,1)==k;
        y_2(condition,k)=1;
end


for i=1:m
   for k=1:num_labels
      e(i,k)=-y_2(i,k)'*log(h_theta2(i,k))-(1-y_2(i,k)')*log(1-h_theta2(i,k));
   end
end


J=(1/m)*sum(e);
J=sum(J);
Theta_1=Theta1;
Theta_2=Theta2;
Theta_1(:,1)=[];
Theta_2(:,1)=[];

%Regularized cost function:

J=J+(lambda/(2*m))*(sum(sum(Theta_1.*Theta_1))+sum(sum(Theta_2.*Theta_2)));

%Gradient calculation

delta3=h_theta2-y_2;
delta2=(delta3*Theta2).*h_theta1.*(1-h_theta1);
Theta2_grad=Theta2_grad+delta3'*h_theta1;
Theta2_grad=(1/m)*Theta2_grad;
delta_2=delta2;
delta_2(:,1)=[];
Theta1_grad=Theta1_grad+delta_2'*X;
Theta1_grad=(1/m)*Theta1_grad;

然后我在 Octave 中使用submit() function 提交上述代碼。 該代碼適用於J計算,但隨后出現以下錯誤:

octave:80> submit()
== Submitting solutions | Neural Networks Learning...
Use token from last successful submission? (Y/n): Y

!! Submission failed: operator -: nonconformant arguments 
(op1 is 16x4, op2 is 5000x10)


Function: nnCostFunction
LineNumber: 98

Please correct your code and resubmit.

任何幫助將非常感激。

我弄清楚問題出在哪里。 問題是評分者使用完全不同的數據集測試我的答案,並且我創建了具有固定尺寸的y_2 我應該做的是按如下方式創建y_2

y_2=zeros(m,num_labels);


for k=1:num_labels
    condition=y(:,1)==k;
        y_2(condition,k)=1;
end

這使得代碼適用於 m 和 num_labels 的任何值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM