keras tensorboard: tracer les scalars de validation et de train dans une même figure

donc j'utilise la planche de tension dans keras. Dans tensorflow, on pourrait utiliser deux rédacteurs de résumés différents pour les scalars de train et de validation afin que tensorboard puisse les tracer dans une même figure. Quelque chose comme le figure

TensorBoard - Parcelle de formation et de validation des pertes sur le même graphique?

y a-t-il un moyen de faire cela à keras?

Merci.

19
demandé sur Fangzhou Zhai 2017-12-19 01:39:35

1 réponses

pour gérer les logs de validation avec un rédacteur séparé, vous pouvez écrire un callback personnalisé qui entoure l'original TensorBoard méthodes.

class TrainValTensorBoard(TensorBoard):
    def __init__(self, log_dir='./logs', **kwargs):
        # Make the original `TensorBoard` log to a subdirectory 'training'
        training_log_dir = os.path.join(log_dir, 'training')
        super(TrainValTensorBoard, self).__init__(training_log_dir, **kwargs)

        # Log the validation metrics to a separate subdirectory
        self.val_log_dir = os.path.join(log_dir, 'validation')

    def set_model(self, model):
        # Setup writer for validation metrics
        self.val_writer = tf.summary.FileWriter(self.val_log_dir)
        super(TrainValTensorBoard, self).set_model(model)

    def on_epoch_end(self, epoch, logs=None):
        # Pop the validation logs and handle them separately with
        # `self.val_writer`. Also rename the keys so that they can
        # be plotted on the same figure with the training metrics
        logs = logs or {}
        val_logs = {k.replace('val_', ''): v for k, v in logs.items() if k.startswith('val_')}
        for name, value in val_logs.items():
            summary = tf.Summary()
            summary_value = summary.value.add()
            summary_value.simple_value = value.item()
            summary_value.tag = name
            self.val_writer.add_summary(summary, epoch)
        self.val_writer.flush()

        # Pass the remaining logs to `TensorBoard.on_epoch_end`
        logs = {k: v for k, v in logs.items() if not k.startswith('val_')}
        super(TrainValTensorBoard, self).on_epoch_end(epoch, logs)

    def on_train_end(self, logs=None):
        super(TrainValTensorBoard, self).on_train_end(logs)
        self.val_writer.close()
  • __init__, deux sous-répertoires sont établis pour les journaux de formation et de validation
  • set_model écrivain self.val_writer est créé pour les logs de validation
  • on_epoch_end, les journaux de validation sont séparés des journaux de formation et écrits en fichier avec self.val_writer

à l'Aide de le MNIST jeu de données comme un exemple:

from keras.datasets import mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10,
          validation_data=(x_test, y_test),
          callbacks=[TrainValTensorBoard(write_graph=False)])

vous pouvez alors visualiser les deux courbes sur une même figure dans TensorBoard.

Screenshot

31
répondu Yu-Yang 2018-01-23 03:24:36