神经网络训练多少轮是一个很关键的问题,训练轮数少了欠拟合(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,)
  1. monitor。想要监控的指标,比如在这里我们主要看的是验证集上的loss,当loss不再降低的时候就停止
  2. mode。想要最大值还是最小值,在这里我们使用的min,当时loss越小越好
  3. min_delta。指标的变化超过min_delta才认为产生了变化,否则都认为不再上升或下降
  4. patience。多少轮不发生变化才停止
  5. 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)
  1. filepath,模型存储的路径
  2. monitor,监控的指标
  3. mode,最大还是最小模式
  4. verbose,日志显示控制
  5. 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解决神经网络过拟合问题相关推荐

  1. 解决神经网络过拟合问题—Dropout方法、python实现

    解决神经网络过拟合问题-Dropout方法 一.what is Dropout?如何实现? 二.使用和不使用Dropout的训练结果对比 一.what is Dropout?如何实现? 如果网络模型复 ...

  2. 使用权值衰减算法解决神经网络过拟合问题、python实现

    使用权值衰减算法解决神经网络过拟合问题.python实现 一.what is 过拟合 二.过拟合原因 三.权值衰减 四.实验验证 4.1制造过拟合现象 4.2使用权值衰减抑制过拟合 一.what is ...

  3. 神经网络怎么解决过拟合,解决神经网络过拟合

    如何防止神经网络过拟合,用什么方法可以防止? 你这个问题本来就问的很模糊,你是想问神经网络的过拟合变现什么样还是为什么出现过拟合呢. 为此针对于第一个问题,神经网络的过拟合与支持向量机.高斯混合模型等 ...

  4. 神经网络过拟合怎么解决,神经网络过拟合怎么办

    神经网络如何防止过拟合? 你这个问题本来就问的很模糊,你是想问神经网络的过拟合变现什么样还是为什么出现过拟合呢. 为此针对于第一个问题,神经网络的过拟合与支持向量机.高斯混合模型等建模方法的过拟合类似 ...

  5. Early Stopping

    一.前述 调优对于模型训练速度,准确率方面至关重要,所以本文对神经网络中的调优做一个总结. 二.神经网络超参数调优 1.适当调整隐藏层数 对于许多问题,你可以开始只用一个隐藏层,就可以获得不错的结果, ...

  6. 偏差与方差、L1正则化、L2正则化、dropout正则化、神经网络调优、批标准化Batch Normalization(BN层)、Early Stopping、数据增强

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 3.2 深度学习正则化 3.2.1 偏差与方差 3.2.1.1 ...

  7. keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping)

    keras构建前馈神经网络(feedforward neural network)进行分类模型构建基于早停法(Early stopping) 当我们训练深度学习神经网络的时候通常希望能获得最好的泛化性 ...

  8. 过拟合解决方案 —— early stopping

    https://www.datalearner.com/blog/1051537860479157 https://blog.csdn.net/qq_37430422/article/details/ ...

  9. [Python人工智能] 七.什么是过拟合及dropout解决神经网络中的过拟合问题

    从本专栏开始,作者正式开始研究Python深度学习.神经网络及人工智能相关知识.前一篇文章通过TensorFlow实现分类学习,以MNIST数字图片为例进行讲解:本文将介绍什么是过拟合,并采用drop ...

最新文章

  1. Go 学习笔记(2)— 安装目录、工作区、源码文件和标准命令
  2. 【力扣网练习题】删除排序数组中的重复项
  3. 字体渲染 mac linux,Mac下通过命令来渲染字体
  4. python3高阶函数:map(),reduce(),filter()的区别
  5. Fragment生命周期与Fragment执行hide、show后的生命周期探讨
  6. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
  7. 老程序员提给后浪程序员的职涯建议
  8. 爬虫python能做什么-python爬虫能干什么
  9. 生成BAPI的ALE接口
  10. 限时删!我亲自整理一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  11. GEE 导入shp数据-裁剪影像
  12. 用友NC任意文件上传漏洞复现
  13. ELK+filebeat+redis 日志分析平台
  14. C#——SqlParameter的使用方法及注意事项
  15. signature=04e0c5d9acfe5aef92fda679f27fba71,恶意软件分析 URL链接扫描 免费在线病毒分析平台 | 魔盾安全分析...
  16. 移动端安卓手机车牌识别SDK
  17. springboot实现条形码_java生成条形码(多种条码类型生成)
  18. gym101908 C. Pizza Cutter(平面几何欧拉定理,树状数组求逆序对)
  19. IDEA如何从断点里获取对象所有数据(数据量很大且不好Ctrl+C)
  20. Android自定义一个播放器控件

热门文章

  1. 多视图立体匹配论文分享PVA-MVSNet
  2. 单阶段6D对象姿势估计
  3. 超实用!图像去畸变矫正及双线性内插法
  4. SLAM从0到1——状态估计之最小二乘问题解法:最速下降法、牛顿法、高斯牛顿法、LM法...
  5. java2019 数据结构算法面试题_GitHub - sjyw/java-interview: 史上最全Java面试题汇总与解析(505道):2019最新版...
  6. react项目---基本语法字符串数组(6)
  7. 如何运行SpringBoot项目
  8. CVPR 2022 | ConvNeXt - FAIR再探纯卷积结构的极限(优于Transformer)
  9. mysql int和bigdecimal,mysql的 int 类型,刨析返回类型为BigDicemal 类型的奇怪现象
  10. showdialog 尝试读取或写入受保护的内存_共享内存在不同系统的应用与优劣详解...