Я пытаюсь реализовать 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 ...) и разные базы данных.Я написал нечто подобное, используя изображения, и это сработало.Звучит странно!