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