利用偏函数设计学习率下降方式

2023-11-16

Python partial()

首先,我们需要简单了解下偏函数的作用:和装饰器一样,它可以扩展函数的功能,但又不完成等价于装饰器。通常应用的场景是当我们要频繁调用某个函数时,其中某些参数是已知的固定值,通常我们可以调用这个函数多次,但这样看上去似乎代码有些冗余,而偏函数的出现就是为了很少的解决这一个问题。举一个很简单的例子,比如我就想知道 100 加任意数的和是多少,通常我们的实现方式是这样的:

# 第一种做法:
def add(*args):
    return sum(args)

print(add(1, 2, 3) + 100)
print(add(5, 5, 5) + 100)

# 第二种做法
def add(*args):
    # 对传入的数值相加后,再加上100返回
    return sum(args) + 100

print(add(1, 2, 3))  # 106
print(add(5, 5, 5))  # 115 

看上面的代码,貌似也挺简单,也不是很费劲。但两种做法都会存在有问题:第一种,100这个固定值会返回出现,代码总感觉有重复;第二种,就是当我们想要修改 100 这个固定值的时候,我们需要改动 add 这个方法。下面我们来看下用 parital 怎么实现:

from functools import partial

def add(*args):
	return sum(args)

add_100  = partial(add, 100)
print(add_100(1, 2, 3))

add_200 = partial(add, 101)
print(add_100(3, 4, 5))

是不是很简单~

大概了解了偏函数的例子后,我们再来看一下偏函数的定义:

类func = functools.partial(func, *args, **keywords)

我们可以看到,partial 一定接受三个参数,从之前的例子,我们也能大概知道这三个参数的作用,简单介绍下:

func: 需要被扩展的函数,返回的函数其实是一个类 func 的函数
*args: 需要被固定的位置参数
**kwargs: 需要被固定的关键字参数

如果在原来的函数 func 中关键字不存在,将会扩展,如果存在,则会覆盖

用一个简单的包含位置参数和关键字参数的示例代码来说明用法:

同样是刚刚求和的代码,不同的是加入的关键字参数

def add(*args, **kwargs):
    # 打印位置参数
    for n in args:
        print(n)
    print("-"*20)
    # 打印关键字参数
    for k, v in kwargs.items():
       print('%s:%s' % (k, v))
    # 暂不做返回,只看下参数效果,理解 partial 用法

普通调用

add(1, 2, 3, v1=10, v2=20)
"""
1
2
3
--------------------
v1:10
v2:20
"""

# partial
add_partial = partial(add, 10, k1=10, k2=20)
add_partial(1, 2, 3, k3=20)
"""
10
1
2
3
--------------------
k1:10
k2:20
k3:20
"""

add_partial(1, 2, 3, k1=20)
"""
10
1
2
3
--------------------
k1:20
k2:20
"""

Detection 应用代码

lr_scheduler_func = get_lr_scheduler(lr_decay_type, Init_lr_fit, Min_lr_fit, UnFreeze_Epoch)

def get_lr_scheduler(lr_decay_type, lr, min_lr, total_iters, warmup_iters_ratio = 0.05, warmup_lr_ratio = 0.1, no_aug_iter_ratio = 0.05, step_num = 10):
    def yolox_warm_cos_lr(lr, min_lr, total_iters, warmup_total_iters, warmup_lr_start, no_aug_iter, iters):
        if iters <= warmup_total_iters:
            # lr = (lr - warmup_lr_start) * iters / float(warmup_total_iters) + warmup_lr_start
            lr = (lr - warmup_lr_start) * pow(iters / float(warmup_total_iters), 2) + warmup_lr_start
        elif iters >= total_iters - no_aug_iter:
            lr = min_lr
        else:
            lr = min_lr + 0.5 * (lr - min_lr) * (
                1.0 + math.cos(math.pi* (iters - warmup_total_iters) / (total_iters - warmup_total_iters - no_aug_iter))
            )
        return lr

    def step_lr(lr, decay_rate, step_size, iters):
        if step_size < 1:
            raise ValueError("step_size must above 1.")
        n       = iters // step_size
        out_lr  = lr * decay_rate ** n
        return out_lr

    if lr_decay_type == "cos":
        warmup_total_iters  = min(max(warmup_iters_ratio * total_iters, 1), 3)
        warmup_lr_start     = max(warmup_lr_ratio * lr, 1e-6)
        no_aug_iter         = min(max(no_aug_iter_ratio * total_iters, 1), 15)
        # 偏funcation
        func = partial(yolox_warm_cos_lr ,lr, min_lr, total_iters, warmup_total_iters, warmup_lr_start, no_aug_iter)
    else:
        decay_rate  = (min_lr / lr) ** (1 / (step_num - 1))
        step_size   = total_iters / step_num
        func = partial(step_lr, lr, decay_rate, step_size)

    return func

def set_optimizer_lr(optimizer, lr_scheduler_func, epoch):
    lr = lr_scheduler_func(epoch)
    for param_group in optimizer.param_groups:
        param_group['lr'] = lr

set_optimizer_lr(optimizer, lr_scheduler_func, epoch)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用偏函数设计学习率下降方式 的相关文章

