Вариационный автоэнкодер не сходится - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь реализовать VAE, используя другое отношение БД к известному MNIST.Я много читал о VAE и внедряю очень простой авто-кодер, но не могу понять, почему он не сходится.Вот основной код:

tf.reset_default_graph()

with tf.device("/gpu:0"):
    x = tf.placeholder(dtype=tf.float32, shape=[None,num_var], name="x")
    keep_prob = tf.placeholder(dtype=tf.float32, shape=(), name='keep_prob')


    def encoder(x, keep_prob):

        layer = tf.layers.dense(x, units=NHIDDEN[0], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)
        layer = tf.layers.dense(layer, units=NHIDDEN[1], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)
        layer = tf.layers.dense(layer, units=NHIDDEN[2], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)

        mu = tf.layers.dense(layer, units=NHIDDEN[3], activation=None)
        sigma = tf.layers.dense(layer, units=NHIDDEN[3], activation=None)
        epsi = tf.random_normal(tf.shape(sigma), dtype = tf.float32)
        sigma_exp = tf.exp(sigma*0.5)

        hidden_layer = mu + tf.exp(sigma*0.5)*epsi

        return hidden_layer, sigma, mu, sigma_exp


    def decoder(hid, keep_prob):
        layer = tf.layers.dense(hid, units=NHIDDEN[2], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)
    `   layer = tf.layers.dense(layer, units=NHIDDEN[1], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)
        layer = tf.layers.dense(layer, units=NHIDDEN[0], activation=tf.nn.sigmoid)
        layer = tf.nn.dropout(layer, keep_prob)
        output_non_act = tf.layers.dense(layer, units=num_var, activation=None)
        reconstructed_layer = tf.nn.sigmoid(output_non_act)
        return reconstructed_layer, output_non_act 


    codif, sigma, mu, sigma_e = encoder(x, keep_prob)
    decod, output_non_act = decoder(codif, keep_prob)

    loss = tf.reduce_sum(tf.squared_difference(decod, x),1)
    loss_var = 0.5*tf.reduce_sum(tf.exp(sigma)+tf.square(mu)-1-sigma)
    loss_tot = loss + loss_var 
    optimizer = tf.train.AdamOptimizer(learning_coeff).minimize(loss_tot)

KL дивергенция почти сразу достигает 0, в то время как AE_error остается высоким.Любая идея?Я пытался использовать разные функции активации (elu, relu, none ...) и разные базы данных.Я написал нечто подобное, используя изображения, и это сработало.Звучит странно!

...