好吧,让我先说一下,我很清楚这取决于很多因素,我正在寻找有经验的人的一些一般指导方针。
我的目标是不是制作一个可以为我计算数字平方的神经网络,但我认为这将是一个很好的实验,看看我是否实现了反向传播算法正确。这看起来是个好主意吗?无论如何,我担心我没有(完全)正确地实现学习算法。
我的测试(结果):
- 训练数据:500 使用 Java 的 Random 随机生成介于 .001 和 .999 之间的数字
- 网络拓扑:3 层具有 1 个输入神经元、5 个隐藏神经元、1 个输出神经元
- 权重:全部生成为 -1 到 1 之间的随机值 (java.util.Random.nextDouble() * 2 - 1;)
- 使用偏置节点:(numOfInputs + 1) 使得输入[input.length -1] = 1
- 激活函数:Sigmoid
- 学习率:显示在下面的结果代码中
- 没有实现任何形式的动力等
- 结果:
Epochs: 10,000 Learning Rate .25 0.5 = [0.24203878039631344] 0.9 = [0.7942587190918747] 0.1 = [-0.005433286011774396] Changed learning rate to 0.3 0.5 = [0.2891542106869196] 0.9 = [0.8159817287374298] 0.1 = [-0.03614377685205278] Changed epoch to 1,000 with .25 learning rate 0.5 = [0.36399147315079117] 0.9 = [0.7585916275848852] 0.1 = [-0.02814488264341608] Kept epoch at 1,000 with .30 learning rate 0.5 = [0.3872669778857468] 0.9 = [0.8160049820236891] 0.1 = [-0.03328304871978338] Epochs: 100,000: .25 learning rate 0.5 = [0.24533230649123738] 0.9 = [0.8146287680498014] 0.1 = [0.006935561897963849] .30 learning rate 0.5 = [0.24660900415003595] 0.9 = [0.8097729997778165] 0.1 = [0.013269893700964097]
我应该尝试用其他任何“简单”“事物”来训练网络以检查其学习能力吗?
最佳答案
您可以做的最简单的事情之一就是计算 XOR 函数。为了测试“普通”多层感知器,这是我通常做的。在学习率为 0.2 的情况下,XOR 问题在不到 100 个时期内用 2 - 5 - 1 个神经元得到了完美解决(99% 的平均准确率)。
我用一个网络 (MLP) 编码了 (tanh,没有偏置神经元,但每个神经元都有偏置值,权重在 0.1 和 0.5 之间初始化,每个偏置初始化为 0.5,1.000 个训练数据集从 0.001 到 2.0 和激活归一化 (除输入层神经元以外的所有神经元的输入/激活除以父层中的神经元数量),1-5-1 神经元)我尝试了你的问题,每次通过学习在不到 2.000 个时期内获得了 95% 的平均准确率0.1 的比率。
这可能有几个原因。对于我的网络 0.001 到 1.0 需要大约两倍的时间来学习。此外,提到的激活归一化(在大多数情况下)大大减少了学习特定问题所需的时间。
除此之外,我对每个神经元的偏置值而不是每层一个偏置神经元有大部分积极的体验。
此外,如果你的学习率太高(并且你做了很多 epoch),你可能会遇到过度拟合的风险。
关于java - 神经网络应该学习多少个 epoch? (包括测试结果),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688527/