gpt4 book ai didi

tensorflow - keras 张量板 : plot train and validation scalars in a same figure

转载 作者:行者123 更新时间:2023-12-03 07:55:05 27 4
gpt4 key购买 nike

所以我在 keras 中使用张量板。在 tensorflow 中,可以对训练和验证标量使用两个不同的摘要编写器,以便 tensorboard 可以将它们绘制在同一图中。类似于

TensorBoard - Plot training and validation losses on the same graph?

有没有办法在 keras 中做到这一点?

谢谢。

最佳答案

要使用单独的编写器处理验证日志,您可以编写一个环绕原始 TensorBoard 的自定义回调。方法。

import os
import tensorflow as tf
from keras.callbacks import TensorBoard

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__ ,设置两个子目录用于训练和验证日志
  • set_model , 作家 self.val_writer为验证日志创建
  • on_epoch_end ,验证日志与训练日志分开并写入文件 self.val_writer

  • 以 MNIST 数据集为例:

    from keras.models import Sequential
    from keras.layers import Dense
    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)])

    然后,您可以在 TensorBoard 中的同一图形上可视化两条曲线。

    Screenshot

    编辑:我对这个类做了一些修改,以便它可以与 Eager Execution 一起使用。

    最大的变化是我用了 tf.keras在下面的代码中。看来 TensorBoard独立 Keras 中的回调尚不支持 Eager 模式。

    import os
    import tensorflow as tf
    from tensorflow.keras.callbacks import TensorBoard
    from tensorflow.python.eager import context

    class TrainValTensorBoard(TensorBoard):
    def __init__(self, log_dir='./logs', **kwargs):
    self.val_log_dir = os.path.join(log_dir, 'validation')
    training_log_dir = os.path.join(log_dir, 'training')
    super(TrainValTensorBoard, self).__init__(training_log_dir, **kwargs)

    def set_model(self, model):
    if context.executing_eagerly():
    self.val_writer = tf.contrib.summary.create_file_writer(self.val_log_dir)
    else:
    self.val_writer = tf.summary.FileWriter(self.val_log_dir)
    super(TrainValTensorBoard, self).set_model(model)

    def _write_custom_summaries(self, step, logs=None):
    logs = logs or {}
    val_logs = {k.replace('val_', ''): v for k, v in logs.items() if 'val_' in k}
    if context.executing_eagerly():
    with self.val_writer.as_default(), tf.contrib.summary.always_record_summaries():
    for name, value in val_logs.items():
    tf.contrib.summary.scalar(name, value.item(), step=step)
    else:
    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, step)
    self.val_writer.flush()

    logs = {k: v for k, v in logs.items() if not 'val_' in k}
    super(TrainValTensorBoard, self)._write_custom_summaries(step, logs)

    def on_train_end(self, logs=None):
    super(TrainValTensorBoard, self).on_train_end(logs)
    self.val_writer.close()

    思路是一样的——
  • 查看TensorBoard的源码回调
  • 看看它如何设置写入器
  • 在这个自定义回调中做同样的事情

  • 同样,您可以使用 MNIST 数据来测试它,

    from tensorflow.keras.datasets import mnist
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense
    from tensorflow.train import AdamOptimizer

    tf.enable_eager_execution()

    (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
    y_train = y_train.astype(int)
    y_test = y_test.astype(int)

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

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

    关于tensorflow - keras 张量板 : plot train and validation scalars in a same figure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877475/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com