首页 文章

取自张量的取样取决于张量流中的随机变量

提问于
浏览
0

是否有可能从张量流中获取取决于随机变量的张量?我需要得到一个近似的样本分布,以便在损失函数中进行优化 . 具体来说,在下面的示例中,我希望能够获得Y_output的样本,以便能够计算输出分布的均值和方差,并在损失函数中使用这些参数 .

def sample_weight(mean, phi, seed=1):
    P_epsilon = tf.distributions.Normal(loc=0., scale=1.0)
    epsilon_s = P_epsilon.sample([1])
    s = tf.multiply(epsilon_s, tf.log(1.0+tf.exp(phi)))
    weight_sample = mean + s
    return weight_sample

X = tf.placeholder(tf.float32, shape=[None, 1], name="X")
Y_labels = tf.placeholder(tf.float32, shape=[None, 1], name="Y_labels")
sw0 = sample_weight(u0,p0)
sw1 = sample_weight(u1,p1)
Y_output = sw0 + tf.multiply(sw1,X)

loss = tf.losses.mean_squared_error(labels=Y_labels, predictions=Y_output)
train_op = tf.train.AdamOptimizer(0.5e-1).minimize(loss)
init_op = tf.global_variables_initializer()
losses = []
predictions = []

Fx = lambda x: 0.5*x + 5.0
xrnge = 50
xs, ys = build_toy_data(funcx=Fx, stdev=2.0, num=xrnge)

with tf.Session() as sess:
    sess.run(init_op)
    iterations=1000
    for i in range(iterations):
        stat = sess.run(loss, feed_dict={X: xs, Y_labels: ys})

1 回答

  • 0

    不确定这是否回答了你的问题,但是:当你有一个采样 Op 的下游 Tensor 时(例如,通过调用 P_epsilon.sample([1]) 创建 Op ,任何时候你在下游 Tensor 上调用 sess.run ,样本操作将重新运行,并产生一个新的随机值 . 例如:

    import tensorflow as tf
    from tensorflow_probability import distributions as tfd
    
    n = tfd.Normal(0., 1.)
    s = n.sample()
    y = s**2
    sess = tf.Session()  # Don't actually do this -- use context manager
    print(sess.run(y))
    # ==> 0.13539088
    print(sess.run(y))
    # ==> 0.15465781
    print(sess.run(y))
    # ==> 4.7929106
    

    如果你想要一堆 y 的样本,你可以做到

    import tensorflow as tf
    from tensorflow_probability import distributions as tfd
    
    n = tfd.Normal(0., 1.)
    s = n.sample(100)
    y = s**2
    sess = tf.Session()  # Don't actually do this -- use context manager
    print(sess.run(y))
    # ==> vector of 100 squared random normal values
    

    我们在 tensorflow_probability 也有一些很酷的工具来做你在这里开车的那种东西 . 即 Bijector API,有点简单, trainable_distributions API .

    (另一个小问题:我建议使用 tf.nn.softplus ,或者至少 tf.log1p(tf.exp(x)) 而不是 tf.log(1.0 + tf.exp(x)) . 后者由于浮点不精确而具有较差的数值属性,前者被优化用于) .

    希望这是一些帮助!

相关问题