keras 循环神经网络,keras Python

  keras 循环神经网络,keras Python

  本文主要介绍python神经网络Keras常用学习速率的衰减总结。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010前言为什么要调控学习率下降?总结1,分级下降2,指数下降3,余弦退火衰减4,余弦退火衰减更新版。

  

目录

 

  增加了文中余弦退火的下降模式。如图所示:

  学习率是深度学习很重要的一部分,好好学习吧!

  

前言

 

  在深度学习中,学习速率的调整非常重要。

  学习率有以下优点:

  1.加快学习速度。

  2.有助于跳出局部最优。

  但是有以下缺点:

  1.模型训练不收敛。

  2.只使用大的学习率很容易导致模型不准确。

  低学习率有以下优点:

  1.它有助于模型收敛和改进。

  2.提高模型精度。

  但是有以下缺点:

  1.无法跳出局部最优值。

  2.收敛慢。

  高学习率和低学习率的作用几乎相反。因此,我们可以通过适当调整学习率来最大程度地提高训练成绩。

  

为什么要调控学习率

 

  

下降方式汇总

 

  在Keras中,ReduceLROnPlateau函数常用来实现层次化约简。性下降意味着学习率会突然变成原来的1/2或者1/10。

  使用ReduceLROnPlateau,可以指定在某个指标没有继续降低后,学习率会突然降低到原来的1/2或者1/10,比如验证集的丢失,训练集的丢失。

  ReduceLROnPlateau的主要参数有:

  1.因子:某一指标不再继续降低后,学习率降低的速率。

  2.耐心:某个指标几次不继续下降后,学习率开始下降。

  # Import ReduceLROnPlateau

  从keras.callbacks导入ReduceLROnPlateau

  #定义ReduceLROnPlateau

  reduce _ lr=ReduceLROnPlateau(monitor= val _ loss ,factor=0.5,patience=2,verbose=1)

  #使用ReduceLROnPlateau

  model.fit(X_train,Y_train,callbacks=[reduce_lr])

  

1、阶层性下降

 

  在Keras中,我没有找到一个特别好的回调来直接实现指数下降,所以我用回调类实现了一个。

  指数下降是指学习率会随着指数函数下降。

  具体公式如下:

  1.learning_rate指的是当前的学习速率。

  2.learning_rate_base指的是基础学习率。

  3.decay_rate指的是衰减系数。

  效果如图所示:

  实现方式如下,通过回调实现,类似于ReduceLROnPlateau的普通调用方式:

  将numpy作为np导入

  将matplotlib.pyplot作为plt导入

  导入keras

  从keras导入后端作为K

  从keras.layers导入Flatten、Conv2D、Dropout、Input、Dense、MaxPooling2D

  从keras.models导入模型

  定义指数(global_epoch,

  学习率基础,

  衰变率,

  min_learn_rate=0

  ):

  学习率=学习率基础*采购订单

  w(decay_rate, global_epoch)

   learning_rate = max(learning_rate,min_learn_rate)

   return learning_rate

  class ExponentDecayScheduler(keras.callbacks.Callback):

   """

   继承Callback,实现对学习率的调度

   """

   def __init__(self,

   learning_rate_base,

   decay_rate,

   global_epoch_init=0,

   min_learn_rate=0,

   verbose=0):

   super(ExponentDecayScheduler, self).__init__()

   # 基础的学习率

   self.learning_rate_base = learning_rate_base

   # 全局初始化epoch

   self.global_epoch = global_epoch_init

   self.decay_rate = decay_rate

   # 参数显示

   self.verbose = verbose

   # learning_rates用于记录每次更新后的学习率,方便图形化观察

   self.min_learn_rate = min_learn_rate

   self.learning_rates = []

   def on_epoch_end(self, epochs ,logs=None):

   self.global_epoch = self.global_epoch + 1

   lr = K.get_value(self.model.optimizer.lr)

   self.learning_rates.append(lr)

   #更新学习率

   def on_epoch_begin(self, batch, logs=None):

   lr = exponent(global_epoch=self.global_epoch,

   learning_rate_base=self.learning_rate_base,

   decay_rate = self.decay_rate,

   min_learn_rate = self.min_learn_rate)

   K.set_value(self.model.optimizer.lr, lr)

   if self.verbose > 0:

   print(nBatch %05d: setting learning

   rate to %s. % (self.global_epoch + 1, lr))

  # 载入Mnist手写数据集

  mnist = keras.datasets.mnist

  (x_train, y_train), (x_test, y_test) = mnist.load_data()

  x_train, x_test = x_train / 255.0, x_test / 255.0

  x_train = np.expand_dims(x_train,-1)

  x_test = np.expand_dims(x_test,-1)

  #-----------------------------#

  # 创建模型

  #-----------------------------#

  inputs = Input([28,28,1])

  x = Conv2D(32, kernel_size= 5,padding = same,activation="relu")(inputs)

  x = MaxPooling2D(pool_size = 2, strides = 2, padding = same,)(x)

  x = Conv2D(64, kernel_size= 5,padding = same,activation="relu")(x)

  x = MaxPooling2D(pool_size = 2, strides = 2, padding = same,)(x)

  x = Flatten()(x)

  x = Dense(1024)(x)

  x = Dense(256)(x)

  out = Dense(10, activation=softmax)(x)

  model = Model(inputs,out)

  # 设定优化器,loss,计算准确率

  model.compile(optimizer=adam,

   loss=sparse_categorical_crossentropy,

   metrics=[accuracy])

  # 设置训练参数

  epochs = 10

  init_epoch = 0

  # 每一次训练使用多少个Batch

  batch_size = 31

  # 最大学习率

  learning_rate_base = 1e-3

  sample_count = len(x_train)

  # 学习率

  exponent_lr = ExponentDecayScheduler(learning_rate_base = learning_rate_base,

   global_epoch_init = init_epoch,

   decay_rate = 0.9,

   min_learn_rate = 1e-6

   )

  # 利用fit进行训练

  model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size,

   verbose=1, callbacks=[exponent_lr])

  plt.plot(exponent_lr.learning_rates)

  plt.xlabel(Step, fontsize=20)

  plt.ylabel(lr, fontsize=20)

  plt.axis([0, epochs, 0, learning_rate_base*1.1])

  plt.xticks(np.arange(0, epochs, 1))

  plt.grid()

  plt.title(lr decay with exponent, fontsize=20)

  plt.show()

  

  

 

  

3、余弦退火衰减

 

  余弦退火衰减法,学习率会先上升再下降,这是退火优化法的思想。(关于什么是退火算法可以百度。)

  上升的时候使用线性上升,下降的时候模拟cos函数下降。

  效果如图所示:

  

 

  余弦退火衰减有几个比较必要的参数:

  1、learning_rate_base:学习率最高值。

  2、warmup_learning_rate:最开始的学习率。

  3、warmup_steps:多少步长后到达顶峰值。

  实现方式如下,利用Callback实现,与普通的ReduceLROnPlateau调用方式类似:

  

import numpy as np

 

  

 

  

4、余弦退火衰减更新版

 

  论文当中的余弦退火衰减并非只上升下降一次,因此我重新写了一段代码用于实现多次上升下降:

  

 

  实现方式如下,利用Callback实现,与普通的ReduceLROnPlateau调用方式类似:

  

import numpy as np

 

  以上就是python神经网络Keras常用学习率衰减汇总的详细内容,更多关于Keras学习率衰减的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: