如何在Tensorflow中实现早停和学习率衰减?

3
我希望为使用TensorFlow构建的神经网络模型实现两个回调函数EarlyStoppingReduceLearningRateOnPlateau。(我不使用Keras)下面的示例代码是我如何实现停止训练。我不确定是否正确。
# A list to record loss on validation set
val_buff = []
# If early_stop == True, then terminate training process
early_stop = False

while icount < maxEpoches:

    '''Shuffle the training set'''
    '''Update the model by using Adam optimizer over the entire training set'''

    # Evaluate loss on validation set
    val_loss = self.sess.run(self.loss, feed_dict = feeddict_val)
    val_buff.append(val_loss)

    if icount % ep == 0:

        diff = np.array([val_buff[ind] - val_buff[ind - 1] for ind in range(1, len(val_buff))])
        bad = len(diff[diff > 0])
        if bad > 0.5 * len(diff):
            early_stop = True

        if early_stop:
            self.saver.save(self.sess, 'model.ckpt')
            raise OverFlow()
        val_buff = []

    icount += 1

当我训练模型并跟踪验证集上的损失时,我发现损失值会上下波动,因此很难确定模型何时开始过拟合。

由于EarlystoppingReduceLearningRateOnPlateau非常相似,我该如何修改上面的代码来实现ReduceLearningRateOnPlateau

1个回答

3

振荡误差/损失是很常见的。实施早停或学习率降低规则的主要问题在于验证损失计算相对较少。为了解决这个问题,我建议采用以下规则:当最佳验证误差至少比N个时期之前时,停止训练。

max_stagnation = 5 # number of epochs without improvement to tolerate
best_val_loss, best_val_epoch = None, None

for epoch in range(max_epochs):
    # train an epoch ...
    val_loss = evaluate()
    if best_val_loss is None or best_val_loss < val_loss:
        best_val_loss, best_val_epoch = val_loss, epoch
    if best_val_epoch < epoch - max_stagnation:
        # nothing is improving for a while
        early_stop = True
        break  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接