【深度学习笔记】深度学习训练技巧——超参数选取

本文介绍了如何选择和调整深度学习模型的超参数,如层数、神经元数、学习率等,通过逐步实验确定最佳设置,包括观察初始损失、过拟合测试、调整学习率和正则化参数。作者推荐了Fei-FeiLi等人的CS231n课程中的实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

超参数选取

  1. 超参数

    超参数: 控制算法行为,且不会被算法本身所更新,通常决定了一个模型的能力

    对于一个深度学习模型, 超参数包括

    • 层数,每层的神经元数目
    • 正则化系数
    • 学习率
    • 参数衰减率(Weight decay rate)
    • 动量项(Momentum rate)
  2. 如何选择深度学习模型的架构

    • 熟悉数据集
    • 与之前见过的数据/任务比较
      • 样本数目
      • 图像大小, 视频长度, 输入复杂度…
    • 最好从在类似数据集或任务上表现良好的模型开始
  3. 如何选择其它超参数

    由Fei-Fei Li & Justin Johnson & Serena Yeung(CS231n 2019,Stanford University)给出的建议

    • 第1步:观察初始损失

      • 确保损失的计算是正确的
      • 将权重衰减设为零
    • 第2步:在一组小样本上过拟合

      • 在一组少量样本的训练集上训练,尝试达到100%训练准确率
      • 如果训练损失没有下降,说明是不好的初始化,学习率太小,模型太小
      • 如果训练损失变成Inf或NaN,说明是不好的初始化,学习率太大
    • 第3步:找到使损失下降的学习率

      • 在全部数据上训练模型,并找到使损失值能够快速下降的学习率

        当损失值下降较慢时,将学习率缩小10倍

        使用较小的参数衰减

    • 第4步:粗粒度改变学习率,训练1-5轮

      • 在上一步的基础上,尝试一些比较接近的学习率和衰减率
      • 常用的参数衰减率:1e-4,1e-5,0
    • 第5步:细粒度改变学习率,训练更长时间

      • 使用上一步找到的最好的学习率,并训练更长时间 (10-20 轮),期间不改变学习率
    • 第6步:观察损失曲线

      • 训练损失通常用滑动平均绘制,否则会有很多点聚集在一起

        image-20240218161857392

        有问题的损失曲线:

        image-20240218162126133

延伸阅读:

  • 各种深度学习模型的优化方法:http://cs231n.github.io/neural-networks-3/
  • 关于不同正则化方法的讨论:https://www.cnblogs.com/LXP-
  • Never/p/11566064.html Li,Chen,Hu,Yang,2019
    Understanding the Disharmony Between Dropout and Batch Normalization by Variance Shift CVPR
### 使用 Anaconda 和 Jupyter Notebook 进行指针式仪表图像识别 #### 安装必要的库 为了实现指针式仪表的图像识别,首先需要安装一些基本的数据科学和计算机视觉库。通过Anaconda可以方便地管理这些依赖项。 ```bash conda install numpy pandas matplotlib opencv-python-headless scikit-image tensorflow keras ``` 上述命令会安装用于数值计算、数据处理以及机器学习模型训练所需的软件包[^1]。 #### 创建并激活虚拟环境 建议创建一个新的Conda环境来隔离项目依赖: ```bash conda create -n instrument_recognition python=3.9 conda activate instrument_recognition ``` 这一步骤有助于保持不同项目的独立性和稳定性。 #### 启动 Jupyter Notebook 一旦环境准备就绪,在终端输入以下指令启动Jupyter笔记本服务器: ```bash jupyter notebook ``` 浏览器将会自动打开默认页面,允许用户浏览文件系统并新建Python 3内核的工作簿。 #### 加载预训练模型或构建自定义CNN架构 对于指针式仪表这样的特定应用场景,可以选择加载已有的深度学习框架中的预训练卷积神经网络(CNN),比如ResNet, VGG等;也可以基于Keras API设计适合本任务特点的小型定制化网络结构。 #### 数据集收集与标注 获取足够的样本图片作为训练集至关重要。可以从互联网上搜集各种类型的指针表盘照片,并对其进行分类标记——即记录下每张图对应的实际读数位置。这部分工作可能涉及手动操作或是借助专门工具完成自动化批量打标签过程。 #### 图像预处理 考虑到实际拍摄条件差异较大(光照变化、角度偏移等因素), 对原始素材做适当变换增强其鲁棒性很有必要: - 调整大小至固定尺寸; - 应用灰度转换减少色彩干扰; - 去除噪声点改善边缘特征清晰度; - 归一化像素强度分布范围。 以上步骤可以通过`skimage`, `opencv`等相关函数轻松达成目标。 #### 训练模型 利用之前整理好的带标签数据集来进行监督式学习流程。调整超参数直至获得满意的泛化性能指标为止。期间可采用交叉验证方法评估效果优劣程度。 #### 测试预测功能 最后阶段便是检验所建立系统的准确性了。选取若干未曾见过的新实例送入算法内部运算得出最终结论。如果一切顺利的话,则能够成功解析出未知样例里隐藏的信息! ```python from skimage import io import cv2 import numpy as np from tensorflow.keras.models import load_model def preprocess_image(image_path): img = io.imread(image_path) gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) resized_img = cv2.resize(gray_img, (64, 64)) normalized_img = resized_img / 255. return np.expand_dims(normalized_img, axis=[0,-1]) model = load_model('path_to_saved_model.h5') test_image = 'new_instrument_photo.jpg' processed_test_image = preprocess_image(test_image) prediction = model.predict(processed_test_image)[0][0] print(f"The predicted value is {round(prediction*full_scale_value)} units.") ``` 这段代码展示了如何加载保存下来的模型并对单幅测试图像执行前向传播得到估计结果的过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

住在天上的云

如果您喜欢我的文章,欢迎打赏哦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值