0

Matlab を使用してバックプロパゲーション ニューラル ネットワークを作成しました。私はMatlabを使用してXORゲートを実装しようとし、その重みとバイアスを取得してJavaでニューラルネットワークを作成しました。ネットワークは、2 つの入力ニューロン、それぞれ 2 つのニューロンと 1 つの出力ニューロンを使用する 2 つの隠れ層で構成されます。列車ネットワークの後、次の重みとバイアスを得ました:

clear;
clc;
i = [0 0 1 1; 0 1 0 1];
o = [0 1 1 0];
net = newff(i,o,{2,2},{'tansig','logsig','purelin'});
net.IW{1,1} = [
    -5.5187   -5.4490;
     3.7332    2.7697
];
net.LW{2,1} = [
   -2.8093   -3.0692;
   -1.6685    6.7527
];
net.LW{3,2} = [
    -4.9318   -0.9651
];
net.b{1,1} = [
    2.1369;
    2.6529
];
net.b{2,1} = [
    -0.2274;
    -4.9512
];
net.b{3,1} = [
    1.4848
];

input  = net.IW{1,1};
layer  = net.LW{2,1};
output = net.LW{3,2};

biasinput = net.b{1,1};
biaslayer = net.b{2,1};
biasoutput= net.b{3,1};


a = sim(net,i);
a;

入力が次の結果を得たので、1と1を使用してシミュレートします。

>> f = [1;1]

f =

     1
     1

>> sim(net,f)

ans =

   -0.1639

次に、このニューラル ネットワークをカウントするための簡単な Java コードを作成しようとしました。私のコード:

public class Xor {

    //Value of neuron
    static double[] neuroninput    = new double[2];
    static double[] neuronhidden1  = new double[2];
    static double[] neuronhidden2  = new double[2];
    static double[] neuronoutput   = new double[2];

    //Weight variable init
    //For first hidden layer
    static double[] weighthidden11 = new double[2];
    static double[] weighthidden12 = new double[2];

    //for second hidden layer
    static double[] weighthidden21 = new double[2];
    static double[] weighthidden22 = new double[2];

    //for output layer
    static double[] weightoutput   = new double[2];
    //End of weight variable init

    //Bias value input
    static double[] biashidden1    = new double[2];
    static double[] biashidden2    = new double[2];
    static double[] biasoutput     = new double[1];

    public static void main(String[] args) {
        neuroninput[0] = 1;
        neuroninput[1] = 1;

        weighthidden11[0] = -5.5187;
        weighthidden11[1] = -5.4490;
        weighthidden12[0] =  3.7332;
        weighthidden12[1] =  2.7697;

        weighthidden21[0] = -2.8093;
        weighthidden21[1] = -3.0692;
        weighthidden22[0] = -1.6685;
        weighthidden22[1] =  6.7527;

        weightoutput[0]    = -4.9318;
        weightoutput[1]    = -0.9651;

        biashidden1[0] = 2.1369;
        biashidden1[1] = 2.6529;

        biashidden2[0] = -0.2274;
        biashidden2[1] = -4.9512;

        biasoutput[0]  = 1.4848;

        //Counting each neuron (Feed forward)
        neuronhidden1[0] = sigma(neuroninput,weighthidden11,biashidden1[0]);
        neuronhidden1[0] = tansig(neuronhidden1[0]);

        neuronhidden1[1] = sigma(neuroninput,weighthidden12,biashidden1[1]);
        neuronhidden1[1] = tansig(neuronhidden1[1]);


        neuronhidden2[0] = sigma(neuronhidden1,weighthidden21,biashidden2[0]);
        neuronhidden2[0] = logsig(neuronhidden2[0]);

        neuronhidden2[1] = sigma(neuronhidden1,weighthidden22,biashidden2[1]);
        neuronhidden2[1] = logsig(neuronhidden2[1]);

        neuronoutput[0] = sigma(neuronhidden2,weightoutput,biasoutput[0]);
        neuronoutput[0] = purelin(neuronoutput[0]);
        System.out.println(neuronoutput[0]);
    }

    static double tansig(double x) {
        double value = 0;
        value = (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x));
        return value;
    }

    static double logsig(double x) {
        double value = 0;
        value = 1 / (1+Math.exp(-x));
        return value;
    }

    static double purelin(double x) {
        double value = x;
        return value;
    }

    static double sigma(double[] val, double[] weight, double hidden) {
        double value = 0;
        for (int i = 0; i < val.length; i++) {
            value += (val[i] * weight[i]);
            //System.out.println(val[i]);
        }
        value += hidden;
        return value;
    }
}

しかし、次のような結果が得られました。

-1.3278721528152158

私の質問は、重みとバイアスの値を matlab から Java にエクスポートする際にエラーまたは間違いがありますか? たぶん私は私のJavaプログラムで間違いを犯しましたか? どうもありがとうございました..

4

2 に答える 2

2

問題は正規化だと思います: http://www.mathworks.com/matlabcentral/answers/14590

0,1 入力で作業する場合は、値を [-1; に変換する f(x)=2*x-1 正規化関数を使用する必要があります。1] 間隔、次に g(x)=(x+1)/2 を使用して出力を [0; 1] に戻します。1]。擬似コード:

g( java_net( f(x), f(y) ) ) = matlab_net(x, y)

これを他のネットワークで試してみたところ、うまくいきました。

于 2013-04-22T16:36:24.457 に答える
0

あなたの問題は、Matlabsim()コマンドの JAVA バージョンに最も確実に関連しています。

これは、シミュレートするネットワークのアーキテクチャに影響を与える多くの設定を持つ複雑な Matlab コマンドです。デバッグを容易にするために、Matlab で sim() コマンドを自分で実装してみてください。sim()-builtin と独自のsimバージョンの間で Matlab で一致するまで、レイヤーの数を減らす可能性があります。それが機能したら、JAVAに変換します。

編集:

関数を Matlabで再実装する理由はsim()、ここで実装できない場合、JAVA でも適切に実装できないためです。フィード フォワード ネットワークは、Matlab ベクトル表記を使用して簡単に実装できます。

于 2013-01-09T20:24:06.003 に答える