1

我研究了很多问题和示例,但似乎无法找出我的 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");

我得到以下输出,注意 0.0 的行是 network.dumpWeights() 方法的结果:

纪元 #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 示例的实现。

任何帮助将不胜感激。

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 回答