深度学习调参笔记

就是因为增加了下面这个代码片段,使得训练过程耗时增加了3倍。。。

def set_seed(seed):random.seed(seed)np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed)cudnn.benchmark = Falsecudnn.deterministic = True# Set the seed
set_seed(42)  # 这里的 42 是一个示例,你可以选择任何整数

注释掉这段代码导致训练时间缩短了2/3的主要原因与cudnn.benchmarkcudnn.deterministic这两个选项有关。

cudnn.benchmarkcudnn.deterministic 的作用

  1. cudnn.benchmark:

    • cudnn.benchmark 设置为 True 时,CuDNN 会基于每个卷积层的配置(卷积大小、输入尺寸、显存可用性等)选择最快的卷积算法。这会带来初始的额外开销,因为 CuDNN 需要测试不同的算法以选择最快的那个。然而,一旦选定算法,后续的训练会因此而加速。
    • cudnn.benchmark 设置为 False 时,CuDNN 使用一个确定的默认算法,这减少了选择算法的时间,但可能不是最优的卷积计算速度。
  2. cudnn.deterministic:

    • cudnn.deterministic 设置为 True 时,会强制 CuDNN 使用确定性的算法(即使这些算法不是最快的),以确保每次运行的结果是可重复的。这对于需要结果复现的实验很重要,但可能会导致性能下降,因为一些非确定性的算法可能会更快。

分析

注释掉这段代码意味着:

  • cudnn.benchmark 的值不再被设置为 False,默认值是 True。这使得 CuDNN 可以自由选择最快的卷积算法,虽然这会在初始阶段带来额外的开销,但在长期的训练过程中整体上会加快计算速度。
  • cudnn.deterministic 的值不再被设置为 True,默认值是 False。这允许 CuDNN 使用非确定性但更快速的算法,从而提高训练速度。

结论

由于你注释掉了设置种子的代码,导致了cudnn.benchmarkcudnn.deterministic恢复默认值,CuDNN得以使用更快的非确定性算法,进而加快了训练过程。这解释了为什么你的训练时间缩短了2/3。

如果你不需要严格的结果复现,可以保留这种设置以提高训练速度。如果结果复现对于你的实验非常重要,你可能需要在提高速度和保证结果一致性之间做出权衡。

调整超参数是深度学习中提升模型性能和训练效率的重要步骤。以下是一些超参数调整的经验法则和它们之间的相互影响关系:

number_workers设置得更大一些通常可以加速训练。

1. 学习率(Learning Rate)

  • 主要影响:学习率是最重要的超参数之一,它决定了每次参数更新的步长。学习率过高会导致训练过程不稳定,甚至不收敛;学习率过低则会导致训练过程缓慢。
  • 调整策略
    • 可以从一个较大的值开始,然后逐渐减小。
    • 学习率调度器(Scheduler)可以帮助动态调整学习率,如学习率逐步衰减(Step Decay)、余弦退火(Cosine Annealing)等。

2. 批量大小(Batch Size)

  • 主要影响:批量大小影响模型参数的更新频率和梯度估计的稳定性。较大的批量大小可以提高训练速度,但需要更多的内存。
  • 调整策略
    • 较小的批量大小会导致梯度的噪声较大,但可以在内存有限的情况下使用。
    • 较大的批量大小可以稳定梯度更新,但需要调整学习率(通常需要增加学习率)。

3. 优化器(Optimizer)

  • 主要影响:不同的优化器有不同的收敛特性和性能,如SGD、Adam、RMSprop等。
  • 调整策略
    • Adam 优化器常用于初学者,因为它具有自适应学习率,通常能较快收敛。
    • SGD + Momentum 通常在收敛性能和泛化能力上表现较好,但需要更细致的学习率调节。

4. 权重衰减(Weight Decay)

  • 主要影响:权重衰减是正则化的一种形式,防止模型过拟合。
  • 调整策略
    • 权重衰减值通常较小,可以从 1e-4 或 1e-5 开始调整。
    • 在使用 Adam 优化器时,注意区分 L2 正则化和权重衰减的区别。

5. 动量(Momentum)

  • 主要影响:动量项用于加速 SGD 优化器的收敛,通过累积过去梯度的指数衰减移动平均来加速梯度下降。
  • 调整策略
    • 动量值通常在 0.9 到 0.99 之间,可以帮助避免局部最小值。

