def encoder(self, x):
""" Convolutional variational encoder to encode image into a low-dimensional latent code
If config.conv == False it is a MLP VAE. If config.use_vae == False, it is a normal encoder
:param x: sequence of images
:return: a, a_mu, a_var
"""
with tf.variable_scope('vae/encoder'):
if self.config.conv:
x_flat_conv = tf.reshape(x, (-1, self.d1, self.d2, 1))
enc_hidden = slim.stack(x_flat_conv,
slim.conv2d,
self.num_filters,
kernel_size=self.config.filter_size,
stride=2,
activation_fn=self.activation_fn,
padding='SAME')
enc_flat = slim.flatten(enc_hidden)
self.enc_shape = enc_hidden.get_shape().as_list()[1:]
else:
x_flat = tf.reshape(x, (-1, self.d1 * self.d2))
enc_flat = slim.repeat(x_flat, self.config.num_layers, slim.fully_connected,
self.config.vae_num_units, self.activation_fn)
a_mu = slim.fully_connected(enc_flat, self.config.dim_a, activation_fn=None)
if self.config.use_vae:
a_var = slim.fully_connected(enc_flat, self.config.dim_a, activation_fn=tf.nn.sigmoid)
a_var = self.config.noise_emission * a_var
a = simple_sample(a_mu, a_var)
else:
a_var = tf.constant(1., dtype=tf.float32, shape=())
a = a_mu
a_seq = tf.reshape(a, tf.stack((-1, self.ph_steps, self.config.dim_a)))
return a_seq, a_mu, a_var
评论列表
文章目录