一旦看到从验证集计算出的错误开始增加,我想停止训练网络。我使用带有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构造函数同时使用验证集和测试集。我以为它只需要验证集,而在我测试网络的输出之前根本不应该使用测试集。

最佳答案

Encog的EarlyStoppingStrategy类根据本文实现了一种早期停止策略:

Proben1 |一组神经网络基准问题和基准规则

(完整引用包含在Javadoc中)

如果您只是想在验证集的错误不再改善后立即停止,则可能只想使用Encog SimpleEarlyStoppingStrategy,可在以下位置找到:

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

请注意,SimpleEarlyStoppingStrategy需要Encog 3.3。

10-08 13:04