Как предоставить значение скорости обучения для tensorboard в keras

Я использую keras и хочу реализовать пользовательскую скорость обучения через keras.callbacks.LearningRateScheduler

Как я могу передать скорость обучения, чтобы иметь возможность отслеживать ее в тензорной доске? (keras.callbacks.TensorBoard)

В настоящее время у меня есть:

lrate = LearningRateScheduler(lambda epoch: initial_lr * 0.95 ** epoch)

tensorboard = TensorBoard(log_dir=LOGDIR, histogram_freq=1,
                          batch_size=batch_size, embeddings_freq=1,
                          embeddings_layer_names=embedding_layer_names )

model.fit_generator(train_generator, steps_per_epoch=n_steps,
                    epochs=n_epochs,
                    validation_data=(val_x, val_y),
                    callbacks=[lrate, tensorboard])

person Vadym B.    schedule 19.09.2017    source источник
comment
У меня такой же вопрос   -  person jundl77    schedule 23.01.2018
comment
Для всех, у кого есть тот же вопрос (хотя и в другом контексте), этот ответ предоставляет возможное решение.   -  person Yu-Yang    schedule 18.02.2018


Ответы (2)


Я не знаю, как передать его в Tensorboard, но вы можете отслеживать его с помощью python.

from keras.callbacks import Callback
class LossHistory(Callback):
    def on_train_begin(self, logs={}):
        self.losses = []
        self.lr = []

    def on_epoch_end(self, batch, logs={}):
        self.losses.append(logs.get('loss'))
        self.lr.append(initial_lr * 0.95 ** len(self.losses))

loss_hist = LossHistory()

Затем просто добавьте loss_hist к вашему callbacks.

Обновление:

На основе этого ответа:

class LRTensorBoard(TensorBoard):

    def __init__(self, log_dir='./logs', **kwargs):
        super(LRTensorBoard, self).__init__(log_dir, **kwargs)

        self.lr_log_dir = log_dir

    def set_model(self, model):
        self.lr_writer = tf.summary.FileWriter(self.lr_log_dir)
        super(LRTensorBoard, self).set_model(model)

    def on_epoch_end(self, epoch, logs=None):
        lr = initial_lr * 0.95 ** epoch

        summary = tf.Summary(value=[tf.Summary.Value(tag='lr',
                                                     simple_value=lr)])
        self.lr_writer.add_summary(summary, epoch)
        self.lr_writer.flush()

        super(LRTensorBoard, self).on_epoch_end(epoch, logs)

    def on_train_end(self, logs=None):
        super(LRTensorBoard, self).on_train_end(logs)
        self.lr_writer.close()

Просто используйте его как обычный TensorBoard.

person spadarian    schedule 18.02.2018

ТензорФлоу 2.x:

Создание журналов LearningRateScheduler для TensorBoard можно выполнить следующим образом:

from tensorflow.keras.callbacks import LearningRateScheduler, TensorBoard

# Define your scheduling function
def scheduler(epoch):
  return return 0.001 * 0.95 ** epoch

# Define scheduler
lr_scheduler = LearningRateScheduler(scheduler)
# Alternatively, use an anonymous function
# lr_scheduler = LearningRateScheduler(lambda epoch: initial_lr * 0.95 ** epoch)

# Define TensorBoard callback child class
class LRTensorBoard(TensorBoard):

  def __init__(self, log_dir, **kwargs):
    super().__init__(log_dir, **kwargs)
    self.lr_writer = tf.summary.create_file_writer(self.log_dir + '/learning')

  def on_epoch_end(self, epoch, logs=None):
    lr = getattr(self.model.optimizer, 'lr', None)
    with self.lr_writer.as_default():
      summary = tf.summary.scalar('learning_rate', lr, epoch)

    super().on_epoch_end(epoch, logs)

  def on_train_end(self, logs=None):
    super().on_train_end(logs)
    self.lr_writer.close()

# Create callback object
tensorboard_callback = LRTensorBoard(log_dir='./logs/', histogram_freq=1)

# Compile the model
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# Train the model
r = model.fit(X_train, y_train,
              validation_data=(X_val, y_val),
              epochs=25, batch_size=200,
              callbacks=[tensorboard_callback, lr_scheduler])

Затем скорость обучения можно просмотреть в TensorBoard через

# Load the TensorBoard notebook extension
%load_ext tensorboard
#Start TensorBoard
%tensorboard --logdir ./logs

Журнал скорости обучения в TensorBoard

person AKW    schedule 12.06.2020