您当前的位置:首页 > IT编程 > 超参数
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet |

Keras的回调函数ReduceLROnPlateau 训练过程优化学习率

51自学网 2020-12-04 11:37:16
  超参数

Keras的回调函数ReduceLROnPlateau 训练过程优化学习率

目的:定义学习率之后,经过一定epoch迭代之后,模型效果不再提升,该学习率可能已经不再适应该模型。需要在训练过程中缩小学习率,进而提升模型。如何在训练过程中缩小学习率呢?我们可以使用keras中的回调函数ReduceLROnPlateau。与EarlyStopping配合使用,会非常方便。

为什么初始化一个非常小的学习率呢?因为初始的学习率过小,会需要非常多次的迭代才能使模型达到最优状态,训练缓慢。如果训练过程中不断缩小学习率,可以快速又精确的获得最优模型。


 
  1.  
    monitor:监测的值,可以是accuracy,val_loss,val_accuracy
  2.  
    factor:缩放学习率的值,学习率将以lr = lr*factor的形式被减少
  3.  
    patience:当patience个epoch过去而模型性能不提升时,学习率减少的动作会被触发
  4.  
    mode:‘auto’,‘min’,‘max’之一 默认‘auto’就行
  5.  
    epsilon:阈值,用来确定是否进入检测值的“平原区”
  6.  
    cooldown:学习率减少后,会经过cooldown个epoch才重新进行正常操作
  7.  
    min_lr:学习率最小值,能缩小到的下限
  8.  
     
  9.  
    Reduce=ReduceLROnPlateau(monitor='val_accuracy',
  10.  
    factor=0.1,
  11.  
    patience=2,
  12.  
    verbose=1,
  13.  
    mode='auto',
  14.  
    epsilon=0.0001,
  15.  
    cooldown=0,
  16.  
    min_lr=0)

使用手写数字mnist作演示,当只设置EarlyStopping的时候,代码及效果如下:


 
  1.  
    # -*- coding: utf-8 -*-
  2.  
    import numpy #导入数据库
  3.  
    from keras.datasets import mnist
  4.  
    from keras.models import Sequential
  5.  
    from keras.layers import Dense
  6.  
    from keras.layers import Dropout
  7.  
    from keras.utils import np_utils
  8.  
    from keras.callbacks import EarlyStopping
  9.  
    from keras import optimizers
  10.  
    from keras.callbacks import ReduceLROnPlateau
  11.  
     
  12.  
    seed = 7 #设置随机种子
  13.  
    numpy.random.seed(seed)
  14.  
     
  15.  
    (X_train, y_train), (X_test, y_test) = mnist.load_data(path='mnist.npz') #加载数据
  16.  
     
  17.  
    num_pixels = X_train.shape[1] * X_train.shape[2]
  18.  
    X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
  19.  
    X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
  20.  
    #数据集是3维的向量(instance length,width,height).对于多层感知机,模型的输入是二维的向量,因此这
  21.  
    #里需要将数据集reshape,即将28*28的向量转成784长度的数组。可以用numpy的reshape函数轻松实现这个过
  22.  
    #程。
  23.  
     
  24.  
    #给定的像素的灰度值在0-255,为了使模型的训练效果更好,通常将数值归一化映射到0-1。
  25.  
    X_train = X_train / 255
  26.  
    X_test = X_test / 255
  27.  
     
  28.  
    #最后,模型的输出是对每个类别的打分预测,对于分类结果从0-9的每个类别都有一个预测分值,表示将模型
  29.  
    #输入预测为该类的概率大小,概率越大可信度越高。由于原始的数据标签是0-9的整数值,通常将其表示成#0ne-hot向量。如第一个训练数据的标签为5,one-hot表示为[0,0,0,0,0,1,0,0,0,0]。
  30.  
     
  31.  
    y_train = np_utils.to_categorical(y_train)
  32.  
    y_test = np_utils.to_categorical(y_test)
  33.  
    num_classes = y_test.shape[1]
  34.  
     
  35.  
    #现在需要做得就是搭建神经网络模型了,创建一个函数,建立含有一个隐层的神经网络。
  36.  
    # define baseline model
  37.  
    def baseline_model():
  38.  
    # create model
  39.  
    model = Sequential()
  40.  
    model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
  41.  
    model.add(Dropout(rate=0.5))
  42.  
    model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
  43.  
    # Compile model
  44.  
    adam=optimizers.Adam(learning_rate=0.01)
  45.  
    model.compile(loss='categorical_crossentropy',
  46.  
    optimizer=adam, metrics=['accuracy'])
  47.  
     
  48.  
    return model
  49.  
     
  50.  
    model=baseline_model()
  51.  
    EarlyStop=EarlyStopping(monitor='val_accuracy',
  52.  
    patience=2,verbose=1, mode='auto')
  53.  
    #注释掉
  54.  
    #Reduce=ReduceLROnPlateau(monitor='val_accuracy',
  55.  
    # factor=0.1,
  56.  
    # patience=2,
  57.  
    # verbose=1,
  58.  
    # mode='auto',
  59.  
    # epsilon=0.0001,
  60.  
    # cooldown=0,
  61.  
    # min_lr=0)
  62.  
    # Fit the model
  63.  
    history=model.fit(X_train, y_train, validation_data=(X_test, y_test),
  64.  
    epochs=30, batch_size=200,
  65.  
    callbacks=[EarlyStop],verbose=2)
  66.  
    # Final evaluation of the model
  67.  
    scores = model.evaluate(X_test, y_test, verbose=1)
  68.  
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))

