Тензор потока: эффективный запуск одного и того же вычислительного графа с различными случайными выборками

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

Есть ли способ запустить один и тот же граф с разными случайными выборками, используя как можно больше промежуточных вычислений?

Возможные решения:

  • создать график и случайную величину внутри цикла. Con: создает избыточные копии величин, которые не зависят от случайной величины.
  • Расширьте случайную переменную размерностью пакета. Против: немного громоздко. Похоже, что-то, что TF должен уметь делать автоматически.
  • Может быть, редактор графиков (в.contrib) можно использовать для создания копий с другим шумом, но я не уверен, что это лучше, чем зацикливание.
  • В идеале должна быть операция, которая переоценивает случайную переменную или помечает зависимость как невыполненную, заставляя ее выбрать новое количество. Но это вполне может быть невозможным.

Пример стратегии зацикливания:

import tensorflow as tf
x = tf.Variable(1.)
g = []
f = lambda x: tf.identity(x) #op not depending on noise 
for i in range(10):
    a = tf.random_normal(()) # random variable
    y = tf.pow(f(x)+a*x, 2) # quantity to be repeated for diff samples
    g += [y]

#here, the mean is the quantity of interest
m = tf.reduce_mean(g)

#the variance demonstrates that the samples are different
v = tf.reduce_mean(tf.map_fn(lambda x: tf.square(x-m), tf.stack(g)))

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(g))
    print('variance: {}'.format(sess.run(v)))

если f(x) это дорогая функция, я могу только предположить, что цикл будет делать много лишних вычислений.

0 ответов

Другие вопросы по тегам