当网络完全收敛时停止Keras训练

9

我要如何配置Keras,使其在收敛或损失为0时停止训练?我有意想过拟合它。我不想设置迭代次数,只想在它达到收敛时停止训练。


1
那么只需要使用一个while循环,例如 while loss > 1e-10: - Matthieu Brucher
3个回答

15

使用 EarlyStopping 回调函数。您可以自由选择要观察的损失/度量和何时停止。

通常情况下,您会查看“验证损失”(val_loss),因为这是告诉您的模型仍在学习泛化的最重要的变量。

但是既然您说想要过拟合,那么您可以查看“训练损失”(loss)。

该回调函数使用“增量”而不是绝对值,这很好,因为损失并不一定以“零”为目标。但您可以使用 baseline 参数设置绝对值。

因此,通常情况下,回调函数会查看验证损失:

from keras.callbacks import EarlyStopping
usualCallback = EarlyStopping()

这与 EarlyStopping(monitor ='val_loss',min_delta = 0,patience = 0) 相同。

一个会过拟合的:

overfitCallback = EarlyStopping(monitor='loss', min_delta=0, patience = 20)

注意 patience 参数,因为损失值并不总是在每个时期都减少,让模型在结束之前尝试多几个时期。

最后,只需将回调函数与大量时期一起传递给 fit

model.fit(X, Y, epochs=100000000, callbacks=[overfitCallback])

2
一个 EarlyStopping 就能够达到您所想要的效果:它可以帮助您在监测到训练过程中的损失已经不再改善时停止训练。这是通过使用"patience"参数来完成的,该参数表示在多少个 epoch 之后,如果没有检测到任何的改善(即可能已经收敛),则应该停止训练。 EarlyStopping 的用法信息也可以在可能的重复问题中找到。 另外,可视化训练过程也是非常有用的。

1
如果您想手动停止keras,请使用鼠标位置作为输入:
def queryMousePosition():
    from ctypes import windll, Structure, c_long, byref
    class POINT(Structure): _fields_ = [("x", c_long), ("y", c_long)]
    pt = POINT()
    windll.user32.GetCursorPos(byref(pt))
    return pt.x, pt.y  # %timeit queryMousePosition()


class TerminateOnFlag(keras.callbacks.Callback):
    def on_batch_end(self, batch, logs=None):
        mouse_x, mouse_y = queryMousePosition()
        if mouse_x < 10:
            self.model.stop_training = True

callbacks=[keras.callbacks.ReduceLROnPlateau(), TerminateOnFlag()]

model.fit_generator(..., callbacks=callbacks, ...)

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