Python 有没有一种方法可以在第一个(比如说)100个时代之后在Keras实施早期停车

Python 有没有一种方法可以在第一个(比如说)100个时代之后在Keras实施早期停车,python,neural-network,keras,Python,Neural Network,Keras,我的拟合函数是非凸的,因此损失函数有时会在改善之前恶化。考虑到这一点,我想使用提前停止,但仅在前100个或更多的时间之后。到目前为止,我有: # Early stopping ES = [EarlyStopping(monitor='val_loss',patience=100,verbose=1,mode='auto')] # fit model history = model.fit(x_train, y_train, epochs=1000,batch_size=50,verbose=2

我的拟合函数是非凸的,因此损失函数有时会在改善之前恶化。考虑到这一点,我想使用提前停止,但仅在前100个或更多的时间之后。到目前为止,我有:

# Early stopping
ES = [EarlyStopping(monitor='val_loss',patience=100,verbose=1,mode='auto')]

# fit model
history = model.fit(x_train, y_train, epochs=1000,batch_size=50,verbose=2,shuffle=True,validation_split=.1,callbacks=ES)

不幸的是,在大约10个时代之后,拟合很早就停止了。我想等到第100个纪元才开始早停。有什么想法吗?除提前停车外的任何建议也将不胜感激

如果你使用
patience=100
你的训练不应该在100岁前停止。但是,如果您想有一个简短的
耐心
,但又想以后再开始,您可以使用colllin描述的方法。如果您想要进一步定制,您可以始终定义自己的回调,这里使用
earlystoping
作为父级。出于您的目的,您只需要覆盖初始值设定项和找到的
on\u epoch\u end
方法:

class CustomStopper(keras.callbacks.earlystoping):
def _u初始(自我,监视器='val_loss',
min_delta=0,patience=0,verbose=0,mode='auto',start_epoch=100):#为start epoch添加参数
超级(CustomStopper,self)。\uuuu init\uuuuu()
self.start\u epoch=start\u epoch
def on_epoch_end(self、epoch、logs=None):
如果epoch>self.start\u epoch:
超级()。在“历元”结束时(历元,日志)

在从父类调用函数之前,只需向初始值设定项提供希望监视条件的最早时间点,并检查条件

输出中是否有类似“第10纪元:提前停止”的行?如果不是,则不是回调终止了培训。因为如果patience=100,它真的应该至少等待这100个时代(见其在的实现),你不能调用
model.fit(epochs=100,…,callbacks=[])
而不调用ES回调,然后调用
model.fit(epochs=900,…,callbacks=ES)
?我喜欢这个想法。在不使代码复杂化的情况下,似乎工作得很好。谢谢很酷。因此,为了正确理解这一点,新继承的类CustomStopper添加了一个变量start_epoch(如init方法所示)。然后,新的on_epoch_end语句说,如果当前epoch是>start_epoch,那么使用on_epoch_end的基类版本?抱歉,我是新手,不太理解super()语句。@kchow462是的。这是正确的:
super()
调用父类的函数。因此,结果是你可以有一个短暂的耐心,但检查结果是否变得更好只会在给定的时间后开始。我不知道它在python2中是如何工作的,但我正在使用python3,我需要使用super(CustomStopper,self)。\uuuu init_uuuuuuuuuu(监视器=监视器,耐心=耐心,min_delta=min_delta,mode=mode)用于将我的参数传递给父类。否则它只使用默认参数