如何通过tensorflow运行第二个随机向量来比较输出分布?

时间:2018-02-21 04:44:58

标签: python 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 个答案:

答案 0 :(得分:0)

希望我能正确理解这个难点,有两种方法:

  1. 首先要意识到TensorFlow允许您提供任何张量,而不仅仅是占位符。因此,您可以sess.run(..., feed_dict={self.x: x_rand})将随机值提供给self.x张量。

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