2

我正在使用 Keras 教程训练 VAE:https ://keras.io/examples/generation/vae/ 。这涉及创建一个 VAE 类和指定一个自定义训练程序,这里有更多描述:https ://keras.io/guides/customizing_what_happens_in_fit/ 。按照教程中的说明创建编码器和解码器并训练模型后,我通过以下方式创建 VAE 模型:

vae = VAE(encoder, decoder) 
vae.compile(optimizer=keras.optimizers.Adam())

vae.fit(x=x_train, y=None, 
        epochs=epochs, 
        batch_size=batch_size, 
        verbose=False,
        validation_data=(x_test, None))

我想在训练后在单独的数据集上评估模型(因为我有多个评估数据集,我没有将它用作验证数据)。但是,当我尝试运行时vae.evaluate(data),它返回一个空列表[]

注意:我可以通过 轻松获得训练和验证指标vae.history.history,但问题是当我尝试在训练后进行评估时。但是当我尝试返回指标vae.metrics时,它也会返回一个空列表。如何model.evaluate使用返回损失指标字典的自定义训练程序?我需要为评估定义一些自定义的东西吗?

以下是 VAE 类的定义方式。更多细节可以在上面的教程中找到。

class VAE(keras.Model):
    def __init__(self, encoder, decoder, **kwargs):
        super(VAE, self).__init__(**kwargs)
        self.encoder = encoder
        self.decoder = decoder

    def train_step(self, data):
        if isinstance(data, tuple):
            data = data[0]
        with tf.GradientTape() as tape:
            z_mean, z_log_var, z = encoder(data)
            reconstruction = decoder(z)
            reconstruction_loss = tf.reduce_mean(
                keras.losses.binary_crossentropy(data, reconstruction)
            )
            reconstruction_loss *= 28 * 28
            kl_loss = 1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var)
            kl_loss = tf.reduce_mean(kl_loss)
            kl_loss *= -0.5
            total_loss = reconstruction_loss + kl_loss
        grads = tape.gradient(total_loss, self.trainable_weights)
        self.optimizer.apply_gradients(zip(grads, self.trainable_weights))
        return {
            "loss": total_loss,
            "reconstruction_loss": reconstruction_loss,
            "kl_loss": kl_loss,
        }
4

0 回答 0