我认为我在使用Encog做错了。在我看过的所有例子中,他们只是训练直到达到某个训练错误,然后打印结果。何时计算梯度并更新隐藏层的权重?这都包含在training.iteration()函数中吗?这没有任何意义,因为即使我的TRAINING错误在我的程序中持续减少,这似乎意味着权重正在发生变化,我还没有通过网络运行验证集(我在构建时断开并与训练集分开)开头的数据),以确定验证错误是否仍然随着训练错误而减少。
我还将验证集加载到培训师中并使用compute()在网络中运行,但验证错误始终与培训错误类似 - 因此很难判断培训中是否存在相同的错误。同时,测试命中率低于50%(如果不学习则预期)。
我知道有很多不同类型的背向传播技术,特别是使用梯度下降和弹性背向传播的常见技术。我们希望自己手动更新网络的哪个部分?
答案 0 :(得分:3)
在Encog中,在Train.iteration方法调用期间更新权重。这包括所有重量。如果您使用梯度下降型训练器(即backprop,rprop,quickprop),则在每次迭代调用结束时更新您的神经网络。如果您使用的是基于人口的训练员(即遗传算法等),则必须调用finishTraining,以便将最佳人口成员复制回您传递给训练者构造函数的实际神经网络。实际上,在迭代之后调用finishTraining总是一个好主意。有些培训师需要它,有些则不需要。
要记住的另一件事是,一些培训师在迭代调用开始时报告当前错误,其他人在迭代时报告(改进的错误)。这样可以提高效率,使一些培训师不必重复数据两次。
保留验证集以测试您的培训是一个好主意。一些可能对您有所帮助的方法:
BasicNetwork.dumpWeights - 显示神经网络的权重。这允许您查看它们是否已更改。 BasicNetwork.calculateError - 将训练集传递给它,它会给你错误。