深度学习-超参数调优

在机器学习中有很多调优的方式机器学习——超参数调优,深度学习中也存在同样的方式,接下来,介绍一下深度学习框架里边的自动调参模块。

1. 基于Tensorflow的Keras tuner

官方教程如下:Introduction to the Keras Tuner  |  TensorFlow Core (google.cn)

官网API极其更多细节:HyperParameters - Keras Tuner (keras-team.github.io)

超参数分为两种类型:

  • 模型超参数(例如隐藏层的权重和数量)
  • 算法超参数(例如SGD的学习率,KNN的K值等)

(1)定义模型

当建立模型进行超参数优化时,我们需要根据模型建立超参数搜索空间,建立hypermodel通常是两个途径:

  • 使用模型建立函数(model builder function)
  • 使用Keras Tuner API中HyperModel的子类HyperXception and HyperResNet

Keras Tuner API使用hp进行参数遍历,常用方法有

  • hp.Int 
hp_units = hp.Int('units', min_value=32, max_value=512, step=32)

            name: Str. 参数的名字,必须唯一
            min_value: Int. 范围的最小值
            max_value: Int. 范围的最大值
            step: 步长

  • hp.Choice 
hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])

            name: Str. 参数的名字,必须唯一
            values: 可能值的list. 值的类型可以是int, float,str, or bool. 所有的值必须是一个类型
            ordered: Whether the values passed should be considered to
                have an ordering. This defaults to `True` for float/int
                values. Must be `False` for any other values.

  • hp.Float
hp_units = hp.Float('units', min_value=32.0, max_value=512.0, step=32.0)

            name: Str. 参数的名字,必须唯一
            min_value: Float. 范围的最小值
            max_value: Float. 范围的最大值
            step: Optional. Float, e.g. 0.1.
                smallest meaningful distance between two values.
                Whether step should be specified is Oracle dependent,
                since some Oracles can infer an optimal step automatically.

  • hp.Boolean

            name: Str. 参数的名字,必须唯一
            default: Default value to return for the parameter.
                If unspecified, the default value will be False.

  • hp.Fixed

            name: Str. 参数的名字,必须唯一
            value: Value to use (can be any JSON-serializable
                Python type).

建立builder function,主要对units和learning_rate两个参数进行了调优,代码如下:

def model_builder(hp):model = keras.Sequential()model.add(keras.layers.Flatten(input_shape=(28, 28)))# Tune the number of units in the first Dense layer# Choose an optimal value between 32-512hp_units = hp.Int('units', min_value=32, max_value=512, step=32)model.add(keras.layers.Dense(units=hp_units, activation='relu'))model.add(keras.layers.Dense(10))# Tune the learning rate for the optimizer# Choose an optimal value from 0.01, 0.001, or 0.0001hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])return model

(2)实例化调优器并进行调优

The Keras Tuner有四个调优器,分别是RandomSearchHyperbandBayesianOptimization, and Sklearn,这里主要是用了Hyperband,需要指定objective和max_epochs等参数,并在directory='my_dir'/project_name='intro_to_kt'的文件中记录训练细节。代码如下:

tuner = kt.Hyperband(model_builder,objective='val_accuracy',max_epochs=10,factor=3,directory='my_dir',project_name='intro_to_kt')#早停
stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)tuner.search(img_train, label_train, epochs=50, validation_split=0.2, callbacks=[stop_early])# Get the optimal hyperparameters
best_hps=tuner.get_best_hyperparameters(num_trials=1)[0]print(f"""
The hyperparameter search is complete. The optimal number of units in the first densely-connected
layer is {best_hps.get('units')} and the optimal learning rate for the optimizer
is {best_hps.get('learning_rate')}.
""")

(3)模型调优之后,可以通过最优参数进行重新training。

#利用搜索得到的超参数,找出最优epoch数来训练模型。
# Build the model with the optimal hyperparameters and train it on the data for 50 epochs
model = tuner.hypermodel.build(best_hps)
history = model.fit(img_train, label_train, epochs=50, validation_split=0.2)val_acc_per_epoch = history.history['val_accuracy']
best_epoch = val_acc_per_epoch.index(max(val_acc_per_epoch)) + 1
print('Best epoch: %d' % (best_epoch,))#重新实例化超模型,从上面用最优的纪元数训练它。
hypermodel = tuner.hypermodel.build(best_hps)# Retrain the model
hypermodel.fit(img_train, label_train, epochs=best_epoch, validation_split=0.2)

