• (入门以及简介+实战)超参数寻找器hyperopt库中常见的函数或类的作用


    介绍与安装

    用来找超参数的,我们常常用的是格子搜索以及贪婪搜索对不对。它这个库有着更多的策略。

    pip install hyperopt
    
    • 1

    一个例子

    from hyperopt import fmin, tpe, hp
    best = fmin(fn=lambda x: x ** 2,
        space=hp.uniform('x', -10, 10),
        algo=tpe.suggest,
        max_evals=100)
    print(best)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    好了,上面引入了3个函数,fmin, tpe, hp。其中hp用来指定参数空间,比如hp.uniform(‘x’, -10, 10),其表示我们有一个参数x,其可能取值在-10到10之间,并且是均匀分布。tpe则是用来指定我们的搜索策略,比如可能是格子搜索之类的。max_evals=100则表示,由于我们的参数x取值连续,不可能说取遍所有值,所以尝试了100次不同的x值之后就结束。然后再说fn这个参数,上面是一个匿名函数,表示了一个二次函数 x 2 x^2 x2。这个东西表示的就是我们的目标函数,显然x在0处目标函数达到最小,我怎么知道是要求最小而不是最大的,因为fmin。一旦使用fmin,就会求解完毕,所以best其实已经求解完了,其存储了最佳的x是什么,如下:

    {'x': -0.026755005286317524}
    
    • 1

    有一点误差,不要紧。

    有人吐槽,这和我们训练一个神经网络调参有啥关系,当然有关系,你只需要将上述fn换成你的模型即可。

    再入门

    上面其实不太好,上面best只记录了最佳x,但是我们想要记录一下,100次不同的x得到的各自的目标值怎么办?从而我们可以画图看一下,目标值对这个参数敏感不敏感对吧。
    那该怎么做呢?

    import pickle
    import time
    from hyperopt import fmin, tpe, hp, STATUS_OK, Trials
    
    def objective(x):
        return {
            'loss': x ** 2,#注意loss和status其实类似于关键字,loss就是目标函数。
            #下面这个就是这次评估的状态,是否成功,有人问这还能不成功的吗?好像确实有可能,比如参数太大,内存爆了。
            'status': STATUS_OK,
            # -- store other results like this
            'eval_time': time.time(),
            'other_stuff': {'type': None, 'value': [0, 1, 2]}
            }
    trials = Trials()
    best = fmin(objective,
        space=hp.uniform('x', -10, 10),
        algo=tpe.suggest,
        max_evals=100,
        trials=trials)
    
    print(best)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    比如上面,我们我们的目标函数,不但会返回loss,还会记录其他一些我们需要记录的东西,这些东西通通会存起来,到trials对象中。至于那个best,和之前还是一样的,就是最优的x值。所以我们重点在怎么操作trials对象,从而读取100次调参中我们需要的数据。
    在这里插入图片描述
    先看上面四个用法。第一个,其实说白了,就是说,这个库本身其实就会记录每一次调参返回的一些官方内置的东西,比如下面一大堆东西,并不止我们上面写的eval_time。

    在这里插入图片描述
    第二个trials.results就是只返回我们需要的那几个,如下:

    在这里插入图片描述
    另外,两个就是只返回loss和status,就不说了。

  • 相关阅读:
    实验室管理系统LIMS
    Docker数据卷篇
    C++ 形参传值和传指针的误解
    Linux防火墙(iptables)
    Apache Doris 系列: 基础篇-Routine Load
    initrd和initramfs的区别
    设计原则学习
    Kubernetes简略架构
    .NET Core 读取配置技巧 - IOptions<TOptions> 接口
    SpringBoot-自定义Starter
  • 原文地址:https://blog.csdn.net/qq_43391414/article/details/128187613