【Python深度学习系列】网格搜索神经网络超参数:优化器(案例+源码)

【Python深度学习系列】网格搜索神经网络超参数:优化器(案例+源码)

码农世界 2024-05-23 前端 70 次浏览 0个评论

这是我的第286篇原创文章。

一、引言

       在深度学习中,超参数是指在训练模型时需要手动设置的参数,它们通常不能通过训练数据自动学习得到。超参数的选择对于模型的性能至关重要,因此在进行深度学习实验时,超参数调优通常是一个重要的步骤。常见的超参数包括:

  • model.add()

    • neurons(隐含层神经元数量)

    • init_mode(初始权重方法)

    • activation(激活函数)

    • dropout(丢弃率)

  • model.compile()

    • loss(损失函数)

    • optimizer(优化器)

      • learning rate(学习率)

      • momentum(动量)

      • weight decay(权重衰减系数)

  • model.fit()

    • batch size(批量大小)

    • epochs(迭代次数)

           一般来说,可以通过手动调优、网格搜索(Grid Search)、随机搜索(Random Search)、自动调参算法方式进行超参数调优。损失函数是用于衡量模型所作出的预测离真实值(Ground Truth)之间的偏离程度。通常,我们都会用一种优化算法(优化器)最小化目标函数,比如常用的算法便是“梯度下降法”(Gradient Descent)。本文采用网格搜索选择优化器。

    二、实现过程

    2.1 准备数据

    dataset:

    dataset = pd.read_csv("data.csv", header=None)
    dataset = pd.DataFrame(dataset)
    print(dataset)

    2.2 数据划分

    # 切分数据为输入 X 和输出 Y
    X = dataset.iloc[:,0:8]
    Y = dataset.iloc[:,8]
    # 为了复现,设置随机种子
    seed = 7
    np.random.seed(seed)
    random.set_seed(seed)

    2.3 创建模型

    需要定义个网格的架构函数create_model

    def create_model():
        # 创建模型
        model = Sequential()
        model.add(Dense(50, input_shape=(8, ), kernel_initializer='uniform', activation='relu'))
        model.add(Dropout(0.05))
        model.add(Dense(1, kernel_initializer='uniform', activation='sigmoid'))
        # 编译模型
        model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
        return model
    model = KerasClassifier(model=create_model, epochs=100, batch_size=80, verbose=0)

    这里使用了scikeras库的KerasClassifier类来定义一个分类器,这里由于KerasClassifier有定义优化器的参数optimizer,不需要自定义一个表示丢优化器的参数。

    2.4 定义网格搜索参数

    param_grid = {'optimizer': ['SGD', 'RMSprop', 'Adagrad', 'Adadelta', 'Adam', 'Adamax', 'Nadam']}

    param_grid是一个字典,key是超参数名称,这里的名称必须要在KerasClassifier这个对象里面存在而且参数名要一致。value是key可取的值,也就是要尝试的方案。

    2.5 进行参数搜索

    from sklearn.model_selection import GridSearchCV
    grid = GridSearchCV(estimator=model,  param_grid=param_grid)
    grid_result = grid.fit(X, Y)

    使用sklearn里面的GridSearchCV类进行参数搜索,传入模型和网格参数。

    2.6 总结搜索结果

    print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))
    means = grid_result.cv_results_['mean_test_score']
    stds = grid_result.cv_results_['std_test_score']
    params = grid_result.cv_results_['params']
    for mean, stdev, param in zip(means, stds, params):
        print("%f (%f) with: %r" % (mean, stdev, param))

    结果:

    经过网格搜索,优化器的最优选择是Nadm。

    作者简介:

    读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。

转载请注明来自码农世界,本文标题:《【Python深度学习系列】网格搜索神经网络超参数:优化器(案例+源码)》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,70人围观)参与讨论

还没有评论,来说两句吧...

Top