在神经网络中,除了权重和偏置等参数外,超参数也是一个很常见且重要的参数,这里的超参数是指,比如各层的神经元数量、batch大小、参数更新时的学习率或权值衰减等,如果这些超参数没有设置一个合适的值,模型的性能就会很差。
        那如何设置好这个超参数呢?一般都是不断地试错,在这个过程中尽可能高效的找到这个参数。需要注意的是,在评估这个超参数性能的时候,不能使用测试数据来评估,因为使用测试数据就会使得这个超参数对测试数据过拟合,那可能就会导致泛化能力低,这个时候我们一般采取专用的确认数据,一般称为验证数据(validation data),最后才使用测试数据来确认泛化能力。
        验证数据,我们可以使用np.random.shuffle来随机选取打乱的数据作为验证数据,下面的方法使用了permutation,也是打乱顺序,区别在于permutation不会更改原来的数组,是拷贝了一份再进行洗牌的,而shuffle会修改原来的值,需看情况来使用。

def shuffle_dataset(x,t):'''打乱数据集的训练数据和测试数据permutation不会修改原数组,shuffle将会修改x,t'''p=np.random.permutation(x.shape[0])x=x[p]t=t[p]return x,t

超参数是在设定一个大致的范围里面进行随机采样,然后用这个值去评估识别的精度。重复操作,我们观察识别精度的结果,逐步确定超参数的合适范围。超参数的随机采样代码:

weight_decay=10**np.random.uniform(-8, -4)#权值衰减的范围在10的-8次方到-4次方之间
lr=10**np.random.uniform(-6, -2)#学习率的范围在10的-6次方到-2次方之间

下面还是基于MNIST数据集来观察验证数据和训练数据的识别精度的比较

import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net import MultiLayerNet
from common.trainer import Trainerdef shuffle_dataset(x,t):'''打乱数据集的训练数据和测试数据permutation不会修改原数组,shuffle将会修改x,t'''p=np.random.permutation(x.shape[0])x=x[p]t=t[p]return x,t(x_train,t_train),(x_test,t_test)=load_mnist(normalize=True)
x_train=x_train[:500]#(500,784)
t_train=t_train[:500]#验证数据(示例为选取训练数据中20%的数据)
validation_rate=0.2
validation_num=int(x_train.shape[0]*validation_rate)
x_train,t_train=shuffle_dataset(x_train,t_train)
x_val=x_train[:validation_num]#(100, 784)
t_val=t_train[:validation_num]#(100,)
x_train=x_train[validation_num:]#(400, 784)
t_train=t_train[validation_num:]#(400,)
#print(x_val.shape,t_val.shape,x_train.shape,t_train.shape)def _train(weight_decay,lr,epochs=50):network=MultiLayerNet(inputSize=784,hiddenSizeList=[100,100,100,100,100,100],outputSize=10,weight_decay_lambda=weight_decay)trainer=Trainer(network,x_train,t_train,x_val,t_val,epochs=epochs,mini_batch_size=100,optimizer='SGD',optimizer_param={'lr':lr},verbose=False)trainer.train()return trainer.test_acc_list,trainer.train_acc_list#超参数的随机搜索
results_val={}
results_train={}
for _ in range(50):#选定在这个范围里面搜索weight_decay=10**np.random.uniform(-8,-4)lr=10**np.random.uniform(-6,-2)val_acc_list,train_acc_list=_train(weight_decay,lr)print('验证精度:'+str(val_acc_list[-1])+' | 学习率:'+str(lr)+',权值衰减:'+str(weight_decay))key='lr:'+str(lr)+',w_decay:'+str(weight_decay)results_val[key]=val_acc_list#学习率和权值组合成keyresults_train[key]=train_acc_list
#画图
print('----最优超参数降序排列的结果---')
i=0
for key,val_acc_list in sorted(results_val.items(),key=lambda x:x[1][-1],reverse=True):print('最优验证精度:'+str(val_acc_list[-1])+' | '+key)plt.subplot(3,4,i+1)plt.title('Best-'+str(i+1))plt.ylim(0.0,1.0)if i%4:plt.yticks([])plt.xticks([])x=np.arange(len(val_acc_list))plt.plot(x,val_acc_list)plt.plot(x,results_train[key],'--')i+=1if i>=12:break
plt.show()

从打印的数据可以看出,学习率在0.001~0.01以及权值衰减系数在10的-8次方~10的-6次方之间,学习进行的顺利,同样的重复这个操作,我们就可以逐步减小这个寻找范围,直到找到非常合适的超参数。
由此可见,参数的重要性不言而喻,对寻找最优参数的方法感兴趣的伙伴们可以参阅:
神经网络技巧篇之寻找最优参数的方法https://blog.csdn.net/weixin_41896770/article/details/121375510神经网络技巧篇之寻找最优参数的方法【续】https://blog.csdn.net/weixin_41896770/article/details/121419590