6. 学习率调度(Learning Rate Scheduler)

  • 主要影响:学习率调度策略可以动态调整学习率,帮助模型更好地收敛。
  • 调整策略
    • 常见的调度策略有 StepLR、ReduceLROnPlateau、CosineAnnealingLR 等。
    • 根据训练过程中的验证集性能调整学习率。

7. 训练轮数(Epochs)

  • 主要影响:训练轮数决定了模型看到数据的次数。训练时间过短可能导致欠拟合,过长可能导致过拟合。
  • 调整策略
    • 通过观察验证集的性能和损失变化来决定合适的训练轮数。

超参数之间的相互影响

  1. 学习率与批量大小:批量大小和学习率有时需要一起调整。通常情况下,增大批量大小时需要相应地增大学习率。
  2. 学习率与优化器:不同的优化器可能对学习率的敏感度不同。例如,Adam 通常对学习率的选择较为宽容,而 SGD 则需要更精确的学习率调节。
  3. 学习率与动量:在使用 SGD 时,动量和学习率一起调整可以更好地控制训练过程的收敛性。
  4. 权重衰减与学习率:较高的权重衰减可能需要较低的学习率来确保稳定性。

调整超参数的策略

  1. 网格搜索(Grid Search):在超参数空间内进行全面搜索,但计算成本较高。
  2. 随机搜索(Random Search):随机选择超参数进行搜索,通常能获得比网格搜索更好的效果。
  3. 贝叶斯优化(Bayesian Optimization):通过构建代理模型来选择超参数,能够高效找到较优的超参数组合。
  4. 超参数调度器(Hyperparameter Schedulers):如 Hyperband,通过动态调整超参数来提高搜索效率。

通过以上经验法则和策略,你可以更有效地调整超参数,提高模型性能和训练效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】--Part4--多人协作

在之前的Git博客中,已经把Git本地相关的操作以及远程操作的介绍完了。如下: Git–Part1–基础操作 - 掘金 (juejin.cn)Git–Part2–分支管理 - 掘金 (juejin.cn)Git–Part3–远程操作 & 配置 & 标签管理 - 掘金 (juejin.cn) 这篇文章会介绍两种…

iptables(5)常用扩展模块

简介 之前我们已经介绍过扩展模块的简单使用,比如使用-m tcp/udp ,-m multiport参数通过--dports,--sports可以设置连续和非连续的端口范围。那么我们如何匹配其他的一些参数呢,比如源地址范围,目的地址范围,时间范围等,这就是我们这篇文章介绍的内容。 iprange扩展模块…

Eclipse使用TFS(Team Foundation Server) 超详细

Eclipse使用TFS 1、什么是TFS2、TFS和Git的区别3、签出代码4、签入代码4.1、签出以进行编辑4.2、修改本地代码4.3、签入挂起的更改4.4、签入 如果不能 签入挂起的更改,则先 签出以进行编辑如果 签入挂起的更改不可选中,则 如下操作 1、什么是TFS Team F…

thinkphp5模型的高级应用

ThinkPHP5 是一个基于 PHP 的轻量级框架,它提供了许多便利的功能来简化 Web 开发。在 ThinkPHP5 中,模型(Model)是 MVC(Model-View-Controller)架构中的重要组成部分,负责处理数据逻辑。以下是一…

音视频开发—FFmpeg 打开摄像头进行RTMP推流

实验平台:Ubuntu20.04 摄像头:普通USB摄像头,输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可,贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单,这里不…

