keras中EarlyStopping(早停止)的用法和原理详解

更新时间:2023-06-07 02:10:20 阅读: 评论:0

keras中EarlyStopping(早停⽌)的⽤法和原理详解
本⽂属于知识点总结,内容属于摘抄和整理
⼀、提出问题
神经⽹络训练多少轮是⼀个很关键的问题,为了获得性能良好的神经⽹络,⽹络定型过程中需要进⾏许多关于设置(超参数)的决策。超参数之⼀是定型周期(epoch)的数量:亦即应当完整遍历数据集多少次(⼀次为⼀个epoch)?如果epoch数量太少,⽹络有可能发⽣⽋拟合(即对于定型数据的学习不够充分);如果epoch数量太多,则有可能发⽣过拟合(即⽹络对定型数据中的“噪声”⽽⾮信号拟合)。
根本原因就是因为继续训练会导致测试集上的准确率下降。那继续训练导致测试准确率下降的原因猜测可能是:
1. 过拟合
2. 学习率过⼤导致不收敛
3. 使⽤正则项的时候,Loss的减少可能不是因为准确率增加导致的,⽽是因为权重⼤⼩的降低
⼆、Early Stopping是什么
那如何选择训练轮数呢?Early stopping可以帮助我们解决这个问题,它也可以被视为⼀种能够避免⽹络发⽣过拟合的正则化⽅法。它的作⽤就是当模型在验证集上的性能不再增加的时候就停⽌训练,从⽽达到充分训练的作⽤,⼜避免过拟合。Early stopping旨在解决epoch数量需要⼿动设置的问题。
EarlyStopping是Callbacks的⼀种,callbacks⽤于指定在每个epoch开始和结束的时候进⾏哪种特定操作。Callbacks中有⼀些设置好的接⼝,可以直接使⽤,如’acc’, 'val_acc’, ’loss’ 和 ’val_loss’等等。
EarlyStopping则是⽤于提前停⽌训练的callbacks。具体地,可以达到当训练集上的loss不在减⼩(即减⼩的程度⼩于某个阈值)的时候停⽌继续训练。
官⽅⽂档:
源码:
原理
将数据分为训练集和验证集,每个epoch结束后(或每N个epoch后): 在验证集上获取测试结果,随着epoch的增加,如果在验证集上发现测试误差上升,则停⽌训练;将停⽌之后的权重作为⽹络的最终参数。
这种做法很符合直观感受,因为精度都不再提⾼了,在继续训练也是⽆益的,只会提⾼训练的时间。那么该做法的⼀个重点便是怎样才认为验证集精度不再提⾼了呢?并不是说验证集精度⼀降下来便认为不再提⾼了,因为可能经过这个Epoch后,精度降低了,但是随后的Epoch ⼜让精度⼜上去了,所以不能根据⼀两次的连续降低就判断不再提⾼。⼀般的做法是,在训练的过程中,记录到⽬前为⽌最好的验证集精度,当连续10次Epoch(或者更多次)没达到最佳精度时,则可以认为精度不再提⾼了。
三、图⽰直观理解
最优模型是在垂直虚线的时间点保存下来的模型,即处理测试集时准确率最⾼的模型。
为什么能减⼩过拟合
当还未在神经⽹络运⾏太多迭代过程的时候,w参数接近于0,因为随机初始化w值的时候,它的值是较⼩的随机值。当你开始迭代过程,w 的值会变得越来越⼤。到后⾯时,w的值已经变得⼗分⼤了。所以early stopping要做的就是在中间点停⽌迭代过程。我们将会得到⼀个中等⼤⼩的w参数,会得到与L2正则化相似的结果,选择了w参数较⼩的神经⽹络。
优缺点
虽然早停法简单易懂,也很好操做,可是也存在很⼤的缺陷。好⽐当模型剧烈波动的时候可能会停的太早,以致于不能获得想要的“好结果”。另外因为原理过于简单,对于复杂的问题每每统⼀⽤⼀种⽅式进⾏评判,也不能很好的获得恰当的结论。
站在巨人肩上
四、EarlyStopping的使⽤与技巧
⼀般是在model.fit函数中调⽤callbacks,fit函数中有⼀个参数为callbacks。注意这⾥需要输⼊的是list类型的数据,所以通常情况只⽤EarlyStopping的话也要是[EarlyStopping()]
EarlyStopping的参数:
# monitor:监视参数,min_delta:⼩于此数认为不变化,mode:loss⼩好,acc⼤好,patience:n周期⽆提升则退出,restore_best_weights:取最优权重earlyStop = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=80, mode='max', verbo=1, restore_best_weights = True)
# 增加validation_data参数作为验证集,添加早停⽌机制,训练时打乱序列顺序
history = model.fit(trainx, trainy, callbacks=[earlyStop], epochs=300, batch_size=batch_size, validation_data=(testx, testy), verbo=1, shuffle=True)
1. monitor: 监控的数据接⼝,有’acc’,’val_acc’,’loss’,’val_loss’等等。正常情况下如果有验证集,就⽤’val_acc’或
者’val_loss’。但是因为笔者⽤的是5折交叉验证,没有单设验证集,所以只能⽤’acc’了。
2. min_delta:增⼤或减⼩的阈值,只有⼤于这个部分才算作improvement。这个值的⼤⼩取决于monitor,也反映了你的容忍程度。
如monitor是’acc’,同时其变化范围在70%-90%之间,所以对于⼩于0.01%的变化不关⼼。加上观察到训练过程中存在抖动的情况(即先下降后上升),所以适当增⼤容忍程度,最终设为0.003%。
3. patience:能够容忍多少个epoch内都没有improvement。这个设置其实是在抖动和真正的准确率下降之间做tradeoff。如果
patience设的⼤,那么最终得到的准确率要略低于模型可以达到的最⾼准确率。如果patience设的⼩,那么模型很可能在前期抖动,还在全图搜索的阶段就停⽌了,准确率⼀般很差。patience的⼤⼩和learning rate直接相关。在learning rate设定的情况下,前期先训练⼏次观察抖动的epoch number,⽐其稍⼤些设置patience。在learning rate变化的情况下,建议要略⼩于最⼤的抖动epoch number。笔者在引⼊EarlyStopping之前就已经得到可以接受的结果了,EarlyStopping算是锦上添花,所以patience设的⽐较⾼,设为抖动epoch number的最⼤值。
4. mode: 就’auto’, ‘min’, ‘,max’三个可能。如果知道是要上升还是下降,建议设置⼀下。笔者的monitor是’acc’,所以
mode=’max’。
5. restore_best_weights : 如果restore_best_weights默认为Fal,如果是Fal,则保留最后⼀次训练时的权重参数,如果设置为
True,则保存训练过程中准确率最⾼或者误差最时的⽹络权重。
6. verbo:⽇志显⽰函数,verbo = 0 为不在标准输出流输出⽇志信息,verbo = 1 为输出进度条记录,verbo = 2 为每⼀个
epoch输出⼀⾏记录
min_delta和patience都和“避免模型停⽌在抖动过程中”有关系,所以调节的时候需要互相协调。通常情况下,min_delta降低,那么patience可以适当减少;min_delta增加,那么patience需要适当延长;反之亦然。
五、数学原理介绍
real电影下载
我们需要⼀个停⽌的标准来实施早停法,因此,我们希望它可以产⽣最低的繁华错误,同时也可以有最好的性价⽐,即给定泛化错误下的最⼩训练时间
1、停⽌标准简介
第⼀类停⽌标准
第⼆类停⽌标准
第三类停⽌标准
2、停⽌标准选择规则
⼀般情况下,“较慢”的标准会相对⽽⾔在平均⽔平上表现略好,可以提⾼。然⽽,这些标准需要较长的训练时间。其实,总体⽽⾔,这些标准在系统性的区别很⼩。主要选择规则包括:
1. 除⾮较⼩的提升也有很⼤价值,否则选择较快的停⽌标准
2. 为了最⼤可能找到⼀个好的⽅案,使⽤GL标准
3. 为了最⼤化平均解决⽅案的质量,如果⽹络只是过拟合了⼀点点,可以使⽤PQ标准,否则使⽤UP标准
六、代码⽰例整理
1.
2.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Jia ShiLin
import numpy as np
import pandas as pd
del_lection import train_test_split
dels import Sequential
from keras.layers import Den, Dropout
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.optimizers import SGD, Adadelta, Adam, RMSprop, Adagrad, nadam, Adamax
data = pd.read_csv('winequality-red.csv', p=';')
y = data['quality']
x = data.drop(['quality'], axis=1)
raw是什么意思x = data.drop(['quality'], axis=1)
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2019)
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, test_size=0.2, random_state=2019)
# model_function
def create_model(opt):
'''
creat a  model
:param opt:
:return:model意大利比萨斜塔
'''
model = Sequential()
model.add(Den(100, input_dim=x_train.shape[1], activation='relu'))
model.add(Den(50, activation='relu'))
model.add(Den(25, activation='relu'))
model.add(Den(1, activation='linear'))
return model
# create_function,⽤来定义在训练期间将使⽤的回调函数
def create_callbacks(opt):
'''
回调函数
:return:callbacks,类型list
'''
# ⼀般是在model.fit函数中调⽤callbacks,fit函数中有⼀个参数为callbacks。
# 注意这⾥需要输⼊的是list类型的数据,所以通常情况只⽤EarlyStopping的话也要是[EarlyStopping()]    callbacks = [
EarlyStopping(monitor='val_acc', patience=200, verbo=2),
ModelCheckpoint('best_model_' + opt + '.h5', monitor='val_acc', save_best_only=True, verbo=0)    ]
return callbacks
# 创建⼀个想要尝试的优化器字典
opts = dict({'sgd': SGD(),
'adam': Adam(),
})
# train_and_save
results = []
# 遍历优化器
for opt in opts:  # 依次取到每个键
model = create_model(opt)
callbacks = create_callbacks(opt)
蝴蝶兰开完花后怎么处理方法
hist = model.fit(x_train, y_train, batch_size=128, epochs=5000,
validation_data=(x_train.values,y_train),
batch_size=128,
callbacks=callbacks,
百年孤独读书笔记
verbo=0
)
消防讲座
best_epoch = np.argmax(hist.history['val_acc'])#返回最⼤下标
best_acc = hist.history['val_acc']['best_epoch']凉拌土豆丝的做法
#加载具有最⾼验证精度的模型
best_model = create_model(opt)
best_model.load_weights('best_model_'+opt+'.h5')
pile(loss='m',optimizer=opts[opt],metrics='accuracy')
score = best_model.evaluate(x_train.values,y_test,verbo=0)
test_accuracy = score[1]
results.append([opt,best_epoch,best_acc,test_accuracy])

本文发布于:2023-06-07 02:10:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/890173.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:训练   验证   准确率   时候   测试   数据
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图