web-dev-qa-db-ja.com

Keras:テンソルボードに学習率を出力する方法

学習率を減衰させるコールバックを追加します。

 keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=100, 
                                   verbose=0, mode='auto',epsilon=0.00002, cooldown=20, min_lr=0)

ここに私のテンソルボードコールバックがあります:

keras.callbacks.TensorBoard(log_dir='./graph/rank{}'.format(hvd.rank()), histogram_freq=10, batch_size=FLAGS.batch_size,
                            write_graph=True, write_grads=True, write_images=False)

トレーニング中にそれが実行されたことを確認したいので、tensorbaordに学習率を出力したいのですが、どこに設定できるかわかりません。

オプティマイザAPIもチェックしましたが、うまくいきませんでした。

keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

では、どのようにして学習率をtensorboadに出力できますか?

16
scott huang

Kerasの作成者によるとproperの方法はTensorBoardコールバックをサブクラス化することです:

from keras import backend as K
from keras.callbacks import TensorBoard

class LRTensorBoard(TensorBoard):
    def __init__(self, log_dir, **kwargs):  # add other arguments to __init__ if you need
        super().__init__(log_dir=log_dir, **kwargs)

    def on_Epoch_end(self, Epoch, logs=None):
        logs = logs or {}
        logs.update({'lr': K.eval(self.model.optimizer.lr)})
        super().on_Epoch_end(Epoch, logs)

次に、callbacks引数の一部としてmodel.fitに渡します(クレジット Finncent Price ):

model.fit(x=..., y=..., callbacks=[LRTensorBoard(log_dir="/tmp/tb_log")])
23
alkamid

TensorBoard Callbackの代わりに、オプティマイザのコードを2回指定しました。とにかく、TensorBoardに学習率を表示する方法が見つかりませんでした。トレーニングが終了した後、Historyオブジェクトからデータを取得してプロットします。

nb_Epoch = len(history1.history['loss'])
learning_rate=history1.history['lr']
xc=range(nb_Epoch)
plt.figure(3,figsize=(7,5))
plt.plot(xc,learning_rate)
plt.xlabel('num of Epochs')
plt.ylabel('learning rate')
plt.title('Learning rate')
plt.grid(True)
plt.style.use(['seaborn-ticks'])

チャートは次のようになります。 LR plot

申し訳ありませんが、それは正確にはあなたが尋ねていることではありませんが、おそらく役立つでしょう。

1
class XTensorBoard(TensorBoard):
    def on_Epoch_begin(self, Epoch, logs=None):
        # get values
        lr = float(K.get_value(self.model.optimizer.lr))
        decay = float(K.get_value(self.model.optimizer.decay))
        # computer lr
        lr = lr * (1. / (1 + decay * Epoch))
        K.set_value(self.model.optimizer.lr, lr)

    def on_Epoch_end(self, Epoch, logs=None):
        logs = logs or {}
        logs['lr'] = K.get_value(self.model.optimizer.lr)
        super().on_Epoch_end(Epoch, logs)

callbacks_list = [XTensorBoard('./logs')]
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=32, verbose=2, callbacks=callbacks_list)

テンソルボードのlr曲線

1
user140713