效果:训练到5轮就触发早停了。

当使用ReduceLROnPlateau在训练过程中优化减小learning_rate:


 
  1.  
    # -*- coding: utf-8 -*-
  2.  
    import numpy #导入数据库
  3.  
    from keras.datasets import mnist
  4.  
    from keras.models import Sequential
  5.  
    from keras.layers import Dense
  6.  
    from keras.layers import Dropout
  7.  
    from keras.utils import np_utils
  8.  
    from keras.callbacks import EarlyStopping
  9.  
    from keras import optimizers
  10.  
    from keras.callbacks import ReduceLROnPlateau
  11.  
     
  12.  
    seed = 7 #设置随机种子
  13.  
    numpy.random.seed(seed)
  14.  
     
  15.  
    (X_train, y_train), (X_test, y_test) = mnist.load_data(path='mnist.npz') #加载数据
  16.  
     
  17.  
    num_pixels = X_train.shape[1] * X_train.shape[2]
  18.  
    X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32')
  19.  
    X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32')
  20.  
    #数据集是3维的向量(instance length,width,height).对于多层感知机,模型的输入是二维的向量,因此这
  21.  
    #里需要将数据集reshape,即将28*28的向量转成784长度的数组。可以用numpy的reshape函数轻松实现这个过
  22.  
    #程。
  23.  
     
  24.  
    #给定的像素的灰度值在0-255,为了使模型的训练效果更好,通常将数值归一化映射到0-1。
  25.  
    X_train = X_train / 255
  26.  
    X_test = X_test / 255
  27.  
     
  28.  
    #最后,模型的输出是对每个类别的打分预测,对于分类结果从0-9的每个类别都有一个预测分值,表示将模型
  29.  
    #输入预测为该类的概率大小,概率越大可信度越高。由于原始的数据标签是0-9的整数值,通常将其表示成#0ne-hot向量。如第一个训练数据的标签为5,one-hot表示为[0,0,0,0,0,1,0,0,0,0]。
  30.  
     
  31.  
    y_train = np_utils.to_categorical(y_train)
  32.  
    y_test = np_utils.to_categorical(y_test)
  33.  
    num_classes = y_test.shape[1]
  34.  
     
  35.  
    #现在需要做得就是搭建神经网络模型了,创建一个函数,建立含有一个隐层的神经网络。
  36.  
    # define baseline model
  37.  
    def baseline_model():
  38.  
    # create model
  39.  
    model = Sequential()
  40.  
    model.add(Dense(num_pixels, input_dim=num_pixels, kernel_initializer='normal', activation='relu'))
  41.  
    model.add(Dropout(rate=0.5))
  42.  
    model.add(Dense(num_classes, kernel_initializer='normal', activation='softmax'))
  43.  
    # Compile model
  44.  
    adam=optimizers.Adam(learning_rate=0.01)
  45.  
    model.compile(loss='categorical_crossentropy',
  46.  
    optimizer=adam, metrics=['accuracy'])
  47.  
     
  48.  
    return model
  49.  
     
  50.  
    model=baseline_model()
  51.  
    EarlyStop=EarlyStopping(monitor='val_accuracy',
  52.  
    patience=2,verbose=1, mode='auto')
  53.  
    #减小学习率
  54.  
    Reduce=ReduceLROnPlateau(monitor='val_accuracy',
  55.  
    factor=0.1,
  56.  
    patience=1,
  57.  
    verbose=1,
  58.  
    mode='auto',
  59.  
    epsilon=0.0001,
  60.  
    cooldown=0,
  61.  
    min_lr=0)
  62.  
    # Fit the model
  63.  
    history=model.fit(X_train, y_train, validation_data=(X_test, y_test),
  64.  
    epochs=30, batch_size=200,
  65.  
    callbacks=[EarlyStop,Reduce],verbose=2)
  66.  
    # Final evaluation of the model
  67.  
    scores = model.evaluate(X_test, y_test, verbose=1)
  68.  
    print("Baseline Error: %.2f%%" % (100-scores[1]*100))
  69.  
     

得到的val_accuracy有所提升,训练轮数会增加。不会过早触发EarlyStooping。当然EarlyStopping的patience要比ReduceLROnPlateau的patience大一些才会有效果。


神经网络在小样本数据集上非常容易过拟合
神经网络的超参数分类如何选择神经网络的超参数
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1