Validation 使用Encog正确地进行培训和验证

Validation 使用Encog正确地进行培训和验证,validation,machine-learning,neural-network,encog,Validation,Machine Learning,Neural Network,Encog,我想我对Engo做了些错事。在我所看到的所有示例中,它们只是训练,直到达到某个训练错误,然后打印结果。何时计算渐变并更新隐藏层的权重?这些都包含在training.iteration()函数中吗?这毫无意义,因为即使我的训练错误在我的程序中不断减少,这似乎意味着权重在变化,但我还没有通过网络运行验证集(在开始构建数据时,我将验证集与训练集断开并分离)以确定验证错误是否仍随着训练错误而减少 我还将验证集加载到培训师中,并使用compute()通过网络运行它,但验证错误总是与培训错误相似-因此很难判

我想我对Engo做了些错事。在我所看到的所有示例中,它们只是训练,直到达到某个训练错误,然后打印结果。何时计算渐变并更新隐藏层的权重?这些都包含在training.iteration()函数中吗?这毫无意义,因为即使我的训练错误在我的程序中不断减少,这似乎意味着权重在变化,但我还没有通过网络运行验证集(在开始构建数据时,我将验证集与训练集断开并分离)以确定验证错误是否仍随着训练错误而减少

我还将验证集加载到培训师中,并使用compute()通过网络运行它,但验证错误总是与培训错误相似-因此很难判断它是否与培训中的错误相同。同时,测试命中率低于50%(如果不学习,则预期)


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

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

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

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

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

对不起,我对验证阶段发生的事情感到困惑。权重没有更新,但可以使用提前停止来防止过度拟合。然而,架构可以调整。。。可以根据验证集添加/删除神经元/层。这是正确的吗?这有点棘手,也有点主观。通常,您不希望验证集影响您的培训。一般来说,你必须以实用性来衡量这一点的实施。但是,如果修改体系结构以提高验证分数、更改权重,则现在使用的是将验证集合并到训练集中。提前停车几乎违反了这条规则,但这是一种常见的做法。交叉验证是另一种方法。再次感谢。这是你的绿色支票!