TensorFlow中的采样Bernoulli随机变量
给定一个包含伯努利分布均值的一维张量,如何用给定均值对相应的一维张量采样 TensorFlow似乎只实现了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 =
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要快得多。