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

Java-Encog 3.2-RPROP网络不更新权重,java,neural-network,encog,Java,Neural Network,Encog,我研究了很多问题和例子,但我似乎无法找出我的RPROP NN有什么问题。这也是我第一次使用Encog,所以我想知道是不是我做错了什么 我正试图通过给猫喂食图像(50x50)来训练网络识别猫,然后将其转换为灰度并给网络喂食输入双精度[]和目标双精度[]。我注意到错误一直是4.0,所以我在每次训练迭代中都执行dumpWeights(),以查看发生了什么。我注意到重量一直是零。然后,我又回到了基础,看看我是否做得对,因此我针对XOR问题对其进行了修改: //////////First created

我研究了很多问题和例子,但我似乎无法找出我的RPROP NN有什么问题。这也是我第一次使用Encog,所以我想知道是不是我做错了什么

我正试图通过给猫喂食图像(50x50)来训练网络识别猫,然后将其转换为灰度并给网络喂食输入双精度[]和目标双精度[]。我注意到错误一直是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

。。。等等

你能看出我做错了什么吗?我还尝试了2-3-1体系结构作为XORHelloWorld.java示例的实现


任何帮助都将不胜感激

尝试将隐藏层切换到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作为导数的函数。

我只是尝试更改数据集和目标,用0.0替换-1,并将激活函数更改为ActivationSigmoid,似乎效果不错。更改后的输出:历元#48错误:0.007620154423525455 7.960025653965789,-14.1826808384842763,-1.261158421744572,-1.2781030810307181,10.5053716500236,9.69090558129927,-6.933186134247863,1.3562102936861975,1.6115414799461512,-2.8203649806273847,6.85571071016345,-4.423294726521557,2.52133147494805培训结束感谢杰夫的回复。我尝试了你的建议,我可以看到一个轻微的变化,但基本上我有相同的结果。权重只更新了一次,误差为2.0:0,0,0,0,0.4884507325564466,0.17375282591824576,-0.9245120358699924,0.39254804014179537,0.5835401350814016,0.9597289079109588历元#2207520错误:2.0我能够使其收敛的唯一方法是使用值为1和0的ActivationSigmoid作为输入和目标值,或者使用具有1和-1的ActivationSigmoid作为输入,使用值为1和0的目标向量,我也尝试使用ActivationBipolariastepenedSigmoid,网络有时收敛。在一次尝试中,我得到了:Epoch#45错误:0.008887634646260537在另一次尝试中,我得到了:Epoch#179852错误:0.999049357908(并继续运行)