Тензор потока: эффективный запуск одного и того же вычислительного графа с различными случайными выборками
В 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)
это дорогая функция, я могу только предположить, что цикл будет делать много лишних вычислений.