2017-09-19 53 views
5

używam Keras i chcą wprowadzić zwyczaj uczenia stopy poprzez keras.callbacks.LearningRateSchedulerJak zapewnić wartość kursu do nauki tensorboard w Keras

stopy jaki sposób można przekazać nauki, aby móc monitorować ją w tensorboard? (keras.callbacks.TensorBoard)

Obecnie mam:

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]) 
+0

Mam to samo pytanie – jundl77

+0

Dla każdego, kto ma to samo pytanie (chociaż w innym kontekście) [ta odpowiedź] (https://stackoverflow.com/a/48206009/1531463) zapewnia możliwe rozwiązanie. –

Odpowiedz

1

Nie jestem pewien, w jaki sposób przekazać je do Tensorboard, ale można monitorować go ze skóry pytona.

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() 

Następnie wystarczy dodać loss_hist do callbacks.

Aktualizacja:

podstawie this odpowiedź:

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() 

Wystarczy używać go jak normalnego TensorBoard.