Функция потери нескольких выходов вариационного автоэнкодера со слоем KL Divergence - PullRequest
1 голос
/ 02 марта 2020

Мне нужна помощь для записи функции потери для модели ниже:

My model

Существует 5 входов и выходов. Первые 2 слоя являются категориальными переменными, переменные 3 и 4 являются двоичными переменными, а пятая переменная является непрерывной переменной, которую я масштабировал от 0 до 1. Из VAE я хочу восстановить их все. Не могли бы вы помочь мне с кодом для функции потери?

Класс KL_divergence выглядит следующим образом:

Этот уровень представляет собой слой идентификации, который добавляет потерю KL к окончательной потере. Тогда ваша последняя потеря может быть той, которую вы использовали выше. класс KLDivergenceLayer (Layer):

""" Identity transform layer that adds KL divergence
to the final model loss.
"""

def __init__(self, *args, **kwargs):
    self.is_placeholder = True
    super(KLDivergenceLayer, self).__init__(*args, **kwargs)

def call(self, inputs):

    mu, log_var = inputs

    kl_batch = - .5 * K.sum(1 + log_var -
                            K.square(mu) -
                            K.exp(log_var), axis=-1)

    self.add_loss(K.mean(kl_batch), inputs=inputs)

    return inputs

и функция потерь выглядит так:

def nll(y_true, y_pred):
    """ Negative log likelihood (Bernoulli). """
    #keras.losses.binary_crossentropy gives the mean
    #over the last axis. we require the sum
    return K.sum(K.binary_crossentropy(y_true, y_pred), axis=-1)

С этим кодом я не могу получить правильную реконструкцию.

...