【问题标题】:How to pick the best learning rate and optimizer using LearningRateScheduler如何使用 LearningRateScheduler 选择最佳学习率和优化器
【发布时间】:2021-02-16 18:11:40
【问题描述】:

我从 Coursera 课程中知道 LearningRateScheduler,但以相同方式复制它会导致模型性能不佳。也许是由于我设置的范围。来自 Keras 网站的说明是有限的。


def duo_LSTM_model(X_train, y_train, X_test,y_test,num_classes,batch_size=68,units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2 ):

    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
    model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout,return_sequences=True)))
    model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
    model.add(Dense(num_classes, activation='softmax'))

    adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
    RMSopt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
    SGDopt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0.1, nesterov=False)


    lr_schedule = tf.keras.callbacks.LearningRateScheduler(
    lambda epoch: 1e-8 * 10**(epoch / 20))

    model.compile(loss='binary_crossentropy',
                  optimizer=adamopt,
                  metrics=['accuracy'])

    history = model.fit(X_train, y_train,
                        batch_size=batch_size,
                        epochs=epochs,
                        validation_data=(X_test, y_test),
                        verbose=1,
                        callbacks=[lr_schedule])

    score, acc = model.evaluate(X_test, y_test,
                                batch_size=batch_size)

    yhat = model.predict(X_test)

    return history, that

我有两个问题。

  1. 1e-8 * 10**(epoch / 20) 是如何工作的?

  2. 我们应该如何选择 3 种不同优化器的范围?

【问题讨论】:

    标签: python tensorflow machine-learning


    【解决方案1】:

    在回答您帖子中的两个问题之前,让我们先澄清一下LearningRateScheduler 不是为了选择“最佳”学习率。

    It is an alternative to using a fixed learning rate is to instead vary the learning rate over the training process.

    我认为您真正想问的是“如何确定最佳初始学习率”。如果我是正确的,那么您需要了解超参数调整。


    回答问题 1:

    为了回答1e-8 * 10**(epoch / 20)的工作原理,让我们创建一个简单的回归任务

    import tensorflow as tf 
    import tensorflow.keras.backend as K
    from sklearn.model_selection import train_test_split
    from tensorflow.keras.models import Model
    from tensorflow.keras.layers import Input,Dense
    
    x = np.linspace(0,100,1000)
    y = np.sin(x) + x**2
    
    x_train,x_val,y_train,y_val = train_test_split(x,y,test_size=0.3)
    
    input_x = Input(shape=(1,))
    y = Dense(10,activation='relu')(input_x)
    y = Dense(1,activation='relu')(y)
    model = Model(inputs=input_x,outputs=y)
    
    adamopt = tf.keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
    
    def schedule_func(epoch):
        print()
        print('calling lr_scheduler on epoch %i' % epoch)
        print('current learning rate %.8f' % K.eval(model.optimizer.lr))
        print('returned value %.8f' % (1e-8 * 10**(epoch / 20)))
        return 1e-8 * 10**(epoch / 20)
        
    lr_schedule = tf.keras.callbacks.LearningRateScheduler(schedule_func)
    
    model.compile(loss='mse',optimizer=adamopt,metrics=['mae'])
    history = model.fit(x_train,y_train,
                        batch_size=8,
                        epochs=10,
                        validation_data=(x_val, y_val),
                        verbose=1,
                        callbacks=[lr_schedule])
    

    在上面的脚本中,我没有使用lambda 函数,而是编写了一个函数schedule_func。运行脚本,你会看到1e-8 * 10**(epoch / 20)只是为每个epoch设置了学习率,并且学习率在增加。

    第二季度的答案:

    例如有一堆不错的帖子

    1. Setting the learning rate of your neural network.
    2. Choosing a learning rate

    【讨论】:

    • 为了测试最佳学习率。我是否应该将 epoch 设置为 160,以便所有三种优化器的范围从 1e-8 到 1,然后决定选择哪个?
    • @Leo 我想你误解了lr_schedule,它不是为了找到最佳学习率,而是为了在训练过程中调整学习率(比如训练100个epoch)。如果你想找到完全不同的最佳学习率,谷歌超参数优化。
    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2021-06-21
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    相关资源
    最近更新 更多