TensorFlow中的采样Bernoulli随机变量

TensorFlow中的采样Bernoulli随机变量,tensorflow,Tensorflow,给定一个包含伯努利分布均值的一维张量,如何用给定均值对相应的一维张量采样 TensorFlow似乎只实现了random\u normal和random\u uniform功能。我可以用一些复杂的东西,比如: tf.ceil(tf.sub(tf.random_uniform((1, means.get_shape()[0])),means)) 但是ceil函数在TensorFlow中没有定义梯度。您可以使用tf。选择,这是可微的 means = tf.constant([.3,.8]) a =

给定一个包含伯努利分布均值的一维张量,如何用给定均值对相应的一维张量采样

TensorFlow似乎只实现了
random\u normal
random\u uniform
功能。我可以用一些复杂的东西,比如:

tf.ceil(tf.sub(tf.random_uniform((1, means.get_shape()[0])),means))

但是
ceil
函数在TensorFlow中没有定义梯度。

您可以使用
tf。选择
,这是可微的

means = tf.constant([.3,.8])
a = tf.select(tf.random_uniform([1, 2])- means > 0.5, tf.ones([1,2]), tf.zeros([1,2]))
with tf.Session(''): a.eval()

自TFr1.0以来,
tf.select
被弃用,取而代之的是
tf.where
。此外,@keveman给出的答案应将均匀随机抽样与<0、大于0.5或大于0进行比较:

    means = tf.constant([.3,.8])
    sample = tf.where(tf.random_uniform([1, 2]) - means < 0, 
      tf.ones([1,2]), tf.zeros([1,2]))
    with tf.Session(''): sample.eval()
means=tf.常数([.3,8])
样本=tf,其中(tf.random_uniform([1,2])-表示<0,
tf.one([1,2]),tf.zero([1,2]))
使用tf.Session(“”):sample.eval()
以下技巧也是从伯努利分布中取样的一种方法:

tf.nn.relu(tf.sign(means - tf.random_uniform(tf.shape(means))))

特选作品!条件不应该是>0而不是>0.5吗?
tf.select
tf.cond
可以是可微的,但是
tf.random\u uniform
op说它是不可微的。这是否使得该控件中的选择或分支不可微?显然,此版本在反向传播时将梯度归零。不过,它比一个
tanh
或sigmoid要快得多。