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

使用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])