随机推荐

  • diskgenius创建efi分区_怎么创建efi系统分区?efi系统分区创建教程

    文章导读 近两年出来的的电脑不管是新台式机还是笔记本电脑 绝大多数是uefi主板 要采用对应的硬盘分区是gpt格式的 所以我们一定要记得采用efi引导对应的分区类型一定是gpt分区 EFI分区是GPT磁盘分区表里面的一个必要分区 是独立于系
  • win10上安装python3.9.0+robotframework

    win10上安装python3 9 robotframework python3 9 0下载安装 robotframework安装 wxpython安装 ride安装 python3 9 0下载安装 下载地址 python3 9 0下载地址
  • 【机器实战学习】朴素贝叶斯 python代码实现

    朴素贝叶斯 输入数据创造词汇表 代码实现 coding UTF 8 def loadDataSet 创建了一下实验样本 return 词条且分的文档集合 类别标签的集合 自动检测侮辱性的语言 postingList my dog has f
  • 23种设计模式:适配器模式(最强解析!!!)

    适配器模式是23种设计模式之一 适配器模式作用 适配器模式的作用 在于将一个类的接口变换为客户端所期待的另一种接口 使得原本因为接口不匹配而无法一起工作的两个类能在一起工作 也就是说 适配器模式解决的是接口兼容性问题 适配器模式实现方式 适
  • 深度学习(十四):详解Matconvnet使用imagenet模型训练自己的数据集

    上节讨论过如何使一个简单的cnn网络训练mnist数据集 该节介绍复杂并且使用广泛的使用imagenet网络的预训练模型训练自己的数据集 Ok首先是自己的数据集了 Matconvnet中训练imagenet的数据集的准备不像caffe这些工
  • 【原创】【硬件电路】N沟道、P沟道MOS管基本原理与应用案例

    文章首发于同名微信公众号 DigCore 欢迎关注同名微信公众号 DigCore 及时获取最新技术博文 一 N MOS管和P MOS管的对比 二 N MOS的开关条件 N MOS管的导通调节是G极与S极中间的电压差超过阈值时 D极和S极导通
  • C语言中printf("lld")和printf("I64d")

    C语言中printf lld 和printf I64d 是不同的 这个是因为编译器的不同导致的 所以广大的ACMer需要注意了 HDU OJ 4504就是这样的一个问题 下面是Dp和math方法的AC代码 但是换成lld全都Wrong An
  • 二级空间配置器

    一级空间配置器 https blog csdn net qq 37964547 article details 80474316 一 二级空间配置器 在前面文章中我们介绍了一级空间配置器的概念和实现 一级空间配置器的实现相对比较简单 直接封
  • 操作系统教程第六版——3.3页式存储管理笔记

    一 引入页式存储管理的目的 1 减少碎片 纯分页系统 2 只在内存存放那些反复执行或即将执行的程序段与数据部分 而把那些不经常执行的程序段和数据存放于外存待执行时调入 以提高内存利用率而提出来的 页式虚拟存储 请求分页系统 二 基本思想 1
  • 【报错】RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasLtMatmul( ltHandle,

    在GPU上运行hugging face transformer的时候出现如下报错 RuntimeError CUDA error CUBLAS STATUS EXECUTION FAILED when calling cublasLtMat
  • 【Android】JUnit和Espresso单元测试新手快速入门

    引入依赖 android defaultConfig testInstrumentationRunner androidx test runner AndroidJUnitRunner dependencies testImplementa
  • JavaScript 中的模块化

    封面图说明 Michael J Kochniss mjk photo de instagram com mjk photo 在早期 JavaScript 程序主要用来实现一些页面上的动画或者简单的交互 所以程序不会太复杂 页面也不会有太多的
  • 【满分】【华为OD机试真题2023 JS】优秀学员统计

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 优秀学员统计 知识点排序统计编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司某部门软件教导团正在组织新员工每日打卡学习活动 他们开展这项学习活动已经
  • 说说React中setState执行机制?

    setState是异步的 1 调用setState是不会立即更新的 2 所有组件使用的是同一套更新机制 当所有组件didmount之后 父组件didmount 然后统一执行更新 3 更新时会把每个组件的更新合并 每个组件只会触发一次更新后的
  • 合肥工业大学 软件学院 软件质量保证与测试 第九章 软件测试

    文章目录 第九章 软件测试 1 软件测试概述 1 1 软件测试的定义 1 2 软件测试的目的 2 软件测试过程 3 软件测试类型 3 1 单元测试 3 2 集成测试 测试方法 3 3 系统测试 3 4 验收测试 3 5 回归测试 3 6 补
  • 高通功耗调试16之连接BT待机功耗大问题分析(Android P)

    问题背景 Android P上Google修改了BT的代码 在待机时允许modem上报网络信号强度给AP 因此连接BT待 机时AP会被频繁唤醒 导致待机功耗增加 问题解决 问题分析请参考KBA 190212004248 适用平台 ALL A
  • iOS安全攻防—目录

    The most difficult thing to do in a strange city is not to forget why you started the trip 在光怪陆离的城市拼尽全力 最难的是勿忘初心 一 工具篇 C
  • 响应式网页设计初探

    我首次接触响应式网页设计还要从应用bootstrap说起 我们运用bootstrap的网格类简单的将响应式设计带入我们的网页设计当中 当然bootstrap框架其实还做了其他事情以支持网页响应式设计 现在 就让我们一窥响应式网页设计背后的原
  • 【工具使用】Spyder代码补全问题

    我的Spyder突然不能够进行自动补全了 试了以下几种方法 1 如下图操作 但是没有任何用 2 在anaconda控制台输入pip list 查看安装了哪些包 如果存在enum34 则删除 pip uninstall enum34 重启sp
  • 利用偏函数设计学习率下降方式

    Python partial 首先 我们需要简单了解下偏函数的作用 和装饰器一样 它可以扩展函数的功能 但又不完成等价于装饰器 通常应用的场景是当我们要频繁调用某个函数时 其中某些参数是已知的固定值 通常我们可以调用这个函数多次 但这样看上