当前位置: 首页 > 知识库问答 >
问题:

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

蔺昊穹
2023-03-14

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

我试图训练网络识别猫,方法是给它提供图像(50x50),然后将其转换为灰度,并给网络提供输入双[][]和目标双[][]。我注意到错误一直在4.0,所以我在每次训练迭代中执行一个dupWeghts()来看看发生了什么。我注意到权重一直为零。然后我回到基础知识,看看我做的事情是否正确,所以我针对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,0 纪元 #132639 错误 : 2.0 0,0,0,0,0,0,0,0 纪元 #132640 错误 : 2.0

等等

你能看出我做错了什么吗?我还尝试了一个2-3-1架构,就像XORHelloWorld.java的例子一样。

任何帮助都将不胜感激。

共有1个答案

魏元白
2023-03-14

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

 类似资料:
  • composer network update实用程序用于将已部署业务网络档案从本地磁盘更新到Hyperledger Fabric运行时。 composer network update -a <business-network-archive> -c <card-name> 业务网络定义必须先被部署到Fabric。业务网络定义在相同的链码容器内被替换。 选项 Options: --help

  • 我已经用Java编程了一个神经网络,现在正在研究反向传播算法。 我已经了解到权重的批量更新将导致更稳定的梯度搜索,而不是在线权重更新。 作为一个测试,我创建了一个100点的时间序列函数,这样x=[0..99]和y=f(x)。我创建了一个神经网络,有一个输入和一个输出,还有两个隐藏层,有10个神经元用于测试。在解决这个问题时,我所面临的是反向传播算法的学习速度。 我有100个输入点,所以当我计算每个

  • 我在吴恩达教授的讲座或这方面的帮助下,使用图31算法实现神经网络。 我想我很好地理解了正向传播和反向传播,但混淆了每次迭代后更新权重(theta)。 何时以及如何更新权重(θ)矩阵-θ1,θ2? 大三角洲是干什么的?[已解决,谢谢@xhudik] 我们是否必须添加1(输入层和隐藏层中的偏差单位?)

  • 我的jfreeChart来自网络摄像头的帧。我通过这个框架,它生成一个图形的R,G和B颜色的这个框架。我想这个图表做自动更新,因为我通过帧。我什么都试过了,但都没用。 }

  • 我有一个以3x4矩阵排列的GridView,GridView中的每一项都是一个包含ImageView和Textview的FrameLayout。最初,文本视图被设置为显示字母“X”。点击后,字母变成“Y”。 它适用于除第一项之外的所有GridView项。如果我点击第一个(左上角),那么无论我等待多长时间,都不会发生任何事情。如果我点击Android模拟器屏幕上的任何其他地方(甚至在GridView

  • 当我计算抛物线的新系数时,抛物线的图没有更新。当老鼠是一条抛物线和移动时,计算出新的系数。将显示图形上的新系数,但绘图保持不变。为什么这样?