2017-12-18 184 views

cevap

8

Doğrulama günlüklerini ayrı bir yazıcıyla işlemek için, özgün TensorBoard yöntemlerini saran özel bir geri arama yazabilirsiniz.

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__ iki alt dizinleri eğitim ve doğrulama günlükleri
  • set_model yılında için ayarlanmış bir yazar self.val_writer
  • on_epoch_end yılında doğrulama günlükleri için oluşturulan doğrulama günlükleri ayrılır eğitim kayıtlarından ve self.val_writer
dosyasına yazılmıştır. Örnek olarak MNIST veri kümesini kullanarak

:

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

Ardından TensorBoard bir aynı şekil üzerinde iki eğri benzetebiliriz.

Screenshot