2016-06-10 3 views
1

У меня есть список тензоров и список, представляющий их функцию масс вероятности. Как я могу запускать каждый сеанс, чтобы тензорный поток случайно выбирал один тензор в соответствии с функцией массы вероятности.Взвешенный случайный тензор выбирается в тензорном потоке

Я вижу несколько возможных способов сделать это:

Один списка тензоров ранга высшей упаковкой, а также выбрать один с ломтиком & отжимает на основе tensorflow переменного я собираюсь назначить правильный индекс. Каким будет штраф за выполнение этого подхода? Будет ли тензорный поток оценивать другие, необ зательные тензоры?

Другой использует tf.case аналогичным образом, как и раньше, со мной выбирает один тензор из многих. Тот же вопрос -> Какое ограничение производительности, так как я планирую иметь довольно много условных операторов (~ 100) на один график.

Есть ли лучший способ сделать это?

ответ

5

Я думаю, вы должны использовать tf.multinomial(logits, num_samples).

Скажем, у вас есть:

  • партия тензоров формы [batch_size, num_features]
  • распределение вероятностей формы [batch_size]

Вы хотите вывести:

  • 1 пример из партия тензоров, формы [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.

Смежные вопросы