我要如何配置Keras,使其在收敛或损失为0时停止训练?我有意想过拟合它。我不想设置迭代次数,只想在它达到收敛时停止训练。
我要如何配置Keras,使其在收敛或损失为0时停止训练?我有意想过拟合它。我不想设置迭代次数,只想在它达到收敛时停止训练。
使用 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])
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, ...)
while loss > 1e-10:
? - Matthieu Brucher