1

多くの質問と例を調査しましたが、RPROP NN の何が問題なのかわかりません。また、Encog を使用するのは初めてなので、何か間違っているのではないかと思っています。

画像 (50x50) を供給し、それをグレースケールに変換し、入力 double[][] とターゲット double[][] をネットワークに供給することで、ネットワークを訓練して猫を認識しようとしています。エラーが常に 4.0 であることに気付いたので、トレーニングの反復ごとに dumpWeights() を実行して、何が起こっているかを確認しました。重みが常にゼロであることに気付きました。次に、基本に戻って、正しいことを行っているかどうかを確認したので、XOR 問題用に修正しました。

//////////First created the network:

BasicNetwork network = new BasicNetwork();

network.addLayer(new BasicLayer(null, true, 2));
network.addLayer(new BasicLayer(new ActivationBiPolar(), true, 2));
network.addLayer(new BasicLayer(new ActivationBiPolar(), false, 1));

network.getStructure().finalizeStructure();
network.reset(); 

//////Then created my data set and target vector (ideal vector) and fed it to a new RPROP training class:

final double targetVector[][] = { { -1 }, { 1.0 }, { 1.0 }, { -1 } };
final double inputData[][] = { { -1, -1 }, { 1.0, -1 },{ -1, 1.0 }, { 1.0, 1.0 } };

MLDataSet trainingSet = new BasicMLDataSet(inputData, targetVector);

final ResilientPropagation train = new ResilientPropagation(network, trainingSet);

///////train network

int epoch = 1;

    do{
        train.iteration();
        System.out.println("Epoch #" + epoch + " Error : " + train.getError()) ;
        epoch++;

        System.out.println(network.dumpWeights());

    }while(train.getError() > 0.01) ;
        train.finishTraining();

        System.out.println("End of training");

次の出力が得られます。network.dumpWeights() メソッドの結果として 0.0 の行に注目してください。

エポック #132636 エラー: 2.0 0,0,0,0,0,0,0,0,0 エポック #132637 エラー: 2.0 0,0,0,0,0,0,0,0,0 エポック #132638 エラー: 2.0 0,0,0,0,0,0,0,0,0 エポック #132639 エラー: 2.0 0,0,0,0,0,0,0,0,0 エポック #132640 エラー: 2.0

... 等々。

ここで私が間違っていることがわかりますか?また、XORHelloWorld.java の例が実装されているので、2-3-1 アーキテクチャも試しました。

どんな助けでも大歓迎です。

4

1 に答える 1

1

次のように、非表示レイヤーを TANH 活性化関数に切り替えてみてください。

network.addLayer(new BasicLayer(null, true, 2));
network.addLayer(new BasicLayer(new ActivationTANH(), true, 2));
network.addLayer(new BasicLayer(new ActivationBiPolar(), false, 1));

この変更により、上記の例を収束させることができます。入力として-1から1を使用している場合、Sigmoidよりもうまく機能すると思います。線形活性化関数 (つまり、出力活性化関数としての ActivationBiPolar) は問題ありませんが、非表示として sigmoid/tanh などの何かが必要です。線形関数のように、導関数として 1.0 を返すだけではないもの。

于 2014-11-06T22:09:05.457 に答える