1

一旦我看到从验证集计算的误差开始增加,我想停止训练网络。我正在使用带有 RPROP 的 BasicNetwork 作为训练算法,并且我有以下训练迭代:

double validationError = 999.999;


    while(!stop){

        train.iteration(); //weights are updated here

        System.out.println("Epoch #" + epoch + " Error : " + train.getError()) ;

        //I'm just comparing to see if the error on the validation set increased or not
        if (network.calculateError(validationSet) < validationError)
            validationError = network.calculateError(validationSet); 

        else
            //once the error increases I stop the training.
            stop = true ;

        System.out.println("Epoch #" + epoch + "Validation Error" + network.calculateError(validationSet));

        epoch++;

    }
        train.finishTraining();

显然这是行不通的,因为在确定我是否需要停止训练之前,权重已经改变了。无论如何我可以退后一步并使用旧的重量吗?

我还看到了EarlyStoppingStrategy使用该addStrategy()方法可能需要使用的类。但是,我真的不明白为什么EarlyStoppingStrategy构造函数同时接受验证集和测试集。我认为它只需要验证集,并且在我测试网络输出之前根本不应该使用测试集。

4

1 回答 1

2

根据这篇论文,Encog 的 EarlyStoppingStrategy 类实现了一个提前停止策略:

探针1 | 一组神经网络基准问题和基准规则

(完整的引用包含在 Javadoc 中)

如果您只想在验证集的错误不再改善时立即停止,您可能只想使用 Encog SimpleEarlyStoppingStrategy,可在此处找到:

org.encog.ml.train.strategy.end.SimpleEarlyStoppingStrategy

请注意,SimpleEarlyStoppingStrategy 需要 Encog 3.3。

于 2014-11-12T00:28:22.487 回答