精华内容
下载资源
问答
  • TensorFlow使用Keras Tuner自动调参

    千次阅读 多人点赞 2020-06-29 10:27:14
    TensorFlow使用Keras Tuner自动调参数据集归一化图像分类模型Hyperband运行超参数搜索(自动调参)获取最佳超参数使用最佳超参数构建和训练模型整体代码 代码地址: ...数据集 Zalando商品图片数据集,通过load_data函数...

    代码地址:
    https://github.com/lilihongjava/deep_learning/tree/master/TensorFlow2.0%E8%87%AA%E5%8A%A8%E8%B0%83%E5%8F%82

    数据集

    Zalando商品图片数据集,通过load_data函数读取data目录下 ‘train-labels-idx1-ubyte.gz’, ‘train-images-idx3-ubyte.gz’, ‘t10k-labels-idx1-ubyte.gz’, 't10k-images-idx3-ubyte.gz’文件

    def load_data():
        path = "./data/"
        files = [
            'train-labels-idx1-ubyte.gz', 'train-images-idx3-ubyte.gz',
            't10k-labels-idx1-ubyte.gz', 't10k-images-idx3-ubyte.gz'
        ]
        paths = [path + each for each in files]
        with gzip.open(paths[0], 'rb') as lbpath:
            y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)  # uint8无符号整数(0 to 255),一个字节,一张图片256色
        with gzip.open(paths[1], 'rb') as imgpath:
            x_train = np.frombuffer(
                imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)  # 图像尺寸(28*28)
        with gzip.open(paths[2], 'rb') as lbpath:
            y_test = np.frombuffer(lbpath.read(), np.uint8, offset=8)  # offset=8,前8不读
        with gzip.open(paths[3], 'rb') as imgpath:
            x_test = np.frombuffer(
                imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28, 28)
        return (x_train, y_train), (x_test, y_test)
    
    (img_train, label_train), (img_test, label_test) = load_data()
    

    归一化

    	img_train = img_train.astype('float32') / 255.0
        img_test = img_test.astype('float32') / 255.0
    

    图像分类模型

    hypermodel
    调整第一个Dense层中的层数,在32-512之间选择一个最佳值

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

    调整优化器的学习速率,从0.01、0.001或0.0001中选择一个最佳值

    hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
    
    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-512
        hp_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.0001
        hp_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'])  # accuracy,用于判断模型效果的函数
        return model
    

    Hyperband

    使用Hyperband 算法搜索超参数
    定义Hyperband,指定hypermodel,优化的目标,最大迭代次数,衰减系数,详细日志和checkpoints保存路径

        tuner = kt.Hyperband(model_builder,
                             objective='val_accuracy',  # 优化的目标,验证集accuracy
                             max_epochs=10,  # 最大迭代次数
                             factor=3,
                             directory='my_dir',  # my_dir/intro_to_kt目录包含超参数搜索期间运行的详细日志和checkpoints
                             project_name='intro_to_kt')
    

    运行超参数搜索(自动调参)

    ClearTrainingOutput为回调函数,在每个训练步骤结束时回调

     tuner.search(img_train, label_train, epochs=10, validation_data=(img_test, label_test),
                     callbacks=[ClearTrainingOutput()])
    

    获取最佳超参数

    tuner.get_best_hyperparameters(num_trials=1)[0]
    

    使用最佳超参数构建和训练模型

    	model = tuner.hypermodel.build(best_hps)
        model.fit(img_train, label_train, epochs=10, validation_data=(img_test, label_test))
    

    整体代码

    if __name__ == '__main__':
        #  Zalando商品图片数据集
        (img_train, label_train), (img_test, label_test) = load_data()
    
        # 归一化
        img_train = img_train.astype('float32') / 255.0
        img_test = img_test.astype('float32') / 255.0
        # 使用 Hyperband 算法搜索超参数
        tuner = kt.Hyperband(model_builder,
                             objective='val_accuracy',  # 优化的目标,验证集accuracy
                             max_epochs=10,  # 最大迭代次数
                             factor=3,
                             directory='my_dir',  # my_dir/intro_to_kt目录包含超参数搜索期间运行的详细日志和checkpoints
                             project_name='intro_to_kt')
    
        tuner.search(img_train, label_train, epochs=10, validation_data=(img_test, label_test),
                     callbacks=[ClearTrainingOutput()])
    
        # 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')}.
        """)
    
        # Build the model with the optimal hyperparameters and train it on the data
        model = tuner.hypermodel.build(best_hps)
        model.fit(img_train, label_train, epochs=10, validation_data=(img_test, label_test))
    

    参考:https://www.tensorflow.org/tutorials/keras/keras_tuner

    展开全文
  • 自动调参方法

    千次阅读 2019-03-17 09:44:41
    自动调参方法: 1.网格搜索:简单点的选该方法 2.随机搜索:如果维度高,就选该方法 3.贝叶斯搜索 激活函数没有好坏之分,relu 解决梯度消失,不能解决梯度爆炸. 收敛判断:若是不再变化,表示没有继续训练...

    自动调参方法:

    1.网格搜索:简单点的选该方法

    2.随机搜索:如果维度高,就选该方法

    3.贝叶斯搜索

     

     

    激活函数没有好坏之分,relu 解决梯度消失,不能解决梯度爆炸.

    收敛判断:若是不再变化,表示没有继续训练下去的必要了。

     

    不要局限自己的思维。 网络层数不是越多越好。。

    展开全文
  • 如何使用hyperopt对xgboost进行自动调参

    千次阅读 热门讨论 2018-12-17 10:26:17
    本教程重点在于传授如何使用Hyperopt对xgboost进行自动调参。但是这份代码也是我一直使用的代码模板之一,所以在其他数据集上套用该模板也是十分容易的。 同时因为xgboost,lightgbm,catboost。三个类库调用方法都...

    本教程重点在于传授如何使用Hyperopt对xgboost进行自动调参。但是这份代码也是我一直使用的代码模板之一,所以在其他数据集上套用该模板也是十分容易的。

    同时因为xgboost,lightgbm,catboost。三个类库调用方法都比较一致,所以在本部分结束之后,我们有理由相信,你将会学会在这三个类库上使用hyperopt。除此之外要额外说明的是,本文并不涉及交叉验证的问题,交叉验证请查看其他教程。

    什么是Hyperopt?

    Hyperopt:是python中的一个用于"分布式异步算法组态/超参数优化"的类库。使用它我们可以拜托繁杂的超参数优化过程,自动获取最佳的超参数。广泛意义上,可以将带有超参数的模型看作是一个必然的非凸函数,因此hyperopt几乎可以稳定的获取比手工更加合理的调参结果。尤其对于调参比较复杂的模型而言,其更是能以远快于人工调参的速度同样获得远远超过人工调参的最终性能。

    文档地址?

    目前中文文档的地址由本人FontTian在2017年翻译,但是hyperopt文档本身确实写的不怎么样。所以才有了这份教程。源代码请前往Github教程地址下载下载。

    教程

    获取数据

    这里我们使用UCI的红酒质量数据集,除此之外我还额外增加了两个特征。

    from hyperopt import fmin, tpe, hp, partial
    import numpy as np
    from sklearn.model_selection import train_test_split, cross_val_score
    from sklearn.metrics import mean_squared_error, zero_one_loss
    import xgboost as xgb
    import pandas as pd
    
    def GetNewDataByPandas():
        wine = pd.read_csv("../data/wine.csv")
        wine['alcohol**2'] = pow(wine["alcohol"], 2)
        wine['volatileAcidity*alcohol'] = wine["alcohol"] * wine['volatile acidity']
        y = np.array(wine.quality)
        X = np.array(wine.drop("quality", axis=1))
    
        columns = np.array(wine.columns)
    
        return X, y, columns
    

    分割数据并转换

    首先将数据分割为三份,一部分用于预测,训练数据则同样分成额外的两部分用于evallist参数。

    同时为了加快速度和减少内存,我们将数据转换为xgboost自带的读取格式。

    # Read wine quality data from file
    X, y, wineNames = GetNewDataByPandas()
    
    # split data to [[0.8,0.2],01]
    x_train_all, x_predict, y_train_all, y_predict = train_test_split(X, y, test_size=0.10, random_state=100)
    
    x_train, x_test, y_train, y_test = train_test_split(x_train_all, y_train_all, test_size=0.2, random_state=100)
    
    dtrain = xgb.DMatrix(data=x_train,label=y_train,missing=-999.0)
    dtest = xgb.DMatrix(data=x_test,label=y_test,missing=-999.0)
    
    evallist = [(dtest, 'eval'), (dtrain, 'train')]
    

    定义参数空间

    使用hyperopt自带的函数定义参数空间,但是因为其randint()方法产生的数组范围是从0开始的,所以我额外定义了一个数据转换方法,对原始参数空间进行一次转换。

    关于hyperopt中定义参数区间需要使用的函数请参考:

    • 中文地址,请点击这里
    • 英文地址,请点击这里
    # 自定义hyperopt的参数空间
    space = {"max_depth": hp.randint("max_depth", 15),
             "n_estimators": hp.randint("n_estimators", 300),
             'learning_rate': hp.uniform('learning_rate', 1e-3, 5e-1),
             "subsample": hp.randint("subsample", 5),
             "min_child_weight": hp.randint("min_child_weight", 6),
             }
    
    def argsDict_tranform(argsDict, isPrint=False):
        argsDict["max_depth"] = argsDict["max_depth"] + 5
        argsDict['n_estimators'] = argsDict['n_estimators'] + 150
        argsDict["learning_rate"] = argsDict["learning_rate"] * 0.02 + 0.05
        argsDict["subsample"] = argsDict["subsample"] * 0.1 + 0.5
        argsDict["min_child_weight"] = argsDict["min_child_weight"] + 1
        if isPrint:
            print(argsDict)
        else:
            pass
    
        return argsDict
    

    创建模型工厂与分数获取器

    xgboost模型工厂用于生产我们需要的model,而分数获取器则是为了解耦。这样在实际的测试工作中更加套用代码和修改。

    def xgboost_factory(argsDict):
        argsDict = argsDict_tranform(argsDict)
        
        params = {'nthread': -1,  # 进程数
                  'max_depth': argsDict['max_depth'],  # 最大深度
                  'n_estimators': argsDict['n_estimators'],  # 树的数量
                  'eta': argsDict['learning_rate'],  # 学习率
                  'subsample': argsDict['subsample'],  # 采样数
                  'min_child_weight': argsDict['min_child_weight'],  # 终点节点最小样本占比的和
                  'objective': 'reg:linear',
                  'silent': 0,  # 是否显示
                  'gamma': 0,  # 是否后剪枝
                  'colsample_bytree': 0.7,  # 样本列采样
                  'alpha': 0,  # L1 正则化
                  'lambda': 0,  # L2 正则化
                  'scale_pos_weight': 0,  # 取值>0时,在数据不平衡时有助于收敛
                  'seed': 100,  # 随机种子
                  'missing': -999,  # 填充缺失值
                  }
        params['eval_metric'] = ['rmse']
    
        xrf = xgb.train(params, dtrain, params['n_estimators'], evallist,early_stopping_rounds=100)
    
        return get_tranformer_score(xrf)
    
    def get_tranformer_score(tranformer):
        
        xrf = tranformer
        dpredict = xgb.DMatrix(x_predict)
        prediction = xrf.predict(dpredict, ntree_limit=xrf.best_ntree_limit)
      
        return mean_squared_error(y_predict, prediction)
    

    调用Hyperopt开始调参

    之后我们调用hyperopt进行自动调参即可,同时通过返回值获取最佳模型的结果。

    # 开始使用hyperopt进行自动调参
    algo = partial(tpe.suggest, n_startup_jobs=1)
    best = fmin(xgboost_factory, space, algo=algo, max_evals=20, pass_expr_memo_ctrl=None)
    
    [15:23:32] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 142 extra nodes, 0 pruned nodes, max_depth=10
    [0]	eval-rmse:5.03273	train-rmse:4.90203
    Multiple eval metrics have been passed: 'train-rmse' will be used for early stopping.
    
    Will train until train-rmse hasn't improved in 100 rounds.
    [15:23:32] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 172 extra nodes, 0 pruned nodes, max_depth=10
    [1]	eval-rmse:4.77384	train-rmse:4.64767
    
    ...
    
    [15:24:04] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 192 extra nodes, 0 pruned nodes, max_depth=15
    [299]	eval-rmse:0.570382	train-rmse:0.000749
    

    展示结果

    展示我们获取的最佳参数,以及该模型在训练集上的最终表现,如果想要使用交叉验证请参考其他教程。

    RMSE = xgboost_factory(best)
    print('best :', best)
    print('best param after transform :')
    argsDict_tranform(best,isPrint=True)
    print('rmse of the best xgboost:', np.sqrt(RMSE))
    
    [15:24:52] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 428 extra nodes, 0 pruned nodes, max_depth=14
    [0]	eval-rmse:5.02286	train-rmse:4.89385
    Multiple eval metrics have been passed: 'train-rmse' will be used for early stopping.
    
    Will train until train-rmse hasn't improved in 100 rounds.
    [15:24:52] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 680 extra nodes, 0 pruned nodes, max_depth=14
    [1]	eval-rmse:4.75938	train-rmse:4.63251
    
    ...
    
    [298]	eval-rmse:0.583923	train-rmse:0.000705
    [15:24:54] /workspace/src/tree/updater_prune.cc:74: tree pruning end, 1 roots, 22 extra nodes, 0 pruned nodes, max_depth=7
    [299]	eval-rmse:0.583926	train-rmse:0.000704
    best : {'learning_rate': 0.05385158551863543, 'max_depth': 14, 'min_child_weight': 2, 'n_estimators': 173, 'subsample': 0.8}
    best param after transform :
    {'learning_rate': 0.051077031710372714, 'max_depth': 19, 'min_child_weight': 3, 'n_estimators': 323, 'subsample': 0.5800000000000001}
    rmse of the best xgboost: 0.5240080946197716
    
    展开全文
  • sklearn包中自动调参方法-网格搜索GridSearchCV 一、GridSearchCV主要作用及函数参数 GridSearchCV:作用是在指定的范围内可以自动调参,只需将参数输入即可得到最优化的结果和参数。相对于人工调参更省时省力,相...

    sklearn包中自动调参方法-网格搜索GridSearchCV

    一、GridSearchCV主要作用及函数参数
    GridSearchCV:作用是在指定的范围内可以自动调参,只需将参数输入即可得到最优化的结果和参数。相对于人工调参更省时省力,相对于for循环方法更简洁灵活,不易出错。

    from sklearn.model_selection import GridSearchCV
    class sklearn.model_selection.GridSearchCV(
    estimator, param_grid, scoring=None, fit_params=None, 
    n_jobs=1, iid=True, refit=True, cv=None, verbose=0, 
    pre_dispatch='2*n_jobs', error_score='raise', return_train_score=True)
    

    参数释义:
    estimator:所使用分类器
    param_grid:值为字典或者列表,即需要最优化的参数的取值
    scoring:准确度评价标准,默认为None,根据所选模型不同,评价准则不同,如可以选择scoring='accuracy’或者’roc_auc’等
    cv:交叉验证参数,默认None(三折交叉验证,即fold数量为3),也可以是yield训练/测试数据的生成器
    refit:默认为True,即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集
    iid:默认为True,即默认个个样本fold概率分布一直,误差估计为所有样本的和,而非各个fold的平均
    verbose:日志冗长度,int:
    若冗长度为0,不输出训练过程;
    若冗长度为1,偶尔输出(一般设置为1);
    若冗长度>1,对每个子模型都输出
    n_jobs:并行数,一般设置为-1
    pre_dispatch:总共分发的并行任务数,当n_jobs大于1时,数据将在每个运行点进行复制,可能会导致OOM(内存溢出)。通过设置pre_dispatch参数,可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

    二、GridSearchCV常用方法及属性
    grid.fit():运行网格搜索
    grid.score():运行网格搜索后模型得分
    grid_scores_:给出不同参数情况下的评价结果
    best_params_:描述已取得最佳结果的参数的组合
    best_score_:提供优化过程期间观察到的最好评分

    三、举例

    from sklearn.ensemble import GradientBoostingClassifier
    from sklearn.model_selection import GridSearchCV
    #GradientBoostingClassifier模型
    GBC = GradientBoostingClassifier()
    gb_param_grid = {'loss' : ["deviance"],
                  'n_estimators' : [100,200,300],
                  'learning_rate': [0.1, 0.05, 0.01],
                  'max_depth': [4, 8],
                  'min_samples_leaf': [100,150],
                  'max_features': [0.3, 0.1] 
                  }
    modelgsGBC = GridSearchCV(GBC,param_grid = gb_param_grid, cv=kfold, 
                                         scoring="accuracy", n_jobs= -1, verbose = 1)
    modelgsGBC.fit(experData_X,experData_y)
    
    

    整个过程请参考:如何挤进Kaggle平台Titanic生存率预测项目TOP3%

    展开全文
  • Keras模型使用GridSearchCV自动调参

    千次阅读 2019-04-18 15:43:09
    最近使用keras调整参数,使用到自动调参,从网上找到一些资料,主要使用scikit-learn中GridSearchCV进行自动搜索最优参数,很实用分享到这里,帮助需要的朋友。 Grid search 是一种最优超参数的选择算法,实际就是...
  • NNI是微软的开源自动调参的工具。人工调参实在是太麻烦了,最近试了下水,感觉还不错,能在帮你调参的同时,把可视化的工作一起给做了,简单明了。其可以可以看到当前试验的进展情况,搜索参数和效果最好的一些超...
  • Keras自动调参

    万次阅读 多人点赞 2018-01-31 21:25:45
    调参是一件费时费力的事情,Grid Search 能帮助我们减少调参的工作量,这篇文章将向你展示如何使用Grid Search方法在Keras代码上进行超参数最优选择。 这篇文章整理自这里,另外一个可参考的代码请看这里 How
  • sklearn快速入门教程–(四)模型自动调参 上个教程中我们已经看到在sklearn中调用机器学习模型其实非常简单。但要获得较好的预测效果则需要选取合适的超参数。在实际的项目中其实也有不少参数是由工程师借助其经验...
  • NNI是微软的开源自动调参的工具。人工调参实在是太麻烦了,最近试了下水,感觉还不错,能在帮你调参的同时,把可视化的工作一起给做了,简单明了。然后感觉很多博客写的并不是很明白,所以打算自己补充一下。如果...
  • lgb自动调参

    2020-06-02 20:41:07
    原文链接
  • 自动调参工具-nni

    2020-07-08 21:45:52
    使用贝叶斯优化方法中的TPE 2.nni使用方法 step1:定制搜索空间:给超参一个大概的范围 step2 : 修改训练代码,让nii产生动态的超参运用于训练中 step3 : 调参器算法等策略配置 3、nni结合baseline ...
  • 模型自动调参

    2018-03-16 14:27:01
    一、GridSearch二、
  • PID自动调参simulink仿真

    千次阅读 2021-02-06 19:33:17
    PID自动调参simulink仿真-----如何高效调参 设计PID控制器 系统识别APP识别传递函数 Simulink搭建仿真控制系统 使用Maltab自动调参工具PID Tuner调节PID参数 设计PID控制器 我们先看这张经典的PID控制器的图片,...
  • 自动调参(GridSearchCV)及数据降维(PCA)在人脸识别中的应用
  • 机器学习之权重、偏置自动调参

    千次阅读 2018-10-31 08:47:36
    这个初始值可以随便赋值,反正你把样本丢进去,这些参数会自动调参。因为我的样本比较少,训练个5~6边权重和偏置基本就稳定下来了。 好了,废话不多说,直接上代码~ import matplotlib.pyplot as plt class ...
  • 机器学习之Grid Search网格搜索(自动调参

    万次阅读 多人点赞 2019-01-10 13:26:30
    Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。其原理就像是在数组里找最大值。(为什么叫网格搜索?以有两个参数的模型为例,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,026
精华内容 20,810
关键字:

自动调参