我正在研究NN的概率模型,该模型需要绘制权重的随机样本并使用成本函数期望的误差更新概率模型(因此我基本上使用蒙特卡罗对成本分布进行抽样)样本)。这意味着我必须向前传递NN x次以获得不同的权重样本,计算成本的期望并最终反向传播期望的误差(全部在同一次运行中)。 以下是我想要做的简化示例:
w = tf.Variable(1.0) # the weights of the NN
u = tf.random_uniform([1]) # Random generator
cost = tf.mul(w,u)
# here I wish to take 10 MC samples
for i in range(9):
# this is the part which I dont know how to implement
cost = tf.add(cost,new_cost_sample)
cost_mean = cost/10.0
train = tf.train.GradientDescentOptimizer(lrate).minimize(cost_mean)
with tf.Session() as sess:
tf.initialize_all_variables().run()
sess.run(train)
new_cost_sample
应该是权重变量w
与统一分布中的另一个随机抽样数u
相乘的结果。
由于Tensorflow在同一个正向传递过程中存储了运算符的值,因此我不能多次调用cost
op。我可以使用sess.run(cost)
10次并计算其期望值,但之后我不知道如何将此错误提供给训练操作。
还有可能为随机生成器使用占位符然后将它们提供给网络,但这对于大NN需要大量空间而我不认为这将是最优雅/最有效的方法实现这一点。
是否有方法告诉操作员在同一次运行中重新计算其值?您能想到实现这一目标的有效方法吗? 谢谢!
答案 0 :(得分:0)
我不会使用for循环来计算cost_mean
;它效率不高。相反,我宁愿使用矢量化实现来计算tf.reduce_mean()
的平均值:
w = tf.Variable(1.0) # the weights of the NN
u = tf.random_uniform([10]) # Random generator
cost = tf.mul(w, u)
cost_mean = tf.reduce_mean(cost)