拓展:其他优化器的用法

    import kerastuner as ktfrom sklearn import ensemblefrom sklearn import datasetsfrom sklearn import linear_modelfrom sklearn import metricsfrom sklearn import model_selectiondef build_model(hp):model_type = hp.Choice('model_type', ['random_forest', 'ridge'])if model_type == 'random_forest':model = ensemble.RandomForestClassifier(n_estimators=hp.Int('n_estimators', 10, 50, step=10),max_depth=hp.Int('max_depth', 3, 10))else:model = linear_model.RidgeClassifier(alpha=hp.Float('alpha', 1e-3, 1, sampling='log'))return modeltuner = kt.tuners.Sklearn(oracle=kt.oracles.BayesianOptimization(objective=kt.Objective('score', 'max'),max_trials=10),hypermodel=build_model,scoring=metrics.make_scorer(metrics.accuracy_score),cv=model_selection.StratifiedKFold(5),directory='.',project_name='my_project')X, y = datasets.load_iris(return_X_y=True)X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.2)tuner.search(X_train, y_train)best_model = tuner.get_best_models(num_models=1)[0]

其他两个:

tuner = kt.tuners.BayesianOptimization(hypermodel=model_builder,objective='val_accuracy',max_trials=4,directory='.',project_name='my_project')    tuner = kt.tuners.RandomSearch(hypermodel=model_builder,objective='val_accuracy',max_trials=4,directory='.',project_name='my_project')        

2.RAY tune

RAY现在仅支持Mac和Linux,Windows的wheels还没有。

(1)安装:

 pip install 'ray[tune]'

(2)优势:

  • 支持多平台包括PyTorch, XGBoost, MXNet和Keras
  • 自动管理检查点和记录到TensorBoard

(3)关键点

Ray tune的使用核心点主要如下图构成:

  • Trainable:包装目标函数
#损失函数
def objective(x, a, b):return a * (x ** 0.5) + b
#wrapper
def trainable(config):# config (dict): A dict of hyperparameters.for x in range(20):score = objective(x, config["a"], config["b"])tune.report(score=score)  # This sends the score to Tune.
  • tune.run:执行参数优化
# Pass in a Trainable class or function to tune.run.
tune.run(trainable)
  • search space:建立搜索空间
config = {"uniform": tune.uniform(-5, -1),  # Uniform float between -5 and -1"quniform": tune.quniform(3.2, 5.4, 0.2),  # Round to increments of 0.2"loguniform": tune.loguniform(1e-4, 1e-2),  # Uniform float in log space"qloguniform": tune.qloguniform(1e-4, 1e-1, 5e-4),  # Round to increments of 0.0005"randn": tune.randn(10, 2),  # Normal distribution with mean 10 and sd 2"qrandn": tune.qrandn(10, 2, 0.2),  # Round to increments of 0.2"randint": tune.randint(-9, 15),  # Random integer between -9 and 15"qrandint": tune.qrandint(-21, 12, 3),  # Round to increments of 3 (includes 12)"choice": tune.choice(["a", "b", "c"]),  # Choose one of these options uniformly"func": tune.sample_from(lambda spec: spec.config.uniform * 0.01), # Depends on other value"grid": tune.grid_search([32, 64, 128])  # Search over all these values
}
  • search  Algorithms(Search Algorithms (tune.suggest) — Ray v1.2.0所支持的搜索算法)
# Be sure to first run `pip install hyperopt`import hyperopt as hp
from ray.tune.suggest.hyperopt import HyperOptSearch# Create a HyperOpt search space
config = {"a": tune.uniform(0, 1),"b": tune.uniform(0, 20)# Note: Arbitrary HyperOpt search spaces should be supported!# "foo": tune.randn(0, 1))
}# Specify the search space and maximize score
hyperopt = HyperOptSearch(metric="score", mode="max")# Execute 20 trials using HyperOpt and stop after 20 iterations
tune.run(trainable,config=config,search_alg=hyperopt,num_samples=20,stop={"training_iteration": 20}
)
  • Trial Schedulers:查看训练过程
  • Analysis:分析训练过程

(4)使用

from ray import tunedef objective(step, alpha, beta):return (0.1 + alpha * step / 100)**(-1) + beta * 0.1def training_function(config):# Hyperparametersalpha, beta = config["alpha"], config["beta"]for step in range(10):# Iterative training function - can be any arbitrary training procedure.intermediate_score = objective(step, alpha, beta)# Feed the score back back to Tune.tune.report(mean_loss=intermediate_score)analysis = tune.run(training_function,config={"alpha": tune.grid_search([0.001, 0.01, 0.1]),"beta": tune.choice([1, 2, 3])})print("Best config: ", analysis.get_best_config(metric="mean_loss", mode="min"))# Get a dataframe for analyzing trial results.
df = analysis.results_df

 

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

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

相关文章

Paddle——常见的评估指标

在模型评估过程中,分类、回归、排序问题往往使用不同的指标进行评估。分类问题通常用准确率、召回率、精准率、F1值等指标进行评估;回归问题使用MSE、RMSE、R^2、MAPE等; 1 分类评估原理 1.1 准确率的局限性 我们经常接触的评价指标就是准…

大江大河,随笔观后感

我是「大江大河」的铁粉,非常喜欢这部剧,从这部剧里面能看到生活的一些影子。从这部剧里面也可以看到不同阶层的人们对待生活,对待理想,对待身边的朋友亲人的态度。—— 知乎热论「程开颜为什么输给了杨思申?」程开颜并…

