我正在尝试在张量流中实现变分自动编码器设计。这种特殊方法改变了损失的KL分歧部分,以消除对x的任何依赖(即输入数据)。相反,他们想比较(q_phi(z)|| p(z))而不是(q_phi(z | x)|| p(z))。我认为我需要通过训练有素的网络运行一个正确形状的随机正常或均匀矢量,但我很难弄清楚如何输入它。以下是我到目前为止的情况:
class EncoderRNN(object):
def __init__(self, x, n_steps, input_size, output_size,
cell_size, num_layers, default_batch_size):
# ### Data Input ###
self.x = x
# self.init_state = init_state
self.n_steps = n_steps
self.input_size = input_size
self.output_size = output_size
self.cell_size = cell_size
self.num_layers = num_layers
self.default_batch_size = default_batch_size
...
class VAE(object):
def __init__(self, time_steps, features, latent_dim, encoder_hidden,
decoder_hidden, num_layers, default_batch_size,
learning_rate):
self.time_steps = time_steps
self.features = features
self.latent_dim = latent_dim
self.encoder_hidden = encoder_hidden
self.decoder_hidden = decoder_hidden
self.num_layers = num_layers
self.default_batch_size = default_batch_size
self.LR = learning_rate
with tf.name_scope('train_inputs'):
# ### Multi-D timeseries input ###
self.x = tf.placeholder("float", [None, self.time_steps,
self.features])
### 1 D timeseries output ###
self.x_target = tf.placeholder("float", [None, self.time_steps, 1])
self.batch_size = tf.placeholder(dtype=tf.int32)
...
以下是我想弄清楚的事情:
def build_codec(self):
self.encoder = EncoderRNN(self.x,
self.time_steps,
self.features,
self.latent_dim,
self.encoder_hidden,
self.num_layers,
self.default_batch_size)
# ### Output tensors from encoder ###
self.mu = self.encoder.mu
self.logvar = self.encoder.logvar
epsilon = tf.random_normal(tf.shape(self.logvar), name='epsilon')
std_encoder = tf.exp(0.5 * self.logvar)
self.z = self.mu + tf.multiply(std_encoder, epsilon)
# Now I want to do this:
x_rand = tf.random_normal(tf.shape(self.x))
q_z = self.encoder(x_rand)
我不太确定如何通过编码器图获取x_rand。
答案 0 :(得分:0)
希望我能正确理解这个难点,有两种方法:
首先要意识到TensorFlow允许您提供任何张量,而不仅仅是占位符。因此,您可以sess.run(..., feed_dict={self.x: x_rand})
将随机值提供给self.x
张量。
其次,如果您想使用数据集管道生成随机数据。如果创建输入需要一段时间并且您希望与sess.run()
调用并行执行此操作,则此功能非常有用。然后,您将两次实例化您的模型。一次使用常规self.x
输入,一次使用来自Dataset迭代器的输入张量。两个模型都将共享变量(您需要在变量范围集中创建它们以共享变量),但操作(计算图中的节点)将是不同的。然后,您可以随时在这两个模型中的任何一个上调用sess.run()
。