决战技术管理转型:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策(Rational Decision Making)2. 有限理性(Bounded Rationality)3. 直觉决策(Intuitive Decision Making)4. 循证管理(Evidence-Base…

智能血压计,让健康“听”得见- WT588F02B血压计语音方案

一、语音血压计开发背景: 在快节奏的现代生活中,健康成为了我们最宝贵的财富。而血压,作为反映人体健康状态的重要指标之一,更是需要我们时刻关注。传统的血压计虽然能够为我们提供准确的血压数据,但往往因为操作复杂…

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时,希望可以在单元格显示图片或其他控件,发现原生的ListView不支持,于是通过拓展,实现ListView可以显示任意控件的功能,效果如下: 实现方法 本来想着在单元格里面实现控件的自绘的…

20240621在飞凌的OK3588-C开发板的Buildroot系统中集成i2ctool工具

20240621在飞凌的OK3588-C开发板中打开i2ctool工具 2024/6/21 17:44 默认继承的i2c工具: rootrk3588-buildroot:/# rootrk3588-buildroot:/# i2c i2c-stub-from-dump i2cdump i2cset i2cdetect i2cget i2ctransfer rootrk3588-…

史上最全的整合Harbor安装教程,哈哈哈哈

一、安装docker 下载地址:https://download.docker.com/linux/static/stable/x86_64/docker-23.0.4.tgz 1.1 解压二进制包 wget https://download.docker.com/linux/static/stable/x86_64/docker-23.0.4.tgz tar zxvf docker-23.0.4.tgz mv docker/* /usr/bin1.2…

【LinuxC语言】线程的概念

文章目录 前言一、线程的概念总结前言 在Linux操作系统中,线程是最小的执行单元。线程是进程的一部分,每个线程都共享其父进程的地址空间,并且可以并行执行。在C语言中,我们可以使用POSIX线程(也称为Pthreads)库来创建和控制线程。线程编程在许多场景中都非常有用,例如…

Flutter 实现软鼠标

文章目录 前言一、如何实现?1、记录鼠标偏移2、MouseRegion获取偏移3、Transform移动图标 二、完整代码三、使用示例总结 前言 flutter在嵌入式系统中运行时,有可能遇到drm鼠标无法使用的情况,但鼠标事件却可以正常接收,此时如果…

迁移Microsoft Edge

如何将Microsoft Edge迁移到d盘?对于Microsoft Edge想必大部分人都不陌生,它是Windows操作系统的默认浏览器,存储用户的个人数据、缓存和设置等信息。有些时候,我们需要对Microsoft Edge中的数据进行数据迁移,以释放c盘…

【Effective Modern C++】第1章 型别推导

【Effective Modern C】第1章 型别推导 文章目录 【Effective Modern C】第1章 型别推导条款1:理解模板型别推导基础概念模板型别推导的三种情况情景一 ParamType 是一个指针或者引用,但非通用引用情景二 ParamType是一个通过引用情景三 ParamType既不是…

【gdb 如何生成并查看core dump】

生成core dump 使用ulimit命令来设置core dump文件的大小。 ulimit -c unlimitedcore dump位置 如果程序崩溃,系统会生成一个名为core的文件。可以通过以下命令查看core文件位置, cat /proc/sys/kernel/core_pattern查看core dump gdb /path/to/you…

flinksql BUG : flink hologres-cdc source FINISHED

org.apache.flink.runtime.JobException: The failure is not recoverable or the failure does not allow to restart.at org.apache.flink.runtime.executiongraph.failover.flip1.ExecutionFailureHandler

用Vite基于Vue3+ts+DataV+ECharts开发数据可视化大屏,即能快速开发又能保证屏幕适配

数据可视化大屏 基于 Vue3、Typescript、DataV、ECharts5 框架的大数据可视化(大屏展示)开发。此项目vue3实现界面,采用新版动态屏幕适配方案,全局渲染组件封装,支持数据动态刷新渲染、内部DataV、ECharts图表都支持自…

SQLite扩展插件终极集合

作为一个嵌入式数据库引擎,SQLite 与其他数据库管理系统相比,缺少了一些功能。不过 SQLite 提供了一个扩展机制,因此我们可以在网络上找到大量的 SQLite 插件。 今天我们介绍的这个插件叫做 sqlean,它打包了许多流行的 SQLite 扩…

消息队列kafka中间件详解:案例解析(第10天)

系列文章目录 1- 消息队列(熟悉)2- Kafka的基本介绍(掌握架构,其他了解)3- Kafka的相关使用(掌握kafka常用shell命令)4- Kafka的Python API的操作(熟悉) 文章目录 系列文…

java-BigDecimal 的使用

总结 BigDecimal是Java中的一个强大工具,用于处理高精度的数值计算,特别是在财务和科学计算中。它通过提供对精度和舍入行为的精细控制,解决了浮点数运算中的精度问题。以下是对BigDecimal的进一步总结和扩展。 9. BigDecimal的使用示例 9.…