我研究了很多问题和例子,但我似乎无法找出我的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示例已实现。
非常感谢任何帮助。
答案 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作为导数返回的东西,就像线性函数那样。