2017-07-02 6 views
0

私はpythonとtensorflowを使用して変種オートエンコーダを実装しようとしています。私はインターネット上で様々な実装を見てきました。私は、私が見つけた様々な部分を使って私自身のものを作り出し、私の特定の事例でそれらを動作させました。 私はここでオートエンコーダと結論付けている:私は含まオートエンコーダ有する my autoncoder on gitvariational autoencoderの実装

手短に言えば:

1)2つの畳み込み層を有するエンコーダと1つの平坦化層、

2)潜在空間(寸法2の)、

3)と、エンコーダの逆の部分を有するデコーダとを含む。

私の問題は、オートエンコーダの変種部分を実装しようとするときです。これは、潜在空間における数学的手続きを意味する。ちょっと私が問題を正確に指摘している場所です。

私は、次の2例ているより明確にするため

ケース1: 実際にどんな変数学を実装せずに、単に潜在空間に変数を設定していない数学とデコーダでそれらを養いますこの場合、コスト関数は入力と出力の差に過ぎません。潜在空間変数で数学を実装しようと : figure1_code_part1.png、 figure1_code_part2.png

ケース2:あなたはgitの上のこれらの図で、その場合のコードを(申し訳ありませんより多くのリンクを投稿することはできません)見ることができます。あなたはこれらの図にその場合のコードを見ることができます:私は例ごとに取得する潜在空間の figure_2_code_part1.png、 figure_2_code_part2.png

プロットである: figure_1.png figure_2.png

私は、変種の実装には明らかに間違っていると思いますが、何が分かりません。変分的な自動エンコーダを実装するすべての人は、これらの数式を使用します(少なくとも私がインターネット上で見つけたもの)。おそらく私は何かを逃しているでしょう。

コメント/ご提案は大歓迎です。 ありがとうございます!ここで

答えて

1

KL_termmusigmaを計算する方法である: 私はあなたのコードの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

ウィッシュ!