запись графика скорости обучения в keras с помощью весов и смещений
Я обучаю модель keras и использую настраиваемый планировщик скорости обучения для оптимизатора (типа tf.keras.optimizers.schedules.LearningRateSchedule), и я хочу регистрировать изменение скорости обучения с помощью структуры весов и смещений. Я не мог найти, как передать его объекту WandbCallback или каким-либо образом зарегистрировать его
3 ответа
вы можете регистрировать настраиваемую скорость обучения в Weights and Biases с помощью настраиваемого обратного вызова Keras.
W &B's
WandbCallback
не может автоматически регистрировать вашу индивидуальную скорость обучения. Обычно для такого настраиваемого ведения журнала, если вы используете настраиваемый цикл обучения, вы можете использовать. Если вы используете собственный обратный вызов Keras, это способ.
Например:
Это мой
tf.keras.optimizers.schedules.LearningRateSchedule
планировщик на основе.
class MyLRSchedule(tf.keras.optimizers.schedules.LearningRateSchedule):
def __init__(self, initial_learning_rate):
self.initial_learning_rate = initial_learning_rate
def __call__(self, step):
return self.initial_learning_rate / (step + 1)
optimizer = tf.keras.optimizers.SGD(learning_rate=MyLRSchedule(0.001))
Вы можете получить текущую скорость обучения оптимизатора, используя
optimizer.learning_rate(step)
. Это можно обернуть как пользовательский обратный вызов Keras и использовать
wandb.log()
с этим.
class LRLogger(tf.keras.callbacks.Callback):
def __init__(self, optimizer):
super(LRLogger, self).__init__()
self.optimizer = optimizer
def on_epoch_end(self, epoch, logs):
lr = self.optimizer.learning_rate(epoch)
wandb.log({"lr": lr}, commit=False)
Обратите внимание, что в
wandb.log
звонок, который я использовал
commit=False
аргумент. Это обеспечит регистрацию всех показателей на одном временном шаге. Подробнее об этом здесь .
Вызов
model.fit()
.
tf.keras.backend.clear_session()
model = some_model()
model.compile(optimizer, 'categorical_crossentropy', metrics=['acc'])
wandb.init(entity='wandb-user-id', project='my-project', job_type='train')
_ = model.fit(trainloader,
epochs=EPOCHS,
validation_data=testloader,
callbacks=[WandbCallback(), # using WandbCallback to log default metrics.
LRLogger(optimizer)]) # using callback to log learning rate.
wandb.finish()
Вот медиа-панель W&B:
Я хотел бы завершить ответ аюш-тхакур . Поскольку планировщик обновляет скорость обучения в каждом пакете/шаге, а не в каждую эпоху, регистратор должен получать скорость обучения в момент времени.
epoch * steps_per_epoch
, куда
steps_per_epoch
- количество пакетов за эпоху. Это значение хранится в optimizer.iterations
.
Берем пример кода @ayush-thakur и меняем функцию:
class LRLogger(tf.keras.callbacks.Callback):
def __init__(self, optimizer):
super(LRLogger, self).__init__()
self.optimizer = optimizer
def on_epoch_end(self, epoch, logs):
lr = self.optimizer.learning_rate(self.optimizer.iterations)
wandb.log({"lr": lr}, commit=False)
Затем вы можете использовать этот обратный вызов в
model.fit
тренировочный процесс.
Обратите внимание, что приведенный выше код вернет скорость обучения последней партии каждой эпохи. Чтобы получить скорость обучения первой партии каждой эпохи, замените
on_epoch_end
с
on_epoch_begin
.
Еще больше упрощая ответ
class LRLogger(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
lr = float(tf.keras.backend.get_value(self.model.optimizer.lr))
wandb.log({'lr': lr}, commit=False)