keras вариационная функция потери автоэнкодера - PullRequest
1 голос
/ 20 февраля 2020

Я прочитал этот блог от Keras о реализации VAE, где потеря VAE определяется следующим образом:

def vae_loss(x, x_decoded_mean):
    xent_loss = objectives.binary_crossentropy(x, x_decoded_mean)
    kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
    return xent_loss + kl_loss

Я посмотрел документацию Keras и функция потерь VAE определяется следующим образом: в этой реализации реконструкция_loss умножается на original_dim, чего я не вижу в первой реализации!

if args.mse:
        reconstruction_loss = mse(inputs, outputs)
    else:
        reconstruction_loss = binary_crossentropy(inputs,
                                                  outputs)

    reconstruction_loss *= original_dim
    kl_loss = 1 + z_log_var - K.square(z_mean) - K.exp(z_log_var)
    kl_loss = K.sum(kl_loss, axis=-1)
    kl_loss *= -0.5
    vae_loss = K.mean(reconstruction_loss + kl_loss)
    vae.add_loss(vae_loss)

Может кто-нибудь объяснить, почему? Спасибо!

1 Ответ

1 голос
/ 21 февраля 2020

first_one: CE + mean(kl, axis=-1) = CE + sum(kl, axis=-1) / d

second_one: d * CE + sum(kl, axis=-1)

Итак: first_one = second_one / d

И обратите внимание, что второй возвращает средние потери по всем выборкам , но первый возвращает вектор потерь для всех выборок.

...