神经网络技巧篇之寻找最优超参数相关推荐

  1. 神经网络技巧篇之寻找最优参数的方法

    在神经网络的学习中,其中一个重要目的就是找到使损失函数的值尽可能小的参数,为了找到这个最优参数,我们使用梯度(导数)作为线索,沿着梯度方向来更新参数,并重复这个步骤,从而逐渐靠近最优参数,这个过程叫做 ...

  2. 神经网络技巧篇之寻找最优参数的方法【续】

    上一篇文章介绍了四种寻找最优参数的方法,这次做一个补充,对其中两种方法(Momentum和AdaGrad)做一些改进,让参数的更新收敛更快速 Nesterov 是对Momentum动量SGD的一个改进 ...

  3. sklearn学习-SVM例程总结3(网格搜索+交叉验证——寻找最优超参数)

    网格搜索+交叉验证--寻找最优超参数 1548962898@qq.com 连续三天写了三篇博客,主要是为了尽快了解机器学习中算法以外的重要知识,这些知识可以迁移到每一个算法中,或许说,这些知识是学习并 ...

  4. 单个GPU无法训练GPT-3,但有了这个,你能调优超参数了

    视学算法报道 编辑:陈萍.小舟 模型越大,超参数(HP)调优成本越高,微软联合 OpenAI 提出 HP 调优新范式,单个 GPU 上就可以调优 GPT-3 超参数. 伟大的科学成就不能仅靠反复试验取 ...

  5. 网格搜索算法可以用于在给定的超参数空间中寻找最佳的超参数组合。具体步骤如下:

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.网格搜索算法是什么? 二.使用步骤 1.确定超参数空间: 2.生成网格: 3.初始化验证方案: 4.训练和评估模型: 5 ...

  6. python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索

    python中算法(sklearn)的最优超参数寻优:skopt贝叶斯搜索 Jeff Dean在ICML 2019上进行了有关AutoML的演讲,并将自动化分为4个级别 手动构造预测变量,不引入学习的 ...

  7. 机器学习、超参数、最优超参数、网格搜索、随机搜索、贝叶斯优化、Google Vizier、Adviser

    机器学习.超参数.最优超参数.网格搜索.随机搜索.贝叶斯优化.Google Vizier.Adviser 最优超参数 选择超参数的问题在于,没有放之四海而皆准的超参数. 因此,对于每个新数据集,我们必 ...

  8. Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码

    Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码 目录

  9. 2-3 Coursera吴恩达《改善深度神经网络》第三周课程笔记-超参数调试、Batch正则化和编程框架

    上节课2-2 Coursera吴恩达<改善深度神经网络>第二周课程笔记-优化算法我们主要介绍了深度神经网络的优化算法.包括对原始数据集进行分割,使用mini-batch 梯度下降(mini ...

最新文章

  1. 利用BP神经网络教计算机进行非线函数拟合
  2. 微软某程序员吐槽:如果毕业去字节,现在总包150万!如今一年才50万,看见字节的人都抬不起头!...
  3. 60岁代码匠的几篇小作文,解决了大多数程序的迷茫(下)
  4. fpm制作mysql rpm包_fpm制做mysql-5.6.33 rpm包
  5. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...
  6. Java调用.NET的WCF
  7. oracle的隐式游标有哪些,Oracle隐式游标小例子
  8. Class Imbalance Problem
  9. flask接口mysql开发例子,使用Flask开发简单接口3–引入MySQL
  10. 计算机在车联网的应用,刘小洋, 伍民友. 车联网: 物联网在城市交通网络中的应用[J]. 计算机应用, 2012, 32(4): 900-904....
  11. 电磁场仿真原理——5. 有限元法(FEM)
  12. 原型工具MockingBot 墨刀
  13. <自由之路>LeetCode每日一题(DFS + 记忆化搜索)
  14. 转载:开源license总结
  15. 直系同源基因分析(orthofinder方法)
  16. 利用python写出德州扑克小游戏
  17. Codeforces Round #701 D. Multiples and Power Differences LCM性质
  18. 四个漂亮CSS样式表
  19. T-SQL Recipes之Database Backups
  20. UR机器人TCP通讯示例 详细例程,手把手教会你

热门文章

  1. (四)Locust no-web模式
  2. 【经典】Noip动态规划
  3. NOI 08 石头剪刀布
  4. Let's go home
  5. ‘MIX_INIT_MP3’ was not declared in this scope,这是什么情况?
  6. ES6新特性_ES6函数参数的默认值设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记011
  7. STM32工作笔记006---常见硬件介绍-以及常见术语--随时更新
  8. TensorFlow工作笔记002---Centos7.3下TensorFlow使用python创建计算图案例
  9. Linux工作笔记035---设置连接Linux Centos 超时连接时间_空闲的等待时间 -bash: TMOUT: readonly variable
  10. 分布式工作笔记001---分布式系统中CAP 定理的含义