我有一个张量列表和列表,表示它们的概率质量函数。我如何运行每个会话告诉tensorflow根据概率质量函数随机选择一个张量。
我看到几种可行的方法:
一个是排名第一的张量列表,并选择一个带片和&amp ;;基于张量流变量I的挤压将分配正确的索引。这种方法的性能损失是什么? tensorflow会评估其他不需要的张量吗?
另一个是以与之前类似的方式使用tf.case,我从中选择了一个张量。同样的问题 - >由于我计划每个图表运行中有相当多的(~100s)条件语句,因此性能损失是什么。
有没有更好的方法呢?
答案 0 :(得分:6)
我认为你应该使用tf.multinomial(logits, num_samples)
。
说你有:
[batch_size, num_features]
[batch_size]
您想要输出:
[1, num_features]
batch_tensors = tf.constant([[0., 1., 2.], [3., 4., 5.]]) # shape [batch_size, num_features]
probabilities = tf.constant([0.7, 0.3]) # shape [batch_size]
# we need to convert probabilities to log_probabilities and reshape it to [1, batch_size]
rescaled_probas = tf.expand_dims(tf.log(probabilities), 0) # shape [1, batch_size]
# We can now draw one example from the distribution (we could draw more)
indice = tf.multinomial(rescaled_probas, num_samples=1)
output = tf.gather(batch_tensors, tf.squeeze(indice, [0]))
因为我计划每个图表运行有相当多的(~100s)条件语句,所以性能损失是什么?
如果要进行多次绘制,则应通过增加参数num_samples
在一次运行中执行此操作。然后,您可以使用num_samples
一次性收集这些tf.gather
个示例。