kerasのLearningRateSchedulerで学習途中に学習率を調整する

機械学習や深層学習において、より効率的にモデルを学習させるテクニックとして、
学習の進捗に応じて、学習率を変更するというものがあります。

kerasでは、これを手軽に実行するために LearningRateScheduler というコールバックが用意されています。
これに、 エポックのインデックスを受け取って学習率を返す関数を渡して、
それをcallbackに設定しておくと実現できます。

だいたい次のイメージで使えます。
例によって、モデルはすでに構築されているものとします。
(下のコードで動かしてるモデルはこのブログの CNNで手書き数字文字の分類 の記事からコピーして持ってきました。)


# 学習率を返す関数を用意する
def lr_schedul(epoch):
    x = 0.002
    if epoch >= 3:
        x = 0.001
    if epoch >= 5:
        x = 0.0005
    return x


lr_decay = LearningRateScheduler(
    lr_schedul,
    # verbose=1で、更新メッセージ表示。0の場合は表示しない
    verbose=1,
)

history = model.fit(X_train, y_train,
                    batch_size=128,
                    epochs=10,
                    verbose=2,
                    validation_data=(X_test, y_test),
                    callbacks=[lr_decay],
                    )

# 以下出力
"""
Train on 60000 samples, validate on 10000 samples
Epoch 1/10

Epoch 00001: LearningRateScheduler setting learning rate to 0.002.
 - 13s - loss: 0.4354 - acc: 0.8625 - val_loss: 0.0707 - val_acc: 0.9762
Epoch 2/10

Epoch 00002: LearningRateScheduler setting learning rate to 0.002.
 - 12s - loss: 0.1748 - acc: 0.9476 - val_loss: 0.0534 - val_acc: 0.9823
Epoch 3/10

Epoch 00003: LearningRateScheduler setting learning rate to 0.002.
 - 12s - loss: 0.1376 - acc: 0.9590 - val_loss: 0.0387 - val_acc: 0.9872
Epoch 4/10

Epoch 00004: LearningRateScheduler setting learning rate to 0.001.
 - 14s - loss: 0.1105 - acc: 0.9675 - val_loss: 0.0332 - val_acc: 0.9882
Epoch 5/10

Epoch 00005: LearningRateScheduler setting learning rate to 0.001.
 - 15s - loss: 0.1041 - acc: 0.9694 - val_loss: 0.0311 - val_acc: 0.9902
Epoch 6/10

Epoch 00006: LearningRateScheduler setting learning rate to 0.0005.
 - 15s - loss: 0.0960 - acc: 0.9725 - val_loss: 0.0293 - val_acc: 0.9899
Epoch 7/10

Epoch 00007: LearningRateScheduler setting learning rate to 0.0005.
 - 14s - loss: 0.0889 - acc: 0.9735 - val_loss: 0.0275 - val_acc: 0.9899
Epoch 8/10

Epoch 00008: LearningRateScheduler setting learning rate to 0.0005.
 - 18s - loss: 0.0880 - acc: 0.9747 - val_loss: 0.0273 - val_acc: 0.9899
Epoch 9/10

Epoch 00009: LearningRateScheduler setting learning rate to 0.0005.
 - 14s - loss: 0.0856 - acc: 0.9746 - val_loss: 0.0274 - val_acc: 0.9905
Epoch 10/10

Epoch 00010: LearningRateScheduler setting learning rate to 0.0005.
 - 13s - loss: 0.0811 - acc: 0.9764 - val_loss: 0.0264 - val_acc: 0.9906
"""

今回はお試しで学習率が変わっていることを見たかったので、 verbose=1 を指定して、LearningRateSchedulerにも
ログを出力させました。
最初の 0.002 から、 0.0005へと、学習率が変わっていっていることがわかります。

ただ、少し煩わしいので、普段の利用では verbose=0 (デフォルトなので未指定でも可)がおすすめです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です