张量流中的加权随机张量选择

时间:2016-06-10 22:29:13

标签: tensorflow

我有一个张量列表和列表,表示它们的概率质量函数。我如何运行每个会话告诉tensorflow根据概率质量函数随机选择一个张量。

我看到几种可行的方法:

一个是排名第一的张量列表,并选择一个带片和&amp ;;基于张量流变量I的挤压将分配正确的索引。这种方法的性能损失是什么? tensorflow会评估其他不需要的张量吗?

另一个是以与之前类似的方式使用tf.case,我从中选择了一个张量。同样的问题 - >由于我计划每个图表运行中有相当多的(~100s)条件语句,因此性能损失是什么。

有没有更好的方法呢?

1 个答案:

答案 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个示例。