2

我认为我对 Encog 做错了什么。在我见过的所有例子中,他们只是简单地训练直到达到某个训练错误,然后打印结果。什么时候计算梯度并更新隐藏层的权重?这是否都包含在 training.iteration() 函数中?这是没有意义的,因为即使我的程序中的 TRAINING 错误不断减少,这似乎意味着权重正在发生变化,但我还没有通过网络运行验证集(我在构建时断开并与训练集分离)开始时的数据)以确定验证误差是否仍然随着训练误差而减小。

我还将验证集加载到训练器中并使用 compute() 通过网络运行它,但验证错误始终与训练错误相似 - 所以很难判断它是否与训练错误相同。同时,测试命中率低于 50%(不学习时预期)。

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

4

1 回答 1

3

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

要记住的另一件事是,一些培训师在迭代调用开始时报告当前错误,其他培训师在迭代时报告(改进的错误)。这是为了提高效率,以使一些培训师不必对数据进行两次迭代。

保留一个验证集来测试你的训练是一个好主意。一些可能对您有帮助的方法:

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

于 2014-06-22T01:29:50.640 回答