Cortex M3内核架构

CortexM3内核架构 宗旨:技术的学习是有限的,分享的精神是无限的。 1、ARMCortex-M3处理器 Cortex-M3处理器内核是单片机的中央处理单元( CPU)。 完整的基于CM3的MCU还需要很多其它组件。在芯片制造商得到CM3处理器内核的使用授权…

NLP——序列标注之命名实体识别

1.概述 序列标注包括自然语言处理中的分词,词性标注,命名实体识别,关键词抽取,词义角色标注等。解决方案是NN模型(神经网络模型)CRF 命名实体识别(Named Entity Recognition,简称N…

C语言验证6174数学问题

有意思的数学问题任意4位不完全一样的数字,能组合出的最大数字减去能组合出的最小数字,得到一个新的数字(3位数补0),重复以上操作,不超过7个循环,必然得到一个数:6174这个问题是之前发布的文章&…

Cortex-M3工作模式与异常

Cortex-M3工作模式与异常 宗旨:技术的学习是有限的,分享的精神是无限的。 一、工作模式 线程模式和手柄模式。 当处理器处在线程状态下时,既可以使用特权级,也可以使用用户级;另一方面, handler模式总是特…

自己动手实现一个malloc内存分配器 | 30图

对内存分配器透彻理解是编程高手的标志之一。如果你不能理解malloc之类内存分配器实现原理的话,那你可能写不出高性能程序,写不出高性能程序就很难参与核心项目,参与不了核心项目那么很难升职加薪,很难升级加薪就无法走向人生巅峰…

机器学习面试——分类算法SVM

1、什么是硬间隔和软间隔? 当训练数据线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机。 当训练数据近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器…

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神是无限的。 一、NVIC概览 ——嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC 还包含了 MPU、 S…

VS 2005 或 VS 2008 在安装VSS 2005后,看不到源代码管理的解决办法

昨天有朋友在重新安装VS 2008后,再安装VSS 2005,安装好后在文件菜单中找不到“源代码管理”的菜单项,后来经朋友告知,是开发工具的默认选项设置问题。打开开发工具,“工具”--“选项”:(如图&am…

代码里-3gt;gt;1是-2但3gt;gt;1是1,-3/2却又是-1,为什么?

之前群里有个同学向大家提出了类似这样的问题。随后这位同学公布了答案:右移运算是向下取整,除法是向零取整。这句话对以上现象做了很好的总结,可是本质原因是什么呢?我一直以为-3>>1的结果是-1。所以打算思考一下这个问题。…

机器学习面试——逻辑回归和线性回归

1、什么是广义线性模型(generalize linear model)? 普通线性回归模型是假设X为自变量,Y为因变量,当X是一维的,y是一维的,共进行n次观测,则 其中,w是待估计的参数&#x…

STM32开发环境

STM32开发环境 宗旨:技术的学习是有限的,分享的精神是无限的。 一、MDK安装 MDK 是一个集代码编辑,编译,链接和下载于一体的集成开发环境( KDE )。MDK 这个名字我们可能不熟悉,但说到 KEIL …

机器学习面试——XGBoost,GBDT,RF(上)

1、常见的集成思想 bagging:基学习器之间并行训练,且学习器之间没有依赖,像是集体决策的过程,每个个体都进行单独学习,再通过投票的方式做最后的集体决策。常见的算法有随机森林 boosting:基学习器之间串…

听说有人不了解柔性数组

1 引言 定长数组包在平时的开发中,缓冲区数据收发时,如果采用缓冲区定长包,假定大小是 1k,MAX_LENGTH 为 1024。结构体如下:// 定长缓冲区 struct max_buffer {int len;char data[MAX_LENGTH]; };数据结构的大小 &…

Transformer模型拆解分析

资源来自:DataWhale 学习资料 最近看了DataWhale 的Transformer图解,突然对Transformer的结构图有了更加清晰的理解,特此记录。 1、大框架 Transformer是由6个encoder和6个decoder组成,模型的具体实现是model变量里边&#xff0…

设计模式学习笔记六:.NET反射工厂

1. 简述 通过前面的学习,我们以传统的方式实现了简单工厂,工厂方法和抽象工厂,但是有些场合下如此处理,代码会变得冗余并且难以维护。假设我们要创建交通工具。可以是汽车,火车,轮船等&#xff…

在unity 中,使用http请求,下载文件到可读可写路径

在这里我用了一个线程池,线程池参数接收一个带有object参数的,无返回值的委托 ,下载用到的核心代码,网上拷贝的,他的核心就是发起一个web请求,然后得到请求的响应,读取响应的流 剩下的都是常见的…

在tinyalsa上抓取音频

我们经常会遇到这样的问题,应用读取到的音频有问题,需要在tinyalsa里面读取音频来确认是底层音频有问题,还是应用处理之后存在的问题。所以,这个patch就出现了代码的逻辑很简单,主要是在pcm_read的时候,同时…