簡體   English   中英

在Java中逐步詢問levenberg-marquardt

[英]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函數以相同的輸入和權重運行,以證明輸入和權重不是問題,並且matlabmse下降。

我不理解您的代碼,但是確定執行此操作時要確定它是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.

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