[英]ask step by step levenberg-marquardt in java
我正在嘗試用Java編寫levenberg marquardt
,這是我的代碼:
while (iter <= 10 || mse < 0.0001) {
call.calc_jacobian(ff, trainlm, input, akt1, akt2, w, x, t);
double[][] jacobian = trainlm.ret_jacob();
double[][] error = trainlm.ret_err();
mse = trainlm.ret_mse() / 4;
mse_all[iter] = mse;
test: for (int m = 0; m <= 5; m++) {
upb.koreksi_w(miu, hidden, jacobian, error, w);
double[][] w_new = upb.ret_upw();
call.test_ff(ff, trainlm, input, akt1, akt2, w_new, x, t);
double mse2 = trainlm.ret_mse() / 4;
if (mse2 < mse || m == 5) {
miu = miu / beta;
w_skrg = w_baru;
iter++;
break test;
} else {
miu = miu * beta;
}
}
}
函數calc_jacobian
是我用來計算前饋和反向傳播運算以計算Jacobian值的函數。 函數koreksi_w
用於使用Jacobian,誤差,miu和實際權重來更新新權重,它將給出新的權重,並且test_ff
計算前饋以獲取mse
值。
我的問題是,當我嘗試運行這些代碼時,mse的值不會減少,因此我在matlab
使用trainlm
函數以相同的輸入和權重運行,以證明輸入和權重不是問題,並且matlab
, mse
下降。
我不理解您的代碼,但是確定執行此操作時要確定它是Integer division
:
mse = trainlm.ret_mse() / 4; //OR:
double mse2 = trainlm.ret_mse() / 4;
如您所願,我建議使用強制轉換或類似方法:
double mse2 = trainlm.ret_mse() / (double)4; //OR:
double mse2 = trainlm.ret_mse() / 4.0;
還要檢查miu = miu / beta;
( beta
是兩倍嗎?)
我懷疑MathLab
在Java不執行的情況下進行浮點除法...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.