2014-06-21 29 views
2

我想我在Encog中做了一些错误。在我见过的所有例子中,他们只是训练,直到达到某个训练错误,然后打印结果。何时计算梯度并更新隐藏层的权重?这是否全部包含在training.iteration()函数中?这是没有意义的,因为尽管我的训练错误在我的程序中持续下降,这似乎意味着权重在变化,但我还没有通过网络运行验证集(我在建立时断开并与训练集分离在开始的数据),以确定验证错误是否仍然随着训练错误而下降。使用Encog正确地进行培训和验证

我也将验证集加载到教练器中,并通过compute()运行它,但验证错误总是与训练错误相似 - 因此很难判断它是否与训练错误相同。同时,测试命中率低于50%(如果没有学习,预期)。

我知道有很多不同类型的反推技术,特别是使用梯度下降和弹性反推技术的常见技术。我们希望自己手动更新网络的哪一部分?

回答

3

在Encog中,权重在Train.iteration方法调用期间更新。这包括所有重量。如果您使用的是梯度下降式训练器(即backprop,rprop,quickprop),则在每次迭代调用结束时更新神经网络。如果您使用的是基于人口的培训师(即遗传算法等),则必须调用finishTraining,以便将最佳群体成员复制回传递给培训师构造函数的实际神经网络。实际上,在迭代后调用finishTraining总是一个好主意。有些培训师需要它,有些则不需要。

另一件需要记住的事情是,一些培训师在迭代调用开始时报告当前错误,其他人在迭代中报告错误(改进错误)。这是为了有效地避免一些培训者不得不对数据迭代两次。

保留验证集以测试您的培训是一个好主意。以下几种方法可能对您有所帮助:

BasicNetwork.dumpWeights - 显示您的神经网络的权重。这可以让你看看他们是否已经改变。 BasicNetwork.calculateError - 将训练集传递给它,它会给你错误。

+0

对不起,我对验证阶段发生的事情感到困惑。没有更新权重,但可以使用提前停止来防止过度配合。但是,可以调整体系结构_...神经元/层可以根据验证集添加/删除。它是否正确? –

+0

这有点棘手,有点主观。一般来说,你不希望验证集影响你的训练。一般来说,你必须以实用性来强调这一点。但是,如果修改体系结构以提高验证分数,请更改权重,则您现在正在将验证集合并入训练集。尽早停止违反这条规则,但这是一种常见做法。交叉验证是另一种方法。 – JeffHeaton

+1

再次感谢您。有你的绿色支票! –

相关问题