簡體   English   中英

將 Tensorflow 2.0 中的內部損失函數記錄到 tensorboard

[英]Log to tensorboard an internal loss function in Tensorflow 2.0

我一直在為我正在使用的自定義應用程序實現我的第一個 Variational Autoencoder。一切運行順利,但我無法在每批前向傳遞時將 KL 術語記錄到 Tensorboard 我希望這樣做是為了深入了解模型並研究 KL 退火技術的效果。

我已經根據 TF 文檔網頁上的示例定義了我的模型,這意味着Model.add_loss()函數將 KL 項添加到當前批次損失中

class VariationalAutoEncoder(tf.keras.Model):
def __init__(self,
             original_dim=18,
             intermediate_dim=64,
             latent_dim=2,
             name='Autoencoder',
             **kwargs):
    super(VariationalAutoEncoder, self).__init__(name=name, **kwargs)
    self.original_dim = original_dim
    self.encoder = Encoder(latent_dim=latent_dim,
                           intermediate_dim=intermediate_dim)
    self.decoder = Decoder(original_dim=original_dim,
                           intermediate_dim=intermediate_dim)
    self.kl_loss_weight = 0

def call(self, inputs):
    # Forward pass of the Encoder
    z_mean, z_log_var, z = self.encoder(inputs)
    # Forward pass of the Decoder taken the re-parameterized z latent variable
    reconstructed = self.decoder(z)

    # Add KL divergence regularization loss for this forward pass
    # THIS IS THE VALUE I WANT TO LOG TO TENSORBOARD
    kl_loss = - 0.5 * tf.reduce_mean(z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1)

    # HERE !!!! I ADD THE KL TERM weighted by an internal variable.
    self.add_loss(self.kl_loss_weight * kl_loss)
    return reconstructed

我使用內置函數定義、編譯和訓練我的模型(我沒有定義自定義訓練循環):

vae = VariationalAutoEncoder(original_dim=18, intermediate_dim=intermediate_dim, latent_dim=latent_dim)

optimizer = tf.keras.optimizers.Adam(learning_rate=lr)

vae.compile(optimizer,
            loss=tf.keras.losses.MeanSquaredError(),
            metrics=[tf.keras.metrics.MeanAbsoluteError(name="reconstruction_MAE")])

通過此設置,我能夠獲得組合損失函數(重建 + KL)的 Tensorboard 日志,並且也只能獲得重建(通過使用 MAE 指標)。 盡管如此,我似乎找不到同時記錄 KL 項的方法,因為它的值是在 graph 內計算的

我嘗試使用多輸出配置,但它需要分配常量loss_weights ,因為我想使用 KL 退火,所以我需要避免這種情況。

我想避免編寫自定義訓練循環,所以我能夠做到這一點,但到目前為止我已經嘗試了幾個想法,現在我相信這可能是唯一的方法。 我錯了嗎? 有沒有辦法將這個內部損失值記錄到 Tensorboard?

考慮使用tf.summary.scalar

class VariationalAutoEncoder(tf.keras.Model):
    <...>
    def call(self, inputs):
        <...>
        kl_loss = - 0.5 * tf.reduce_mean(z_log_var - tf.square(z_mean) - tf.exp(z_log_var) + 1)
        tf.summary.scalar('KL loss', kl_loss)
        self.add_loss(self.kl_loss_weight * kl_loss)
        return reconstructed

logdir = "logs/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
vae = VariationalAutoEncoder(original_dim=18, intermediate_dim=intermediate_dim, latent_dim=latent_dim)

optimizer = tf.keras.optimizers.Adam(learning_rate=lr)

vae.compile(optimizer,
            loss=tf.keras.losses.MeanSquaredError(),
            metrics=[tf.keras.metrics.MeanAbsoluteError(name="reconstruction_MAE"),
            callbacks=[tensorboard_callback]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM