如何通过TensorFlow运行第二个随机向量以比较输出分布



我正在尝试在TensorFlow中实现变异自动编码器设计。这种特殊的方法改变了损失的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。

希望我能正确理解困难,有几个方法:

  1. 首先是要意识到张量允许您喂食任何张量,而不仅仅是占位符。因此,您只能做sess.run(..., feed_dict={self.x: x_rand})将随机值馈入self.x张量。

  2. 第二,如果您想使用数据集管道产生随机数据。如果创建输入需要一段时间,并且您想与sess.run()调用并行执行此操作,这可能很有用。然后,您将两次实例化模型。一旦使用常规的self.x输入,然后使用数据集迭代器输入张量。两种模型都将共享变量(您需要在变量范围集中以共享变量来创建它们(,但是操作(计算图中的节点(将有所不同。然后,您可以随时在这两个模型中调用sess.run()

最新更新