机器学习实战第二版---第六节:神经网络调参

对于解决梯度爆炸和梯度消失

使用Glorot和Bengio在它们的论文中提出了一种能显著缓解不稳定梯度
问题的方法。使用keras的代码,可以达到以上两个效果并且加速!,图片显示的对于不同激活函数选择的初始化参数不同

1.使用不同的激活函数,激活函数简要对比看代码
2.使用BN解决
3.在RNN中,使用反向传播期间裁剪梯度,使它们永远不会超过某个阈值。这称为梯度裁剪。这种技术最常用于循环神经网络,因为在RNN中难以使用批量归一化,其他模型用BN就够了,BN永远的神

# 缓解梯度不稳定的问题,kernel_initializer='he_nomal'----可以加速
'''
并且对于不同的激活函数针对他们的方差使用fanavg还是fanin
'''
Dense(30,activation='relu',kernel_initializer='he_nomal')

在这里插入图片描述

参数调优主要从:1.改变一次项
2.改变2次项

# 动量优化
'''
在每次迭代时,它都会从动量向量m(乘以学习率η)中减去局部梯度,并通过添加该动量向量来
更新权重(见公式11-4)。换句话说,梯度是用于加速度而不是速度。为了模拟某种摩擦机制并防止动量变得过大,该算法引入了一个新的超
参数β,称为动量,必须将其设置为0(高摩擦)和1(无摩擦)之间。典型的动量值为0.9

'''
# 缺点是引入了另外一个变量,但是总体速度快
optimizer = keras.optimizers.SGD(lr=0.001,momentum=0.9)

#Nesterov加速梯度----比动量法更快

optimizer = keras.optimizers.SGD(lr=0.001,momentum=0.9,nesterov=True)


#AdaGrad--对历史数据的修正,叫做自适应学习率,但是他不适合训练深度学习神经网络


# RMSProp--为了解决AdaGrad下降太快不能收敛到全局最优解的风险
optimizer = keras.optimizers.RMSprop(lr=0.001,rho=0.9)

# Adam自适应矩阵==动量+RMSPro
optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)

'''
使用所有的优化算法,都会产生密集模型==大多数参数都是非零的
如果你运行时候需要一个非常快的模型或者占更少的内存,会选择使用一个稀疏模型
'''

#学习率调整--幂调度 调整decay:decay是s(学习率除以多个数字单位所需要的步数)的倒数
optimizer = keras.optimizers.SGD(lr=0.01,decay=1e-4)


# 指数调度
def exponential_decay_fn(epoch):
 return 0.01 * 0.1**(epoch / 20)


def exponential_decay(lr0, s):

    def exponential_decay_fn(epoch):
        return lr0 * 0.1**(epoch / s)

    return exponential_decay_fn

exponential_decay_fn = exponential_decay(lr0=0.01, s=20)


lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)
history = model.fit(X_train_scaled, y_train, [...], callbacks=[lr_scheduler])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值