web-dev-qa-db-fra.com

Keras: comment afficher le taux d'apprentissage sur le tensorboard

J'ajoute un rappel au taux d'apprentissage de décroissance:

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

voici mon rappel tensorboard:

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)

Je veux m'assurer qu'il a bien fonctionné pendant mon entraînement, donc je veux afficher le taux d'apprentissage sur tensorbaord, mais je ne trouve pas où le régler.

J'ai également vérifié l'api de l'optimiseur, mais pas de chance.

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

Alors, comment puis-je afficher le taux d'apprentissage sur tensorboad?

16
scott huang

Selon l'auteur de Keras , la manière appropriée consiste à sous-classer le rappel 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)

Passez-le ensuite dans le cadre de l'argument callbacks à model.fit (crédit prix Finncent ):

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

Vous avez donné le code de l'optimiseur deux fois, au lieu du rappel TensorBoard. Quoi qu'il en soit, je n'ai pas trouvé le moyen d'afficher le taux d'apprentissage sur TensorBoard. Je le trace à la fin de la formation, en prenant des données de l'objet 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'])

Le graphique ressemble à ceci: tracé LR

Désolé, ce n'est pas exactement ce que vous demandez, mais cela pourrait peut-être vous aider.

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)

courbe lr en panneau tensoriel

1
user140713