Random Tensorflow:使用不同的随机样本高效运行相同的计算图

Random Tensorflow:使用不同的随机样本高效运行相同的计算图,random,tensorflow,automatic-differentiation,Random,Tensorflow,Automatic Differentiation,在Tensorflow中,可以使计算图依赖于随机变量。在随机变量表示分布中的单个样本的情况下,可以使用N个单独的样本计算数量,例如,进行方差较小的样本估计 有没有办法用不同的随机样本运行同一个图,尽可能多地重用中间计算 可能的解决办法: 在循环中创建图形和随机变量。缺点:对不依赖于随机变量的量进行冗余复制 使用批次维度扩展随机变量。缺点:有点麻烦。似乎TF应该能够自动执行某些操作 也许图形编辑器(in.contrib)可以用来制作不同噪音的副本,但我不确定这是否比循环更好 理想情况下,应该有一

在Tensorflow中,可以使计算图依赖于随机变量。在随机变量表示分布中的单个样本的情况下,可以使用N个单独的样本计算数量,例如,进行方差较小的样本估计

有没有办法用不同的随机样本运行同一个图,尽可能多地重用中间计算

可能的解决办法:

  • 在循环中创建图形和随机变量。缺点:对不依赖于随机变量的量进行冗余复制
  • 使用批次维度扩展随机变量。缺点:有点麻烦。似乎TF应该能够自动执行某些操作
  • 也许图形编辑器(in.contrib)可以用来制作不同噪音的副本,但我不确定这是否比循环更好
  • 理想情况下,应该有一个op来重新评估随机变量或将依赖性标记为未实现,迫使它取样一个新数量。但这很可能是不可能的
循环策略示例:

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)
是一个昂贵的函数,我只能假设循环将进行大量冗余计算。

“用批处理维度扩展随机变量”是正确的答案。如果您不想手动批处理事情,您可以尝试pfor“用批处理维度扩展随机变量”。这是正确的答案。如果不想手动批处理,可以尝试pfor