Tensorflow 基于张量流中随机变量的张量采样

Tensorflow 基于张量流中随机变量的张量采样,tensorflow,probability,sampling,Tensorflow,Probability,Sampling,是否有可能从依赖于tensorflow中随机变量的张量中获取样本?我需要得到一个近似的样本分布,用于优化损失函数。具体来说,在下面的示例中,我希望能够获得Y_输出的样本,以便能够计算输出分布的均值和方差,并在损失函数中使用这些参数 def sample_weight(mean, phi, seed=1): P_epsilon = tf.distributions.Normal(loc=0., scale=1.0) epsilon_s = P_epsilon.sample([1])

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

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})

不确定这是否回答了您的问题,但是:当您在采样
Op
的下游有一个
Tensor
时(例如,调用
p_epsilon.sample([1])创建的
Op
,无论何时调用
sess.run
在下游的
Tensor
上运行,示例op都将重新运行,并生成一个新的随机值。示例:

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\u probability
中也有一些很酷的工具来做你在这里要做的事情。即
Bijector
API和稍微简单一点的
trainable\u分布
API

(另一个小点:我建议使用
tf.nn.softplus
,或者至少使用
tf.log1p(tf.exp(x))
而不是
tf.log(1.0+tf.exp(x))
。后者由于浮点不精确,数值属性较差,前者对此进行了优化)


希望这是一些帮助!

嗨,Chris,谢谢你的反馈和建议。我知道连续使用run函数将产生不同的随机样本。但是,我希望在成本函数中使用这种功能,在成本函数中有多个依赖于N个随机样本的项。可能使用可训练的d分布可能会有所帮助,但如果能够设置一个成本函数来使用概率网络中的多个样本,那就太好了。如果您每次都想在成本函数中使用相同的样本,我认为您有3个选择:1.Do
samples\uuz=sess.run(samples)
然后使用结果
采样
下游2.使用3.使用
变量
tf.分配
将变量设置为采样结果;然后只有在运行分配操作时才会进行重采样