2

22 の入力と 1 つの出力 (1 または 0) を持つフィードフォワード BackPropogation ANN を設計しています。NN には 3 つの層があり、10 個の隠れニューロンを使用しています。NN を実行すると、重みがわずかに変化するだけで、出力の合計エラーは約 40% です。最初は、オーバー/アンダー フィッティングだと思っていましたが、隠れニューロンの数を変更した後、何も変わりませんでした。

N は入力数 (22)

M は隠れニューロンの数 (10)

これは、逆伝播に使用しているコードです

oin は、シグモイド関数に入れる前に計算された出力です

oout は、シグモイド関数を通過した後の出力です

double odelta = sigmoidDerivative(oin) * (TARGET_VALUE1[i] - oout);
    double dobias = 0.0;
    double doweight[] = new double[m];

    for(int j = 0; j < m; j++)
    {
        doweight[j] = (ALPHA * odelta * hout[j]) + (MU * (oweight[j] - oweight2[j]));
        oweight2[j] = oweight[j];
        oweight[j] += doweight[j];
    } // j

    dobias = (ALPHA * odelta) + (MU * (obias - obias2));
    obias2 = obias;
    obias += dobias;

    updateHidden(N, m, odelta);

これは、隠れニューロンを変更するために使用しているコードです。

 for(int j = 0; j < m; j++)
        {
            hdelta = (d * oweight[j]) * sigmoidDerivative(hin[j]);

            for(int i = 0; i < n; i++)
            {
                dhweight[i][j] = (ALPHA * hdelta * inputNeuron[i]) + (MU * (hweight[i][j] - hweight2[i][j]));
                hweight2[i][j] = hweight[i][j];
                hweight[i][j] += dhweight[i][j];


            } 

            dhbias[j] = (ALPHA * hdelta) + (MU * (hbias[j] - hbias2[j]));
            hbias2[j] = hbias[j];
            hbias[j] += dhbias[j];
        } `
4

1 に答える 1

1

1 つのノードで 2 つのクラスを出力するネットワークを学習しています。このネットワークに接続された重みは、1 つのクラスを予測してから別のクラスを予測するように適応しています。そのため、ほとんどの場合、重みはデータの優勢なクラスに適応されます。この問題を回避するには、別のノードを追加して、出力に 2 つのノードがあり、それぞれが 1 つのクラスを参照するようにします。

于 2016-12-31T14:24:46.680 に答える