首页 文章

变分自动编码器实现

提问于
浏览
1

我正在尝试使用python和tensorflow实现变分自动编码器 . 我在互联网上看到了各种各样的实现 . 我已经设法使用我找到的各个部分创建了自己的部分,并使它们与我的特定情况一起工作 . 我在这里总结了一个自动编码器:my autoncoder on git

简而言之,我有一个自动编码器,其中包含:

1)具有2个卷积层和1个展平层的编码器,

2)潜在空间(维度2),

3)和具有编码器反向部分的解码器 .

我的问题是当我尝试实现自动编码器的变分部分时 . 我的意思是潜在空间中的数学过程 . 至少是我确定问题的地方 .

为了更清楚,我有以下两种情况:

Case 1 :在没有实际实现任何变分数学的情况下,只需简单地将变量设置在潜在空间中并将它们馈送到解码器中而不应用数学 . 在这种情况下,成本函数只是输入和输出之间的差异 . 您可以在git上的这些图中看到该案例的代码(抱歉无法发布更多链接):figure1_code_part1.png,figure1_code_part2.png

Case2 :尝试在潜在空间变量中实现数学 . 您可以在这些图中看到该案例的代码:figure_2_code_part1.png,figure_2_code_part2.png

我在每个案例中得到的潜在空间的情节是:figure_1.png figure_2.png

我认为变分实现显然有问题,但我无法弄清楚是什么 . 实现变分自动编码器的每个人都使用这些数学公式(至少是我在互联网上找到的公式) . 可能我错过了一些东西 .

欢迎提出任何意见/建议 . 谢谢!!!

1 回答

  • 2

    以下是 musigmaKL_term 的计算方式:我不确定代码的 linear 部分 . 因此,我建议如下:

    请注意,在这里,在编码器侧的完全连接的层之前,我有一个 conv4 形状层: [7, 7, 256] .

    # These are the weights and biases of the mu and sigma on the encoder side
    w_c_mu = tf.Variable(tf.truncated_normal([7 * 7 * 256, latent_dim], stddev=0.1), name='weight_fc_mu')
    b_c_mu = tf.Variable(tf.constant(0.1, shape=[latent_dim]), name='biases_fc_mu')
    w_c_sig = tf.Variable(tf.truncated_normal([7 * 7 * 256, latent_dim], stddev=0.1), name='weight_fc_sig')
    b_c_sig = tf.Variable(tf.constant(0.1, shape=[latent_dim]), name='biases_fc_sig')
    epsilon = tf.random_normal([1, latent_dim])
    
    with tf.variable_scope('mu'):
        mu = tf.nn.bias_add(tf.matmul(conv4_reshaped, w_c_mu), b_c_mu)
        tf.summary.histogram('mu', mu)
    
    with tf.variable_scope('stddev'):
        stddev = tf.nn.bias_add(tf.matmul(conv4_reshaped, w_c_sig), b_c_sig)
        tf.summary.histogram('stddev', stddev)
    
    with tf.variable_scope('z'):
        # This formula was adopted from the following paper: http://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7979344
        latent_var = mu + tf.multiply(tf.sqrt(tf.exp(stddev)), epsilon)
        tf.summary.histogram('features_sig', stddev)
    
    ...
    
    with tf.name_scope('loss_KL'):
        temp2 = 1 + tf.log(tf.square(stddev + 1e-9)) - tf.square(mu) - tf.square(stddev)
        KL_term = - 0.5 * tf.reduce_sum(temp2, reduction_indices=1)
        tf.summary.scalar('KL_term', tf.reduce_mean(KL_term))
    
    with tf.name_scope('total_loss'):
        variational_lower_bound = tf.reduce_mean(log_likelihood + KL_term)
        tf.summary.scalar('loss', variational_lower_bound)
    
    with tf.name_scope('optimizer'):
        update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
        with tf.control_dependencies(update_ops):
            optimizer = tf.train.AdamOptimizer(0.00001).minimize(variational_lower_bound)
    

    完整代码:https://gist.github.com/issa-s-ayoub/5267558c4f5694d479a84d960c265452

    希望有所帮助!!

相关问题