TensorBoard:将输出图像添加到回调

时间:2019-12-08 14:38:51

标签: python tensorflow keras raster tensorboard

我建立了一个网络,试图预测表面温度的栅格图像。 网络的输出是一个(1000, 1000)大小的数组,代表一个光栅图像。为了进行训练和测试,将它们与各自样本的真实栅格进行比较。 我了解如何add the training image to my TensorBoard callback,但我也想将网络的输出图像添加到回调中,以便可以直观地进行比较。这可能吗?

x = Input(shape = (2))
x = Dense(4)(x)
x = Reshape((2, 2))(x)

Reshape将是最后一层(或在某个反卷积层之前)。

1 个答案:

答案 0 :(得分:1)

根据您使用的tensorflow版本,我将建议2种不同的代码。我将假定您使用> 2.0并将用于该版本的代码发布到图像到图像模型。我基本上用一个嘈杂的图像(我正在做降噪,但您可以轻松地适应您的问题)和相应的地面真实情况图像来初始化回调。然后,我使用模型在每个时期之后进行推断。

"""Inspired by https://github.com/sicara/tf-explain/blob/master/tf_explain/callbacks/grad_cam.py"""
import numpy as np
import tensorflow as tf
from tensorflow.keras.callbacks import Callback


class TensorBoardImage(Callback):
    def __init__(self, log_dir, image, noisy_image):
        super().__init__()
        self.log_dir = log_dir
        self.image = image
        self.noisy_image = noisy_image

    def set_model(self, model):
        self.model = model
        self.writer = tf.summary.create_file_writer(self.log_dir, filename_suffix='images')

    def on_train_begin(self, _):
        self.write_image(self.image, 'Original Image', 0)

    def on_train_end(self, _):
        self.writer.close()

    def write_image(self, image, tag, epoch):
        image_to_write = np.copy(image)
        image_to_write -= image_to_write.min()
        image_to_write /= image_to_write.max()
        with self.writer.as_default():
            tf.summary.image(tag, image_to_write, step=epoch)

    def on_epoch_end(self, epoch, logs={}):
        denoised_image = self.model.predict_on_batch(self.noisy_image)
        self.write_image(denoised_image, 'Denoised Image', epoch)

因此通常,您将通过以下方式使用此方法:

# define the model
model = Model(inputs, outputs)
# define the callback
image_tboard_cback = TensorBoardImage(
    log_dir=log_dir + '/images',
    image=val_gt[0:1],
    noisy_image=val_noisy[0:1],
)
# fit the model
model.fit(
    x, 
    y, 
    callbacks=[tboard_cback,],
)

如果您使用的是2.0之前的版本,则可以直接转到我写的this gist(有点复杂)。