使用early stopping解决神经网络过拟合问题
神经网络训练多少轮是一个很关键的问题,训练轮数少了欠拟合(underfit),训练轮数多了过拟合(overfit),那如何选择训练轮数呢?
Early stopping可以帮助我们解决这个问题,它的作用就是当模型在验证集上的性能不再增加的时候就停止训练,从而达到充分训练的作用,又避免过拟合。
一、在Keras中使用early stopping
完整代码
Keras中有EarlyStopping类,可以直接拿来使用,非常方便
from keras.callbacks import EarlyStoppingearlystop = EarlyStopping(monitor = 'val_loss',mode='min',min_delta = 0,patience = 3,verbose = 1,)
- monitor。想要监控的指标,比如在这里我们主要看的是验证集上的loss,当loss不再降低的时候就停止
- mode。想要最大值还是最小值,在这里我们使用的min,当时loss越小越好
- min_delta。指标的变化超过min_delta才认为产生了变化,否则都认为不再上升或下降
- patience。多少轮不发生变化才停止
- verbose。设置为1的时候,训练结束会打印出epoch的情况
二、保存最佳模型
完整代码
在early stopping结束后得到模型不一定是最佳模型,所以我们需要把训练过程中表现最好的模型保存下来,以便使用。在这里我们可以使用Keras提供的另一callback来实现:
from keras.callbacks import ModelCheckpointmc = ModelCheckpoint(file_path='./best_model.h5',monitor='val_accuracy',mode='max',verbose=1,save_best_only=True)
- filepath,模型存储的路径
- monitor,监控的指标
- mode,最大还是最小模式
- verbose,日志显示控制
- save_best_only,是否只存储最好的模型
通过使用这个方法我们就可以把最好的模型存储下来,在使用的时候直接load就可以了。
三、在IMDB数据集上使用Early Stopping
完整代码
IMDB是一个情感分析数据集,我们首先在这个数据集上使用一个简单的CNN看看效果,然后再使用Early Stopping作为对比。首先看看CNN代码。先对句子embedding, 然后使用一层Conv1D+Maxpooling。
# Build model
sentence = Input(batch_shape=(None, max_words), dtype='int32', name='sentence')
embedding_layer = Embedding(top_words, embedding_dims, input_length=max_words)
sent_embed = embedding_layer(sentence)
conv_layer = Conv1D(filters, kernel_size, padding='valid', activation='relu')
sent_conv = conv_layer(sent_embed)
sent_pooling = GlobalMaxPooling1D()(sent_conv)
sent_repre = Dense(250)(sent_pooling)
sent_repre = Activation('relu')(sent_repre)
sent_repre = Dense(1)(sent_repre)
pred = Activation('sigmoid')(sent_repre)
model = Model(inputs=sentence, outputs=pred)
rmsprop = optimizers.rmsprop(lr=0.0003)
model.compile(loss='binary_crossentropy', optimizer=rmsprop, metrics=['accuracy'])
最终在数据集上的结果如下,在训练集上基本达到了100,而在测试集上还不到90,看起来有点过拟合了
Training Accuracy: 100%
Test Accuracy: 88.50%
我们再看Loss曲线,大约在第8轮的时候,验证集上的Loss达到最低,但是在往后Loss开始升高,这就更加确定发生了过拟合,我们需要提前停止训练,最好在第8轮之后就停下来。
在IMDB数据集上使用Early Stopping
我们再训练过程中加上一个patience=10的earlystop,监控验证集loss。当验证集的loss在近10轮都没有下降的话就停止。
#early stopping
earlystop = EarlyStopping(monitor='val_loss',min_delta=0,patience=10,verbose=1)# fit the model
history = model.fit(x_train, y_train, batch_size=batch_size,epochs=epochs, verbose=1, validation_data=(x_test, y_test), callbacks[earlystop])
结果如下,我们可以看到训练最终在第16轮停止了,停止时在测试集上的准确率为88.40%,并没有高于不使用Early Stopping的情况,但是在训练的第12轮模型的准确达到了89.30%,超过了Baseline。所以我们需要加上存储最好模型的callback。
Epoch 2/50
5000/5000 [==============================] - 5s 951us/step - loss: 0.4851 - acc: 0.7986 - val_loss: 0.4320 - val_acc: 0.8170
Epoch 3/50
5000/5000 [==============================] - 5s 918us/step - loss: 0.3193 - acc: 0.8802 - val_loss: 0.3599 - val_acc: 0.8370
Epoch 4/50
5000/5000 [==============================] - 4s 882us/step - loss: 0.2093 - acc: 0.9322 - val_loss: 0.3392 - val_acc: 0.8530
Epoch 5/50
5000/5000 [==============================] - 4s 880us/step - loss: 0.1209 - acc: 0.9702 - val_loss: 0.4001 - val_acc: 0.8260
Epoch 6/50
5000/5000 [==============================] - 4s 887us/step - loss: 0.0600 - acc: 0.9884 - val_loss: 0.2900 - val_acc: 0.8710
Epoch 7/50
5000/5000 [==============================] - 4s 865us/step - loss: 0.0208 - acc: 0.9986 - val_loss: 0.2978 - val_acc: 0.8840
Epoch 8/50
5000/5000 [==============================] - 4s 883us/step - loss: 0.0053 - acc: 1.0000 - val_loss: 0.3180 - val_acc: 0.8840
Epoch 9/50
5000/5000 [==============================] - 4s 856us/step - loss: 0.0011 - acc: 1.0000 - val_loss: 0.3570 - val_acc: 0.8830
Epoch 10/50
5000/5000 [==============================] - 4s 845us/step - loss: 1.7574e-04 - acc: 1.0000 - val_loss: 0.4035 - val_acc: 0.8800
Epoch 11/50
5000/5000 [==============================] - 4s 869us/step - loss: 2.0190e-05 - acc: 1.0000 - val_loss: 0.4490 - val_acc: 0.8820
Epoch 12/50
5000/5000 [==============================] - 4s 846us/step - loss: 1.6874e-06 - acc: 1.0000 - val_loss: 0.5164 - val_acc: 0.8930
Epoch 13/50
5000/5000 [==============================] - 4s 860us/step - loss: 2.6231e-07 - acc: 1.0000 - val_loss: 0.5429 - val_acc: 0.8840
Epoch 14/50
5000/5000 [==============================] - 4s 870us/step - loss: 1.4614e-07 - acc: 1.0000 - val_loss: 0.5754 - val_acc: 0.8810
Epoch 15/50
5000/5000 [==============================] - 4s 888us/step - loss: 1.2477e-07 - acc: 1.0000 - val_loss: 0.5744 - val_acc: 0.8850
Epoch 16/50
5000/5000 [==============================] - 4s 876us/step - loss: 1.1823e-07 - acc: 1.0000 - val_loss: 0.5909 - val_acc: 0.8840
Epoch 00016: early stopping
Accuracy: 88.40%
存储最好模型
我们使用ModelCheckPoint存储最好的模型,具体如下,通过监控验证集上的准确率,我们把准确率最高的模型存储下来
from keras.callbacks import EarlyStopping, ModelCheckpointmc = ModelCheckpoint(filepath='best_model.h5',monitor='val_acc',mode='max',verbose=1,save_best_only=True)
然后在使用的时候进行load,然后就可以进行预测了
from keras.models import load_model
saved_model = load_model('best_model.h5')
# evaluate the model
_, train_acc = saved_model.evaluate(x_train, y_train, verbose=0)
_, test_acc = saved_model.evaluate(x_test, y_test, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
最终的结果如下
Train: 1.000, Test: 0.893
正确使用Early Stopping加上存储最佳模型可以帮助我们减轻过拟合,从而训练出表现更好的模型。
完整代码
使用early stopping解决神经网络过拟合问题相关推荐
- 解决神经网络过拟合问题—Dropout方法、python实现
解决神经网络过拟合问题-Dropout方法 一.what is Dropout?如何实现? 二.使用和不使用Dropout的训练结果对比 一.what is Dropout?如何实现? 如果网络模型复 ...
- 使用权值衰减算法解决神经网络过拟合问题、python实现
使用权值衰减算法解决神经网络过拟合问题.python实现 一.what is 过拟合 二.过拟合原因 三.权值衰减 四.实验验证 4.1制造过拟合现象 4.2使用权值衰减抑制过拟合 一.what is ...
- 神经网络怎么解决过拟合,解决神经网络过拟合
如何防止神经网络过拟合,用什么方法可以防止? 你这个问题本来就问的很模糊,你是想问神经网络的过拟合变现什么样还是为什么出现过拟合呢. 为此针对于第一个问题,神经网络的过拟合与支持向量机.高斯混合模型等 ...
- 神经网络过拟合怎么解决,神经网络过拟合怎么办
神经网络如何防止过拟合? 你这个问题本来就问的很模糊,你是想问神经网络的过拟合变现什么样还是为什么出现过拟合呢. 为此针对于第一个问题,神经网络的过拟合与支持向量机.高斯混合模型等建模方法的过拟合类似 ...
- Early Stopping
一.前述 调优对于模型训练速度,准确率方面至关重要,所以本文对神经网络中的调优做一个总结. 二.神经网络超参数调优 1.适当调整隐藏层数 对于许多问题,你可以开始只用一个隐藏层,就可以获得不错的结果, ...
- 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 3.2 深度学习正则化 3.2.1 偏差与方差 3.2.1.1 ...
- keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping)
keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping) 当我们训练深度学习神经网络的时候通常希望能获得最好的泛化性 ...
- 过拟合解决方案 —— early stopping
https://www.datalearner.com/blog/1051537860479157 https://blog.csdn.net/qq_37430422/article/details/ ...
- [Python人工智能] 七.什么是过拟合及dropout解决神经网络中的过拟合问题
从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇文章通过TensorFlow实现分类学习,以MNIST数字图片为例进行讲解:本文将介绍什么是过拟合,并采用drop ...
最新文章
- Go 学习笔记(2)— 安装目录、工作区、源码文件和标准命令
- 【力扣网练习题】删除排序数组中的重复项
- 字体渲染 mac linux,Mac下通过命令来渲染字体
- python3高阶函数:map(),reduce(),filter()的区别
- Fragment生命周期与Fragment执行hide、show后的生命周期探讨
- 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
- 老程序员提给后浪程序员的职涯建议
- 爬虫python能做什么-python爬虫能干什么
- 生成BAPI的ALE接口
- 限时删!我亲自整理一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
- GEE 导入shp数据-裁剪影像
- 用友NC任意文件上传漏洞复现
- ELK+filebeat+redis 日志分析平台
- C#——SqlParameter的使用方法及注意事项
- signature=04e0c5d9acfe5aef92fda679f27fba71,恶意软件分析 URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析...
- 移动端安卓手机车牌识别SDK
- springboot实现条形码_java生成条形码(多种条码类型生成)
- gym101908 C. Pizza Cutter(平面几何欧拉定理,树状数组求逆序对)
- IDEA如何从断点里获取对象所有数据(数据量很大且不好Ctrl+C)
- Android自定义一个播放器控件
热门文章
- 多视图立体匹配论文分享PVA-MVSNet
- 单阶段6D对象姿势估计
- 超实用!图像去畸变矫正及双线性内插法
- SLAM从0到1——状态估计之最小二乘问题解法:最速下降法、牛顿法、高斯牛顿法、LM法...
- java2019 数据结构算法面试题_GitHub - sjyw/java-interview: 史上最全Java面试题汇总与解析(505道):2019最新版...
- react项目---基本语法字符串数组(6)
- 如何运行SpringBoot项目
- CVPR 2022 | ConvNeXt - FAIR再探纯卷积结构的极限(优于Transformer)
- mysql int和bigdecimal,mysql的 int 类型,刨析返回类型为BigDicemal 类型的奇怪现象
- showdialog 尝试读取或写入受保护的内存_共享内存在不同系统的应用与优劣详解...