bird0401 / Kaggle_Happywhale

kaggle competition
0 stars 0 forks source link

LearningRateSchedulerのデファクトスタンダート的なのがあれば #17

Closed bird0401 closed 2 years ago

bird0401 commented 2 years ago

https://www.kaggle.com/aikhmelnytskyy/happywhale-arcface-baseline-eff7-tpu-768-inference で学習率を動的に変動させている。

# 学習率を動的に変動させる
def get_lr_callback(plot=False):
    lr_start   = 0.000001
    lr_max     = 0.000005 * config.BATCH_SIZE  #学習率はバッチサイズに比例するように増加させる
    lr_min     = 0.000001
    lr_ramp_ep = 4 #
    lr_sus_ep  = 0
    lr_decay   = 0.9

    def lrfn(epoch):
        if config.RESUME:
            epoch = epoch + config.RESUME_EPOCH
        if epoch < lr_ramp_ep:
            lr = (lr_max - lr_start) / lr_ramp_ep * epoch + lr_start

        elif epoch < lr_ramp_ep + lr_sus_ep:
            lr = lr_max

        else:
            lr = (lr_max - lr_min) * lr_decay**(epoch - lr_ramp_ep - lr_sus_ep) + lr_min

        return lr

    if plot:
        epochs = list(range(config.EPOCHS))
        learning_rates = [lrfn(x) for x in epochs]
        plt.scatter(epochs,learning_rates)
        plt.show()

    lr_callback = tf.keras.callbacks.LearningRateScheduler(lrfn, verbose=False)
    return lr_callback

get_lr_callback(plot=True)

これ以外に良い方法があればそれを用いる。

bird0401 commented 2 years ago

他の上位解法を見ていても上記の方法をしている場合が多い。変える必要はそこまでなさそう。