Java - Encog 3.2 - RPROP网络不更新权重

时间:2014-11-06 11:54:15

标签: java neural-network encog

我研究了很多问题和例子,但我似乎无法找出我的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 Epoch#132637错误:2.0 0,0,0,0,0,0,0,0,0 时代#132638错误:2.0 0,0,0,0,0,0,0,0,0 Epoch#132639错误:2.0 0,0,0,0,0,0,0,0,0 Epoch#132640错误:2.0

......等等。

任何明显的事情你都可以看到我在这里做错了吗?我还尝试了2-3-1架构,因为XORHelloWorld.java示例已实现。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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作为导数返回的东西,就像线性函数那样。