码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【深度学习】关于处理过拟合的一点心得


    前言

    现在的深度学习与传统的机器学习相比,最显著的特点就是一个“深”字,如今深度学习的网络层数就算有个成百上千层也并不奇怪。然而过于强大的神经网络会导致一个问题,那就是过拟合,神经网络可以精确地预测出提供的数据集的结果,可一旦传入从未见过的数据,则准确率低的离谱。

    过拟合的一个明显的特征就是训练时,损失值(loss)极低,精度极高接近100%,并且训练集的精度与验证集的精度有着不小差距,那么该如何解决过拟合这一难题呢?

    从数据集入手

    最直接也是代价最高的办法就是增加数据集的数量,但数据集获取困难,不仅要去寻找图片,还要分类打标签,仅靠个人的努力,耗尽一天的时间也增加不了多少数据。

    但可以增强数据,通过旋转、裁剪、添加噪声点……理论上可以获取无限多的数据,虽效果较差,但也是可以尝试的。TensorFlow和PyTorch可以参考我下面这篇博客

    【TensorFlow&PyTorch】图像数据增强API_折途的博客-CSDN博客在进行深度学习训练时,遇到训练效果较差、训练集数量小、有过拟合趋向时可以选择加大数据集数量来优化训练模型,但是大多数情况下,增加数据集数量所花费的时间精力是巨大的,所以我们更常用的方法是对现有的数据集进行数据增强。不如实实在在增加数据集数量,但是还是有一定的效果的,性价比高。(只要加几行代码)TensorFlow的API在image下(我用的2.0版本,不同的版本可能API不同,但是基本都可以在iamge下找到)Modulehttps以下列举几个本人认为常用的方法....https://blog.csdn.net/m0_63235356/article/details/125972651?spm=1001.2014.3001.5501另外,小数据集(一共就几千张图片的)可以适当加大测试集在整个数据集的占比,一般数据集,6:1来分配训练集和测试集即可,小数据集可以将比例调至4:1。

    从网络层入手

    可以在网络层内加入规范化函数,以TensorFlow为例:

    layer=tensorflow.keras.layers.Conv2D(filters,kernel_size,strides,padding="same",kernel_regularizer=tensorflow.keras.regularizers.l2(0.001)

     其中filters为输出维度

    kernel_size为卷积核大小

    strides为步长(步距)

    padding为填充模式,"same"表示填充后输出大小和输入保持一致

    kernel_regularizer可以指定权值,使网络层正则化以缓解过拟合.

    还可以在全连接层中添加Dropout层,即随机断开全连接层的部分连接点:

    1. #tensorflow为例:
    2. dropout_layer=tensorflow.keras.layers.Dropout(0.5)
    3. #PyTorch为例:
    4. dropout_layer=troch.nn.Dropout(0.5)

    也可以在卷积层后加入规范化层:

    1. #TensorFlow为例:
    2. batchnorm_layer=tensorflow.keras.layers.VatchNormalization()
    3. #PyTorch为例:
    4. batchnorm_layer=troch.nn.BatchNorm2d()

    更多网络层可以查看我下面这篇博客

    【TensorFlow&PyTorch】深度学习常用神经网络层学习笔记_折途的博客-CSDN博客_tensorflow常用层TensorFlow:Module: tf.nn | TensorFlow Core v2.9.1PyTorch:torch.nn — PyTorch 1.12 documentationPyTorch:torch.nn - PyTorch中文文档以上为文档链接,TensorFlow的很详细了,PyTorch的建议两个合着看。以下仅选取本人觉得常用的接口以及参数(即不全,想看详细内容的自行通过链接查看文档)卷积输出的宽=((输入的宽-卷积核宽+2*填充的层数)/步距)+1.输出的宽高都同理,池化层输出大https://blog.csdn.net/m0_63235356/article/details/125689871?spm=1001.2014.3001.5501

    从训练入手:

    可以在过拟合之前就将训练停止并保存,将网络参数保持在相对优秀的水平.以TensorFlow为例:

    1. from tensorflow.keras.callbacks import EarlyStopping
    2. early=EarlyStopping(monitor='val_accuracy'
    3. min_delta=0.001
    4. patience=5)
    5. model.fit(train_data,epochs=100,callbacks=[early])

    其中monitor为评估标准

    min_delta为最小变化量

    patience为训练轮数

    例子中的意思为若连续5轮训练,精度的提升没有达到0.001,则停止训练.

     

    定义完'early'(名字可以随便起)后,在模型(model)训练(fit)中加入即可.

  • 相关阅读:
    软件库V1.2版本开源-首页UI优化
    linux权限深度解析——探索原理
    Charles通过Rewrite越过OPTIONS请求拦截
    并查集路径压缩
    VS2015 设置工程目录不保存 .sdf或.db 文件、 Ipch 文件夹
    【C++基础】公有继承,保护继承,私有继承
    开箱即用的工具函数库xijs更新指南(v1.2.6)
    爱奇艺大数据加速:从Hive到Spark SQL
    Shell 进程通过 ContentProvider 实现跨进程通信
    JavaWeb—系统架构
  • 原文地址:https://blog.csdn.net/m0_63235356/article/details/126089624
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号